Unity中的蒙皮动画原理和代码测试
就以vertex[0]为测试。
将播动画的prefab的transform reset,保证W(世界空间)和M(模型空间)一致,省去一些麻烦。
首先通过
得知vertex0的受2个骨骼影响,bone[3]影响权重为0.75,bone[6]为0.25。
其次了解bindpose(通常是T-pose),类型为Matrix4x4,就是模型系下每个骨骼的transform。
作用为从M(模型空间)转到B(骨骼空间)。
将vertex[0]分别转到3,6骨骼空间下:
此时v1,v2都在B空间了。注意不论此时骨骼怎么动,B空间里的v是不会动的。(这就是T-pos的意义,让模型的默认vertex有一个在B空间的相对位置)
从上篇知道skin.bones是实时更新的,所以此时skin.bones[i]的local就是B空间(因为
transform为0时,点就在骨骼位置上),World又和M空间一致(因为我们把prefab的
transform reset为0了)。
所以skin.bones[i]的localToWorldMatrix就是从B(骨骼空间)转到M(模型空间),它是实时
更新的。 由于v1,v2现在就在B空间,再乘一下骨骼skin.bones[i]的实时矩阵
localToWorldMatrix,就能得到v1,v2的实时M空间位置:
最后再根据boneWeight混合一下,就能得到最终vertex[0]的骨骼动画实时M空间位置:
最后对比一下直接从BakedMesh拿到的vertexFinal数据,如果两者一样,说明我们的理解没
有错。完整代码:

看来没有错。蒙皮动画这一套方案,和许多实时图形学一样,由于是基于大量数据的编写结构,导致其直接理解起来不是很直观(如果先入为主 机器人动力学 的那套FK理论)。但拆开单个看,可以发现那些基本的setUp都隐藏在各种名词结构(bindpose,bones,boneIndices,boneWeights)下了。