发明名称 一种三维人脸动画的控制方法
摘要 本发明公开了一种三维人脸动画的控制方法,其特征在于,包括以下步骤:获取三维人脸特征网络模型;对所得的三维人脸特征网络模型进行功能区划分;根据区域划分设置运动控制点并计算控制点对三维人脸特征模型运动的影响;通过驱动控制点的运动,来驱动三维人脸特征网络模型的运动,模拟真实的脸部运动。该方法能克服现有技术所存在的缺陷,能根据各种表情需要对三维人脸模型变形,使三维人脸表现出真实感强的表情动画。
申请公布号 CN101739709A 申请公布日期 2010.06.16
申请号 CN200910263557.3 申请日期 2009.12.24
申请人 四川大学 发明人 章毅;王平安;郑伯川;吕建成;张蕾;彭德中;于佳丽;张海仙
分类号 G06T15/00(2006.01)I;G06T15/70(2006.01)I;G06T17/00(2006.01)I 主分类号 G06T15/00(2006.01)I
代理机构 代理人
主权项 1.一种三维人脸动画的控制方法,其特征在于,包括以下步骤:步骤1获取三维人脸特征网络模型将具体的三维人脸特征信息网格化到基准三维人脸模型,得到三维人脸特征网络模型;步骤2对步骤1所得的三维人脸特征网络模型进行功能区划分对人脸肌肉进行受力分析后根据各功能区的运动特性进行区域划分,划分为扇形区域、椭球形区域、下巴和眼睛,其中椭球形区域对应嘴巴周围,用来生成嘴巴所能产生的各种形状,扇形区域配置在人脸其他区域,用来生成各种普通的人脸动作;步骤3根据区域划分设置运动控制点并计算控制点对三维人脸特征模型运动的影响:①扇形区域:参考弹簧模型,给扇形区域内的每个点设定一个质量M、一个阻尼系数D,x<sub>i</sub>是区域内的任意点,<img file="F2009102635573C00011.GIF" wi="124" he="82" />构成区域配置向量,<img file="F2009102635573C00012.GIF" wi="70" he="57" />和R<sub>i</sub>用来确定区域的大小,l<sub>ji</sub>是x<sub>i</sub>到m<sub>j</sub><sup>A</sup>的距离,扇形区域的拉扯方向为<img file="F2009102635573C00013.GIF" wi="145" he="81" />在这个区域里面的所有点都会由于区域内的向量<img file="F2009102635573C00014.GIF" wi="123" he="82" />的拉动而产生移动,但是离<img file="F2009102635573C00015.GIF" wi="123" he="81" />越远的点,移动就越小,再设置一个长度因子λ<sub>ij</sub><maths num="0001"><![CDATA[<math><mrow><mo>(</mo><msub><mi>&lambda;</mi><mi>ij</mi></msub><mo>=</mo><mfrac><msub><mi>l</mi><mi>ij</mi></msub><mrow><mo>|</mo><msubsup><mi>m</mi><mi>j</mi><mi>A</mi></msubsup><mo>-</mo><msubsup><mi>m</mi><mi>j</mi><mi>I</mi></msubsup><mo>|</mo></mrow></mfrac><mo>)</mo></mrow></math>]]></maths>和角度因子<img file="F2009102635573C00017.GIF" wi="309" he="158" />扇形区域内的点的受力公式为:<maths num="0002"><![CDATA[<math><mrow><msub><mi>f</mi><mi>ji</mi></msub><mo>=</mo><mi>a</mi><msub><mi>&theta;</mi><mn>1</mn></msub><mrow><mo>(</mo><msub><mi>&lambda;</mi><mi>ij</mi></msub><mo>)</mo></mrow><msub><mi>&theta;</mi><mn>2</mn></msub><mrow><mo>(</mo><msub><mi>&gamma;</mi><mi>ij</mi></msub><mo>)</mo></mrow><mfrac><mrow><mo>(</mo><msubsup><mi>m</mi><mi>j</mi><mi>A</mi></msubsup><mo>-</mo><msub><mi>x</mi><mi>i</mi></msub><mo>)</mo></mrow><mrow><mo>|</mo><msubsup><mi>m</mi><mi>j</mi><mi>A</mi></msubsup><mo>-</mo><msub><mi>x</mi><mi>i</mi></msub><mo>|</mo></mrow></mfrac></mrow></math>]]></maths>其中α是扇形区域的收缩率,而x<sub>i</sub>是影响区域内的点,且影响因子函数θ<sub>1</sub>和θ<sub>2</sub>为:<img file="F2009102635573C00019.GIF" wi="800" he="284" /><img file="F2009102635573C000110.GIF" wi="511" he="126" />0≤γ<sub>ij</sub>≤1,其中<maths num="0003"><![CDATA[<math><mrow><msub><mi>&delta;</mi><mi>j</mi></msub><mo>=</mo><mfrac><msub><mi>R</mi><mi>j</mi></msub><mrow><mo>|</mo><msubsup><mi>m</mi><mi>j</mi><mi>A</mi></msubsup><mo>-</mo><msubsup><mi>m</mi><mi>j</mi><mi>I</mi></msubsup><mo>|</mo></mrow></mfrac><mo>.</mo></mrow></math>]]></maths>根据牛顿定律,得到每个点的力平衡公式:<maths num="0004"><![CDATA[<math><mrow><mi>M</mi><mfrac><mrow><msup><mi>d</mi><mn>2</mn></msup><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow></mrow><msup><mi>dt</mi><mn>2</mn></msup></mfrac><mo>+</mo><mfrac><mrow><mi>dx</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow></mrow><mi>dt</mi></mfrac><mo>=</mo><msub><mi>F</mi><mi>mus</mi></msub></mrow></math>]]></maths>在该微分方程进行计算机模拟计算的时候,采用Euler-Cromer方法:<maths num="0005"></maths>②椭球形区域:对于椭球形区域内点的移动,采用中心距离位移调节法,对于任意在区内的点v=(x,y,z),计算出<maths num="0006"><![CDATA[<math><mrow><mover><mi>dist</mi><mo>&RightArrow;</mo></mover><mo>=</mo><mrow><mo>(</mo><mi>v</mi><mo>-</mo><mi>o</mi><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>然后对<img file="F2009102635573C00024.GIF" wi="76" he="57" />的各个分量进行对应,用来计算移动后的点坐标v′<img file="F2009102635573C00025.GIF" wi="800" he="110" />其中<maths num="0007"><![CDATA[<math><mrow><mi>&delta;</mi><mo>=</mo><msqrt><msup><mi>x</mi><mn>2</mn></msup><mo>/</mo><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><msup><mi>z</mi><mn>2</mn></msup><mo>/</mo><msup><mi>c</mi><mn>2</mn></msup></msqrt><mo>,</mo></mrow></math>]]></maths>xz分别为<img file="F2009102635573C00027.GIF" wi="75" he="56" />的x分量和z分量,a,b,c为椭球在三个轴上的半径;③下巴:下巴的动作采用旋转方法,对该区域内的点进行旋转,利用绕三维空间的任意一条线的旋转复合矩阵R:<maths num="0008"><![CDATA[<math><mrow><mi>R</mi><mrow><mo>(</mo><mi>&theta;</mi><mo>)</mo></mrow><mo>=</mo><msup><mi>T</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup><mo>.</mo><msubsup><mi>R</mi><mi>x</mi><mrow><mo>-</mo><mn>1</mn></mrow></msubsup><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mo>.</mo><msubsup><mi>R</mi><mi>y</mi><mrow><mo>-</mo><mn>1</mn></mrow></msubsup><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mo>.</mo><msub><mi>R</mi><mi>z</mi></msub><mrow><mo>(</mo><mi>&theta;</mi><mo>)</mo></mrow><mo>.</mo><msub><mi>R</mi><mi>y</mi></msub><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mo>.</mo><msub><mi>R</mi><mi>x</mi></msub><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mo>.</mo><mi>T</mi></mrow></math>]]></maths>其中,α、β和θ为XYZ三个方向的旋转角度,<maths num="0009"><![CDATA[<math><mrow><mi>T</mi><mo>=</mo><mfenced open='(' close=')'><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd><mtd><mo>-</mo><msub><mi>y</mi><mn>1</mn></msub></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd><mtd><mo>-</mo><msub><mi>z</mi><mn>1</mn></msub></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></mrow></math>]]></maths><maths num="0010"><![CDATA[<math><mrow><msub><mi>R</mi><mi>y</mi></msub><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='(' close=')'><mtable><mtr><mtd><mi>cos</mi><mi>&alpha;</mi></mtd><mtd><mn>0</mn></mtd><mtd><mo>-</mo><mi>sin</mi><mi>&alpha;</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mi>sin</mi><mi>&alpha;</mi></mtd><mtd><mn>0</mn></mtd><mtd><mi>cos</mi><mi>&alpha;</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></mrow></math>]]></maths><maths num="0011"><![CDATA[<math><mrow><msub><mi>R</mi><mi>x</mi></msub><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='(' close=')'><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mi>cos</mi><mi>&alpha;</mi></mtd><mtd><mo>-</mo><mi>sin</mi><mi>&alpha;</mi></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mi>sin</mi><mi>&alpha;</mi></mtd><mtd><mi>cos</mi><mi>&alpha;</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></mrow></math>]]></maths><maths num="0012"><![CDATA[<math><mrow><msub><mi>R</mi><mi>z</mi></msub><mrow><mo>(</mo><mi>&theta;</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='(' close=')'><mtable><mtr><mtd><mi>cos</mi><mi>&theta;</mi></mtd><mtd><mo>-</mo><mi>sin</mi><mi>&theta;</mi></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mi>sin</mi><mi>&theta;</mi></mtd><mtd><mi>cos</mi><mi>&theta;</mi></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></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></mrow></math>]]></maths>下巴越往上的区域受旋转影响的效果就越小,为顶点设置一个权重,把下巴分为三个区域分别为<img file="F2009102635573C00031.GIF" wi="275" he="38" />值的设置方式为:<img file="F2009102635573C00032.GIF" wi="702" he="406" />p.x,p1.x和p2.x分别为点p,p1和p2的坐标的x分量,对于空间内的任何一个点P,它位移后的点的坐标p′<sub>i</sub>为:p′=R(θ)*p*weight;④眼睛:眼睛的运动包括眨眼和眼球的转动,其中眼球的动作采用旋转的方法,以眼球中心cen做为放心转中心,旋转方法为:P′=p*R<sub>x</sub>(α)*R<sub>y</sub>(β)其中R<sub>x</sub>(α),R<sub>y</sub>(β)分别是X和Y方向上的旋转矩阵,α和β是旋转方向在X和Y方向上的分量;眨眼的动作采用分层控制的方法,选中上眼皮的几层点,把每一竖排点做为一个区域l<sub>i</sub>(i=1,2………13),共13个区域,每一个区域的最下面一层点做为控制点p<sub>i</sub>(i=1,2………13),共13个控制,每一个控制点又对应下眼皮上的一个点d<sub>i</sub>(i=1,2………13)做为其目的地,定义了<maths num="0013"><![CDATA[<math><mrow><msub><mi>u</mi><mi>i</mi></msub><mo>=</mo><mfrac><mrow><msub><mi>p</mi><mi>i</mi></msub><mo>-</mo><msub><mi>d</mi><mi>i</mi></msub></mrow><mn>1024</mn></mfrac><mrow><mo>(</mo><mi>i</mi><mo>=</mo><mn>1,2</mn><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mn>13</mn><mo>)</mo></mrow><mo>,</mo></mrow></math>]]></maths>对于控制点p<sub>i</sub>移动后的坐标p′<sub>i</sub>为:p′<sub>i</sub>=p<sub>i</sub>+u<sub>i</sub>*val其中val为眨眼控制变量;步骤4设置基本口型,根据时间点来播放相对应的口形:①根据口形文件,载入各个基本口形;②读取当前时间应该播放的口形号;③根据口形号读取各条肌肉的contraction值;④如果设置了当前应该播放的表情,则利用表情、口形合成公式,生成各条肌肉的对应contraction值,否则跳过;⑤根据各条肌肉的类型调用各自对应的动画方法进行动画操作;⑥利用插值公式生成插值口形;⑦转到步骤④播放插值口形;⑧如果到了下一个口形的播放时间,就转而到步骤②;步骤5设置基本表情,设计表情合成并视频驱动:首先对三维人脸特征模型做动动检测,得到特征点位移,然后利用这些特征点的位移来驱动三维人脸模型,对特征点为x<sub>i</sub>,它对应三维人脸特征模型上的肌肉为m,x<sub>i</sub>产生位移,对应肌肉m的收缩率为α<sub>m</sub>:<maths num="0014"><![CDATA[<math><mrow><msub><mi>&alpha;</mi><mi>m</mi></msub><mo>=</mo><mfrac><mrow><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mi>n</mi></munderover><mo>|</mo><mo>|</mo><mi>&Delta;</mi><msub><mi>x</mi><mi>i</mi></msub><mo>|</mo><mo>|</mo><mo>|</mo><mo>|</mo><mi>&Delta;</mi><msubsup><mi>x</mi><mi>i</mi><mrow><mo>&prime;</mo><mo>&prime;</mo></mrow></msubsup><mo>|</mo><mo>|</mo></mrow><mrow><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mi>n</mi></munderover><mo>|</mo><mo>|</mo><mi>&Delta;</mi><msubsup><mi>x</mi><mi>i</mi><mrow><mo>&prime;</mo><mo>&prime;</mo></mrow></msubsup><mo>|</mo><mo>|</mo><mo>|</mo><mo>|</mo><mi>&Delta;</mi><msubsup><mi>x</mi><mi>i</mi><mrow><mo>&prime;</mo><mo>&prime;</mo></mrow></msubsup><mo>|</mo><mo>|</mo></mrow></mfrac></mrow></math>]]></maths>其中<maths num="0015"><![CDATA[<math><mrow><msubsup><mi>&Delta;x</mi><mi>i</mi><mrow><mo>&prime;</mo><mo>&prime;</mo></mrow></msubsup><mo>=</mo><munder><mrow><mi>&Pi;</mi><msub><mi>&theta;</mi><mi>k</mi></msub></mrow><mrow><mi>k</mi><mo>=</mo><mn>1,2</mn></mrow></munder><mo>,</mo></mrow></math>]]></maths>θ<sub>k</sub>为为扇形区域的长度因子和角度因子函数,对于椭球形区域则为1,Δx<sub>i</sub>为点x<sub>i</sub>的实际位移,这样视频驱动的步骤为:①初始化模型和肌肉配置;②获取人脸特征点检测的结果;③根据特征点的位移,调用上面的收缩率计算方法计算各条对应的肌肉的收缩值;④根据各条肌肉的收缩值,调用相应肌肉类型的动画方法对模型进行驱动;⑤如果视频结束,则结束,否则转向步骤②。
地址 610054 四川省成都市一环路南一段24号