1.
第一步:先导入源模型和对应的bs模型,
第二步:导入目标模型,第三步,对目标模型进行大小与位置调整,使其对应源模型大小与位置,这里也导入landmark,并且,最终的中心在世界坐标系的中心在鼻尖,注意,这里已经有了源模型的landmark,也有目标模型的landmark,
我们通过下面3个约束来求解对应发点位置使得满足下面三个约束,相当于这里的x就是我们需要求解的,本来我们要解A x = b Ax=bAx=b的,但是代码直接转换成了A T A x = A T b A^TAx= A^TbA
第三步,找相邻的面,并通过相邻的面来确定landmark的点所在与影响的面和点,影响的面只通过广度搜索并只遍历一次,面直接确定点(面上的点)。
这里网格形变后能够保证自身的大概结构,不能本来是猫,形变以后变成狗了;这一步要求每个网格形变矩阵尽量接近单位阵
形变过程中,具有相同顶点的网格要具有接近甚至是相同的形变矩阵,不然同一个顶点左边的网格让他往上形变,而右边的网格让他往下形变,这样就造成了这个顶点不连续的现象;这一步要求相邻网格的形变矩阵的差值为零矩阵
源模型的所有顶点形变后,目标模型中与源模型指定顶点的最临近点要满足人工指定的顶点约束;即形变后,最开始的人为指定的约束顶点对的空间位置要尽量接近;这一步要求形变后,在目标模型中查找形变后源模型指定顶点的最近点的位置要与人为指定的顶点接近
找最近点的时候,找的是点,但是点可以在多个面里面,做共享的顶点,这时这个顶点的法线就是它所在面的法线的均值,同时还得考虑他的邻接面的法线方向是否一致,比如我找到模型两个顶点接近,但是一个发现向上一个法线向下,他俩也不能作为对应点,但是判断顶点附近面的法线很麻烦,所以为当前顶点利用临近面法线的平均计算了顶点法线。通过搜索中心距离较近的源三角形和目标三角形对来计算三角对应关系
第五步,卡通角色表情驱动系列二_风翼冰舟的博客-CSDN博客_表情驱动
这里确定了suu
T和S是仿射变换的线性部分,表示模型变化到表情的变换,这里是用来求仿射变换T的,对应的限制TV+dj=Tk+dk是用来求d的,里面涉及到顶点共享的关系。最后变成
总体流程:先导入模型,把目标模型变换大小与形状到源模型,匹配,然后进行变形传递,这里面用landmark来优化解
这里需要注意,多次迭代以后,两个模型其实应该非常接近了,无论大小还是形状,就可以按照查找最近点的方法找到两个模型的对应面片了;
可以用最大的三角形的边长作为寻找半径,以每个三角面的中心点坐标为寻找目标:
这时直接寻找对应位置的面和其法线,求解变换时只用到了landmark和对应面的关系即可求解