发明名称 一种面向网格动画序列针对顶点轨迹分量降维的方法
摘要 本发明公开了一种面向网格动画序列针对顶点轨迹分量降维的方法。本发明首先利用PCA分析找到模型运动的主要方向,并将所有顶点坐标在该方向上进行投影,得到新的坐标值,然后在三个新坐标轴方向分别构建轨迹矩阵,分别执行第二次PCA降维。本发明有效地提升了数据压缩效率。
申请公布号 CN104680566B 申请公布日期 2016.04.20
申请号 CN201510057262.6 申请日期 2015.02.04
申请人 浙江工商大学 发明人 杨柏林;金剑秋;王勋;江照意;王雅娟
分类号 G06T13/00(2011.01)I 主分类号 G06T13/00(2011.01)I
代理机构 浙江杭州金通专利事务所有限公司 33100 代理人 王佳健
主权项 一种面向网格动画序列针对顶点轨迹分量降维的方法,其特征在于该方法包括如下步骤:在服务器端导入网格动画序列A(M<sub>1</sub>,M<sub>2</sub>,...,M<sub>F</sub>),其中M<sub>l</sub>,l∈[1,F]表示每帧对应的静态网格模型,其顶点个数均为N,F表示该网格动画的帧数;1)计算所有顶点轨迹的中心点,构造该网格动画的中心点坐标矩阵;在网格动画序列为A(M<sub>1</sub>,M<sub>2</sub>,...,M<sub>F</sub>)中M<sub>i</sub>,i∈[1,F]表示每帧对应的静态网格模型,其顶点坐标矩阵为:<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mi>M</mi><mi>i</mi></msub><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mi>i</mi><mprescripts/><mi>x</mi><none/></mmultiscripts></mrow></mtd><mtd><mrow><mo>...</mo><mo>...</mo></mrow></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mi>i</mi><mprescripts/><mi>x</mi><none/></mmultiscripts></mrow></mtd></mtr><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mi>i</mi><mprescripts/><mi>y</mi><none/></mmultiscripts></mrow></mtd><mtd><mrow><mo>...</mo><mo>...</mo></mrow></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mi>i</mi><mprescripts/><mi>y</mi><none/></mmultiscripts></mrow></mtd></mtr><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mi>i</mi><mprescripts/><mi>z</mi><none/></mmultiscripts></mrow></mtd><mtd><mrow><mo>...</mo><mo>...</mo></mrow></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mi>i</mi><mprescripts/><mi>z</mi><none/></mmultiscripts></mrow></mtd></mtr></mtable></mfenced></mrow> ]]></math><img file="FDA0000920285440000011.TIF" wi="499" he="245" /></maths>其中<img file="FDA0000920285440000012.TIF" wi="245" he="87" />分别表示第i帧模型中第j个顶点的X,Y,Z坐标值;则第j个顶点的全局轨迹线的中心点(<sub>x</sub>p<sub>j</sub>,<sub>y</sub>p<sub>j</sub>,<sub>z</sub>p<sub>j</sub>)定义为:<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mfenced open = "{" close = ""><mtable><mtr><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mi>j</mi></msub><mo>=</mo><mrow><mo>(</mo><munderover><mo>&Sigma;</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>F</mi></munderover><mmultiscripts><mi>v</mi><mi>j</mi><mi>k</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mo>)</mo></mrow><mo>/</mo><mi>F</mi></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mi>j</mi></msub><mo>=</mo><mrow><mo>(</mo><munderover><mo>&Sigma;</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>F</mi></munderover><mmultiscripts><mi>v</mi><mi>j</mi><mi>k</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mo>)</mo></mrow><mo>/</mo><mi>F</mi></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mi>j</mi></msub><mo>=</mo><mrow><mo>(</mo><munderover><mo>&Sigma;</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>F</mi></munderover><mmultiscripts><mi>v</mi><mi>j</mi><mi>k</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mo>)</mo></mrow><mo>/</mo><mi>F</mi></mrow></mtd></mtr></mtable></mfenced><mo>,</mo><mi>j</mi><mo>&Element;</mo><mrow><mo>(</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>,</mo><mn>...</mn><mo>,</mo><mi>N</mi><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000920285440000013.TIF" wi="757" he="467" /></maths></maths>由此得到的中心点坐标矩阵为:<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><msub><mi>P</mi><mi>c</mi></msub><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mn>1</mn></msub></mrow></mtd><mtd><mrow><mo>...</mo><mo>...</mo></mrow></mtd><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mi>N</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mn>1</mn></msub></mrow></mtd><mtd><mrow><mo>...</mo><mo>...</mo></mrow></mtd><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mi>N</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mn>1</mn></msub></mrow></mtd><mtd><mrow><mo>...</mo><mo>...</mo></mrow></mtd><mtd><mrow><msub><mmultiscripts><mi>p</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mi>N</mi></msub></mrow></mtd></mtr></mtable></mfenced></mrow>]]></math><img file="FDA0000920285440000014.TIF" wi="499" he="230" /></maths>2)对上述中心点坐标矩阵P<sub>c</sub>进行SVD分解,即P<sub>c</sub>=UΣV<sup>T</sup>;3)将U矩阵作为坐标变换矩阵,逐帧对所有顶点进行坐标变换,得到新的顶点坐标矩阵<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><msubsup><mi>M</mi><mi>i</mi><mo>*</mo></msubsup><mo>=</mo><msub><mi>U</mi><mi>i</mi></msub><mo>&CenterDot;</mo><msub><mi>M</mi><mi>i</mi></msub><mo>,</mo><mi>i</mi><mo>&Element;</mo><mo>&lsqb;</mo><mn>1</mn><mo>,</mo><mi>F</mi><mo>&rsqb;</mo><mo>;</mo></mrow>]]></math><img file="FDA0000920285440000015.TIF" wi="495" he="78" /></maths>4)将所有顶点在XYZ方向的运动轨迹分离出来,构造三个顶点轨迹矩阵<sub>x</sub>T,<sub>y</sub>T,<sub>z</sub>T,如下所示,并逐个对其进行第二次PCA分解;<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><mmultiscripts><mi>T</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mo>=</mo><mrow><mo>(</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mn>1</mn></msub><mo>,</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mi>N</mi></msub><mo>)</mo></mrow><mo>=</mo><mfenced open = "(" close = ")"><mtable><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mn>1</mn></msub></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mn>2</mn></msub></mrow></mtd></mtr><mtr><mtd><mn>...</mn></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>x</mi><none/></mmultiscripts><mi>F</mi></msub></mrow></mtd></mtr></mtable></mfenced><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mn>1</mn><mprescripts/><mi>x</mi><none/></mmultiscripts></mrow></mtd><mtd><mo>...</mo></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mn>1</mn><mprescripts/><mi>x</mi><none/></mmultiscripts></mrow></mtd></mtr><mtr><mtd><mo>...</mo></mtd><mtd><mo>...</mo></mtd><mtd><mo>...</mo></mtd></mtr><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mi>F</mi><mprescripts/><mi>x</mi><none/></mmultiscripts></mrow></mtd><mtd><mo>...</mo></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mi>F</mi><mprescripts/><mi>x</mi><none/></mmultiscripts></mrow></mtd></mtr></mtable></mfenced></mrow>]]></math><img file="FDA0000920285440000021.TIF" wi="997" he="302" /></maths><maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><mmultiscripts><mi>T</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mo>=</mo><mrow><mo>(</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mn>1</mn></msub><mo>,</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mi>N</mi></msub><mo>)</mo></mrow><mo>=</mo><mfenced open = "(" close = ")"><mtable><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mn>1</mn></msub></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mn>2</mn></msub></mrow></mtd></mtr><mtr><mtd><mn>...</mn></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>y</mi><none/></mmultiscripts><mi>F</mi></msub></mrow></mtd></mtr></mtable></mfenced><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mn>1</mn><mprescripts/><mi>y</mi><none/></mmultiscripts></mrow></mtd><mtd><mo>...</mo></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mn>1</mn><mprescripts/><mi>y</mi><none/></mmultiscripts></mrow></mtd></mtr><mtr><mtd><mo>...</mo></mtd><mtd><mo>...</mo></mtd><mtd><mo>...</mo></mtd></mtr><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mi>F</mi><mprescripts/><mi>y</mi><none/></mmultiscripts></mrow></mtd><mtd><mo>...</mo></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mi>F</mi><mprescripts/><mi>y</mi><none/></mmultiscripts></mrow></mtd></mtr></mtable></mfenced></mrow>]]></math><img file="FDA0000920285440000022.TIF" wi="1006" he="310" /></maths><maths num="0007" id="cmaths0007"><math><![CDATA[<mrow><mmultiscripts><mi>T</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mo>=</mo><mrow><mo>(</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mn>1</mn></msub><mo>,</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mn>2</mn></msub><mo>,</mo><mo>...</mo><mo>,</mo><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mi>N</mi></msub><mo>)</mo></mrow><mo>=</mo><mfenced open = "(" close = ")"><mtable><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mn>1</mn></msub></mrow></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mn>2</mn></msub></mrow></mtd></mtr><mtr><mtd><mn>...</mn></mtd></mtr><mtr><mtd><mrow><msub><mmultiscripts><mi>M</mi><mprescripts/><mi>z</mi><none/></mmultiscripts><mi>F</mi></msub></mrow></mtd></mtr></mtable></mfenced><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mn>1</mn><mprescripts/><mi>z</mi><none/></mmultiscripts></mrow></mtd><mtd><mo>...</mo></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mn>1</mn><mprescripts/><mi>z</mi><none/></mmultiscripts></mrow></mtd></mtr><mtr><mtd><mo>...</mo></mtd><mtd><mo>...</mo></mtd><mtd><mo>...</mo></mtd></mtr><mtr><mtd><mrow><mmultiscripts><mi>v</mi><mn>1</mn><mi>F</mi><mprescripts/><mi>z</mi><none/></mmultiscripts></mrow></mtd><mtd><mo>...</mo></mtd><mtd><mrow><mmultiscripts><mi>v</mi><mi>N</mi><mi>F</mi><mprescripts/><mi>z</mi><none/></mmultiscripts></mrow></mtd></mtr></mtable></mfenced></mrow>]]></math><img file="FDA0000920285440000023.TIF" wi="996" he="310" /></maths>其中<sub>x</sub>t<sub>j</sub>,<sub>y</sub>t<sub>j</sub>,<sub>z</sub>t<sub>j</sub>分别表示第j,j∈[1,N]个顶点在XYZ方向的运动轨迹;5)将各个方向的所有的特征向量依据其相应特征值的大小各自进行排序;在XYZ方向各自选取a,b,c个最大特征值对应的最重要的特征向量作为其轨迹空间的一组基,这样便可以用较少的映射在这组基上的系数来表示该空间,从而完成降维。
地址 310018 浙江省杭州市下沙高教园区学正街18号