2021SC@SDUSC
蒙皮算法
骨骼的蒙皮算法,又称为骨骼与皮肤的绑定法或骨骼子空间变形法(SSD),是骨骼动画中的重要部分,是研究骨骼如何带动皮肤网格运动、实时更新皮肤顶点位置的方法。在模型骨架进行运动时,我们可以使皮肤网格上的顶点随着骨骼一起做同样的运动,这样就产生了皮肤网格的变形效果。
刚性绑定算法
刚性绑定算法采用位于底层的骨骼承载运动,每个骨骼关节对应控制一个皮肤顶点,得到皮肤网格顶点变换后的新位置信息。皮肤和顶点是一对一控制的。
刚性绑定算法公式:
- V:顶点变换前世界坐标系下的位置
- V经过矩阵Li转换成从皮肤顶点初始位置到相关联的那个关节初始位置的位移矢量,再经过骨骼的绝对转换矩阵Mi得到世界坐标系下皮肤顶点的新位置V’
柔性绑定算法
Dust3D采用的应该是柔性绑定算法,它与刚性绑定算法最大的区别在于:每个皮肤顶点都可能受到一个或者更多个骨骼关节影响,在确定皮肤顶点变换后的新位置时,需要由这些产生影响的骨骼关节来共同决定。
网格结构Mesh为顶点的集合,存放顶点序列、三角面片索引、权重值、纹理索引等信息,其中与蒙皮直接相关的是权重值信息weight。蒙皮信息的作用是使各个节点按照不同的权重weight同时对顶点施加影响,根据权重的不同,各个节点的影响大小,表现在模型上产生的效果就是多个节点对皮肤网格中的顶点相互拉扯,在建模时通过指定合理的不同区域mesh的权重值,使mesh在连接处产生平滑过渡,而不是关节动画中的生硬断裂,从而避免了裂缝的产生。
SkinnedMeshCreator
SkinnedMeshCreator::SkinnedMeshCreator(const Object &object,
const std::map<int, RigVertexWeights> &resultWeights) :
m_object(object),
m_resultWeights(resultWeights)
{
m_verticesOldIndices.resize(m_object.triangles.size());
m_verticesBindNormals.resize(m_object.triangles.size());
m_verticesBindPositions.resize(m_object.triangles.size());
const std::vector<std::vector<QVector3D>> *triangleVertexNormals = m_object.triangleVertexNormals();
//对于每个原始网格上的三角形面片,存储其索引、顶点索引、顶点法线
for (size_t triangleIndex = 0; triangleIndex < m_object.triangles.size(); triangleIndex++) {
for (int j = 0; j < 3; j++) {