首页 > 代码库 > 骨骼蒙皮动画中的坐标变换

骨骼蒙皮动画中的坐标变换

背景知识

模型视图变换

OpenGL没有视图矩阵,只有模型视图矩阵,一般游戏引擎都会抽象出视图矩阵的。
总的变换为:

v` = projection * view * mode * v;

父子节点变换

v` = worldMatrix * v = (parentWorldMatrix * localMatrix) * v;

骨骼变换

其实真正表示的关节,而不是骨头,只是骨头比较好理解。

默认姿态网格对象坐标空空变换到骨骼局部坐标空间(offsetMatrix)。

完了后又从骨骼空间变换回动画姿态世界坐标(nodeWroldMatrix)。

v`= nodeWroldMatrix * offsetMatrix * v;

这里有一个bindShapeMatrix不知道是什么意思,猜测是网格对象绑定骨骼时的偏移,即:

offsetMatrix = inverseWroldMatrix(逆世界变换) * bindShapeMatrix;

由于MVP(模式视图矩阵)矩阵已经包含了M矩阵,所以在nodeWroldMatrix矩阵中必须排除最顶层变换,或者将MVP变为VP。

v` = projection * view * nodeWroldMatrix * offsetMatrix * v;

蒙皮变换

皮肤的变换,把每个nodeWroldMatrix * offsetMatrix的最终矩阵组成的列表叫做矩阵调色板。
每个皮肤顶点关联多个骨骼,也就是关联多个矩阵调色板中的矩阵,实现的时候一般用4个整数索引表示。
分别和每个矩阵矩阵调色板的矩阵相乘,然后取加权平均值,即为最终的位置。

吐嘈时间

这些概念大部分是我猜测出来的,基本搜不到这方面的资料。