发明名称 三维虚拟服装快速姿态同步方法
摘要 本发明提供了一种三维虚拟服装快速姿态同步方法,其特征在于,具体步骤为:第一步:建立三维人体模型以及虚拟服装模型,第二步:计算虚拟服装模型的受力情况;第三步:姿态同步。本发明的优点是当人体的姿态改变时,服装的姿态实时地随之改变,从而实现各种着装姿态下的人-衣姿态同步。
申请公布号 CN101630417A 申请公布日期 2010.01.20
申请号 CN200910194537.5 申请日期 2009.08.25
申请人 东华大学 发明人 钟跃崎
分类号 G06T15/70(2006.01)I 主分类号 G06T15/70(2006.01)I
代理机构 上海申汇专利代理有限公司 代理人 翁若莹
主权项 1、一种三维虚拟服装快速姿态同步方法,其特征在于,具体步骤为:第一步:分别建立由三角形集合构成的三维人体模型以及虚拟服装模型,虚拟服装模型设于三维人体模型外侧,三维人体模型的三角形的密度为10000个/人,虚拟服装模型的三角形的密度为3000-4000个/件;第二步:第一步建立的虚拟服装模型中每个三角形的顶点为一个质点,三角形的三个边代表一根非线性弹簧,其中第i个顶点P<sub>i</sub>的受力方程为:<maths num="0001"><![CDATA[<math><mrow><mi>f</mi><mo>=</mo><msub><mi>f</mi><mi>i</mi></msub><mo>+</mo><msub><mi>d</mi><mi>i</mi></msub><mo>=</mo><mo>-</mo><mi>k</mi><mfrac><mrow><mo>&PartialD;</mo><mi>C</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow><mrow><mo>&PartialD;</mo><msub><mi>x</mi><mi>i</mi></msub></mrow></mfrac><mi>C</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>k</mi><mi>d</mi></msub><mfrac><mrow><mo>&PartialD;</mo><mi>C</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow><mrow><mo>&PartialD;</mo><msub><mi>x</mi><mi>i</mi></msub></mrow></mfrac><mi>C</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中,f为第i个顶点P<sub>i</sub>所受内力的合力;f<sub>i</sub>和d<sub>i</sub>分别为作用在第i个顶点P<sub>i</sub>上的弹性力和粘性力;i=0,1,2,…n;n为三角形的顶点总数;k为弹簧的虎克常数;k<sub>d</sub>为弹簧的粘性系数;C(x)为与变形能相关的条件函数,C(x)=|x|-L;x为弹簧的瞬时长度;L为弹簧的原长;第三步:姿态同步:步骤3.1、以S<sub>b</sub>表示三维人体模型的表面,以S<sub>g</sub>表示虚拟服装模型的表面,计算在默认姿势下S<sub>g</sub>与三维人体模型间的最短距离矢量集{D},即对于{P|P∈S<sub>g</sub>},找出三维人体模型上的一点Q,满足:<maths num="0002"><![CDATA[<math><mrow><mo>{</mo><mi>Q</mi><mo>|</mo><mi>Q</mi><mo>&Element;</mo><msub><mi>S</mi><mi>b</mi></msub><mo>,</mo><mi>Q</mi><mo>=</mo><munder><mrow><mi>arg</mi><mi>min</mi></mrow><msub><mi>Q</mi><mi>i</mi></msub></munder><mrow><mo>(</mo><mo>|</mo><msub><mi>PQ</mi><mi>i</mi></msub><mo>|</mo><mo>)</mo></mrow><mo>}</mo><mo>,</mo><mi>i</mi><mo>=</mo><mn>0,1,2</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>m</mi><mo>;</mo><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中m为三维人体模型的三角形顶点总数,即Q点为S<sub>b</sub>上到P点距离最近的点;步骤3.2、获得三维人体模型的动画,将动画按照每秒25帧的速度播放,对于每个三维人体模型的新姿态,计算S<sub>b</sub>上的顶点的初步同步位置P<sub>new</sub>如下:P<sub>new</sub>=Q′+R·|PQ|    (3)其中Q′是Q点在新姿态下的位置,R是旋转矩阵,代表Q点的法向从n<sub>old</sub>到n<sub>new</sub>的旋转,计算如下:令旋转角θ=arccos(n<sub>old</sub>·n<sub>new</sub>),r=n<sub>old</sub>×n<sub>new</sub>,则<maths num="0003"><![CDATA[<math><mrow><mi>R</mi><mo>=</mo><mfenced open='[' close=']'><mtable><mtr><mtd><msup><mi>x</mi><mn>2</mn></msup><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>+</mo><mi>c</mi></mtd><mtd><mi>yx</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>+</mo><mi>zs</mi></mtd><mtd><mi>xz</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>-</mo><mi>ys</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mi>xy</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>-</mo><mi>zs</mi></mtd><mtd><msup><mi>y</mi><mn>2</mn></msup><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>+</mo><mi>c</mi></mtd><mtd><mi>yz</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>+</mo><mi>xs</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mi>xz</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>+</mo><mi>ys</mi></mtd><mtd><mi>yz</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>-</mo><mi>xs</mi></mtd><mtd><msup><mi>z</mi><mn>2</mn></msup><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>c</mi><mo>)</mo></mrow><mo>+</mo><mi>c</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>4</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中c=cosθ,s=sinθ;x,y,z分别为旋转向量r的x,y,z分量坐标值,此时新姿态下的虚拟服装模型的表面记为S<sub>g-new</sub>,将新姿态下的三维人体模型的表面记为S<sub>b-new</sub>;步骤3.3、对于{P<sub>new</sub>|P<sub>new</sub>∈S<sub>g-new</sub>},寻找三维人体模型上的一点Q<sub>new</sub>,满足:<maths num="0004"><![CDATA[<math><mrow><mo>{</mo><msub><mi>Q</mi><mi>new</mi></msub><mo>|</mo><msub><mi>Q</mi><mi>new</mi></msub><mo>&Element;</mo><msub><mi>S</mi><mrow><mi>b</mi><mo>-</mo><mi>new</mi></mrow></msub><mo>,</mo><msub><mi>Q</mi><mi>new</mi></msub><mo>=</mo><munder><mrow><mi>arg</mi><mi>min</mi></mrow><msub><mi>Q</mi><mrow><mi>i</mi><mo>-</mo><mi>new</mi></mrow></msub></munder><mrow><mo>(</mo><mo>|</mo><msub><mi>P</mi><mi>new</mi></msub><msub><mi>Q</mi><mrow><mi>i</mi><mo>-</mo><mi>new</mi></mrow></msub><mo>|</mo><mo>)</mo></mrow><mo>}</mo><mo>,</mo><mi>i</mi><mo>=</mo><mn>0,1,2</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>m</mi><mo>,</mo><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>5</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中,m为S<sub>b-new</sub>上的三角形顶点总数,即Q<sub>new</sub>为S<sub>b-new</sub>上距离P<sub>new</sub>最近的点;当P<sub>new</sub>位于S<sub>b</sub>内部,即发生穿透时,将P<sub>new</sub>沿着靠近n的方向旋转90度,即:令<maths num="0005"><![CDATA[<math><mrow><mi>d</mi><mo>=</mo><mfrac><mrow><msub><mi>P</mi><mi>new</mi></msub><msub><mi>Q</mi><mi>new</mi></msub><mo>&times;</mo><mi>n</mi></mrow><mrow><mo>|</mo><msub><mi>P</mi><mi>new</mi></msub><msub><mi>Q</mi><mi>new</mi></msub><mo>&times;</mo><mi>n</mi><mo>|</mo></mrow></mfrac><mo>,</mo></mrow></math>]]></maths>则P′<sub>new</sub>=R′·P<sub>new</sub>,R′为旋转矩阵:<maths num="0006"><![CDATA[<math><mrow><msup><mi>R</mi><mo>&prime;</mo></msup><mo>=</mo><mfenced open='[' close=']'><mtable><mtr><mtd><msup><mi>x</mi><mn>2</mn></msup></mtd><mtd><mi>yx</mi><mo>+</mo><mi>z</mi></mtd><mtd><mi>xz</mi><mo>-</mo><mi>y</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mi>xy</mi><mo>-</mo><mi>z</mi></mtd><mtd><msup><mi>y</mi><mn>2</mn></msup></mtd><mtd><mi>yz</mi><mo>+</mo><mi>x</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mi>xz</mi><mo>+</mo><mi>y</mi></mtd><mtd><mi>yz</mi><mo>-</mo><mi>x</mi></mtd><mtd><msup><mi>z</mi><mn>2</mn></msup></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>6</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中x,y,z分别为旋转向量d的x,y,z分量坐标值;步骤3.4、将虚拟服装模型进行悬垂以及平滑处理:计算在已知时间t<sub>0</sub>下位置x(t<sub>0</sub>)和速度<img file="A2009101945370003C5.GIF" wi="96" he="65" />时,求解时刻t<sub>0</sub>+Δt时的位置x(t<sub>0</sub>+Δt)和速度<img file="A2009101945370003C6.GIF" wi="214" he="64" />Δt为时间步长,即求解下述微分方程:<maths num="0007"><![CDATA[<math><mrow><mfrac><mi>d</mi><mi>dt</mi></mfrac><mfenced open='(' close=')'><mtable><mtr><mtd><mi>x</mi></mtd></mtr><mtr><mtd><mo>&CenterDot;</mo></mtd></mtr><mtr><mtd><mi>x</mi></mtd></mtr></mtable></mfenced><mo>=</mo><mfrac><mi>d</mi><mi>dt</mi></mfrac><mfenced open='(' close=')'><mtable><mtr><mtd><mi>x</mi></mtd></mtr><mtr><mtd><mi>v</mi></mtd></mtr></mtable></mfenced><mo>=</mo><mfenced open='(' close=')'><mtable><mtr><mtd><mi>v</mi></mtd></mtr><mtr><mtd><msup><mi>M</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>v</mi><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>7</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中,M为服装模型质量矩阵,f为服装模型的合力矩阵,x<sub>0</sub>=x(t<sub>0</sub>),v<sub>0</sub>=v(t<sub>0</sub>),位移增量Δx=x(t<sub>0</sub>+Δt)和速度增量Δv=v(t<sub>0</sub>+Δt)-v(t<sub>0</sub>),对上述微分方程采用一阶向后欧拉积分:<maths num="0008"><![CDATA[<math><mrow><mfenced open='(' close=')'><mtable><mtr><mtd><mi>&Delta;x</mi></mtd></mtr><mtr><mtd><mi>&Delta;v</mi></mtd></mtr></mtable></mfenced><mo>=</mo><mi>&Delta;t</mi><mfenced open='(' close=')'><mtable><mtr><mtd><msub><mi>v</mi><mn>0</mn></msub><mo>+</mo><mi>&Delta;v</mi></mtd></mtr><mtr><mtd><msup><mi>M</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mi>f</mi><mrow><mo>(</mo><msub><mi>x</mi><mn>0</mn></msub><mo>+</mo><mi>&Delta;x</mi><mo>,</mo><msub><mi>v</mi><mn>0</mn></msub><mo>+</mo><mi>&Delta;v</mi><mo>)</mo></mrow></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>8</mn><mo>)</mo></mrow></mrow></math>]]></maths>对于式(8)所给出的非线性方程,将f以泰勒级数方式展开得到其一阶近似:<maths num="0009"><![CDATA[<math><mrow><mi>f</mi><mrow><mo>(</mo><msub><mi>x</mi><mn>0</mn></msub><mo>+</mo><mi>&Delta;x</mi><mo>,</mo><msub><mi>v</mi><mn>0</mn></msub><mo>+</mo><mi>&Delta;v</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>f</mi><mn>0</mn></msub><mo>+</mo><mfrac><mrow><mo>&PartialD;</mo><mi>f</mi></mrow><mrow><mo>&PartialD;</mo><mi>x</mi></mrow></mfrac><mi>&Delta;x</mi><mo>+</mo><mfrac><mrow><mo>&PartialD;</mo><mi>f</mi></mrow><mrow><mo>&PartialD;</mo><mi>v</mi></mrow></mfrac><mi>&Delta;v</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>9</mn><mo>)</mo></mrow></mrow></math>]]></maths>将(9)式代入(8)式整理可得:<maths num="0010"><![CDATA[<math><mrow><mrow><mo>(</mo><mi>I</mi><mo>-</mo><mi>&Delta;t</mi><msup><mi>M</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mfrac><mrow><mo>&PartialD;</mo><mi>f</mi></mrow><mrow><mo>&PartialD;</mo><mi>v</mi></mrow></mfrac><mo>-</mo><mi>&Delta;</mi><msup><mi>t</mi><mn>2</mn></msup><msup><mi>M</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mfrac><mrow><mo>&PartialD;</mo><mi>f</mi></mrow><mrow><mo>&PartialD;</mo><mi>x</mi></mrow></mfrac><mo>)</mo></mrow><mi>&Delta;v</mi><mo>=</mo><mi>&Delta;t</mi><msup><mi>M</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mrow><mo>(</mo><msub><mi>f</mi><mn>0</mn></msub><mo>+</mo><mi>&Delta;t</mi><mfrac><mrow><mo>&PartialD;</mo><mi>f</mi></mrow><mrow><mo>&PartialD;</mo><mi>x</mi></mrow></mfrac><msub><mi>v</mi><mn>0</mn></msub><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>10</mn><mo>)</mo></mrow></mrow></math>]]></maths>Δx=Δt(v<sub>0</sub>+Δv)    (11)其中,I为单位阵,采用共轭梯度法首先求解式(10)中的f<sub>0</sub>,<img file="A2009101945370004C3.GIF" wi="107" he="37" />以及<img file="A2009101945370004C4.GIF" wi="131" he="40" />从而得到Δv,然后更新x和v,即可得到服装在时刻t<sub>0</sub>+Δt时的位置和速度,这个位置即为该边上两个顶点经悬垂处理后的位置,在求解过程中,初始速度v<sub>0</sub>为0,初始位置x<sub>0</sub>即为步骤3.3完成后的位置;若在一个时间步长Δt过后,|x<sub>0</sub>(t+Δt)-x<sub>1</sub>(t+Δt)|>ε|x<sub>0</sub>(t)-x<sub>1</sub>(t)|,ε<sub>a</sub>=1%,ε<sub>a</sub>为允许应变的阈值,采用速度过滤的方法进行纠正如下:在时刻t时,用欧拉积分预先计算Δt后三角形顶点的位置:x<sub>0</sub>(t+Δt)=x<sub>0</sub>(t)+v<sub>0</sub>(t)·Δt    (12)x<sub>1</sub>(t+Δt)=x<sub>1</sub>(t)+v<sub>1</sub>(t)·Δt    (13)其中x<sub>0</sub>和x<sub>1</sub>分别是三角形一条边上两个顶点的位置,在时刻t+Δt时,如果应变<maths num="0011"><![CDATA[<math><mrow><mi>&epsiv;</mi><mo>=</mo><mfrac><mrow><mo>|</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mi>&Delta;t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mi>&Delta;t</mi><mo>)</mo></mrow><mo>|</mo></mrow><mrow><mo>|</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>|</mo></mrow></mfrac><mo>></mo><mn>1</mn><mo>%</mo><mo>,</mo></mrow></math>]]></maths>则这两个三角形顶点的速度在t时刻应被调节如下:<maths num="0012"><![CDATA[<math><mrow><msubsup><mi>v</mi><mn>0</mn><mi>new</mi></msubsup><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>=</mo><mo>[</mo><msubsup><mi>x</mi><mn>0</mn><mi>new</mi></msubsup><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mi>&Delta;t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>]</mo><mo>/</mo><mi>&Delta;t</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>14</mn><mo>)</mo></mrow></mrow></math>]]></maths><maths num="0013"><![CDATA[<math><mrow><msubsup><mi>v</mi><mn>1</mn><mi>new</mi></msubsup><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>=</mo><mo>[</mo><msubsup><mi>x</mi><mn>1</mn><mi>new</mi></msubsup><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mi>&Delta;t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>]</mo><mo>/</mo><mi>&Delta;t</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>15</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中x<sub>0</sub><sup>new</sup>(t+Δt)和x<sub>1</sub><sup>new</sup>(t+Δt)是满足ε=1%时的新位置,这个位置即为该边上两个顶点经平滑处理后的位置,<maths num="0014"><![CDATA[<math><mrow><msubsup><mi>x</mi><mn>0</mn><mi>new</mi></msubsup><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mi>&Delta;t</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>+</mo><mfrac><mrow><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow></mrow><mrow><mo>|</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>|</mo></mrow></mfrac><mrow><mo>(</mo><mn>1</mn><mo>&PlusMinus;</mo><msub><mi>&epsiv;</mi><mi>s</mi></msub><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths><maths num="0015"><![CDATA[<math><mrow><msubsup><mi>x</mi><mn>1</mn><mi>new</mi></msubsup><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mi>&Delta;t</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>+</mo><mfrac><mrow><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow></mrow><mrow><mo>|</mo><msub><mi>x</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><msub><mi>x</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>|</mo></mrow></mfrac><mrow><mo>(</mo><mn>1</mn><mo>&PlusMinus;</mo><msub><mi>&epsiv;</mi><mi>s</mi></msub><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>其中的±在过度伸长时取+,过度压缩时取-。
地址 201620上海市松江区人民北路2999号