我正在编写自己的COLLADA导入器。我已经做了很多工作,加载网格和材质等。但是在动画方面,特别是关节旋转方面遇到了问题。
我用于蒙皮网格的公式非常简单:
weighted;
for (i = 0; i < joint_influences; i++)
{
weighted +=
joint[joint_index[i]]->parent->local_matrix *
joint[joint_index[i]]->local_matrix *
skin->inverse_bind_pose[joint_index[i]] *
position *
skin->weight[j];
}
position = weighted;
就文献而言,这是正确的公式。现在,COLLADA为关节指定了两种旋转类型:本地和全局。您必须将旋转连接在一起,以获取关节的本地变换。
COLLADA文档没有区分关节的本地旋转和全局旋转。但在我看到的大多数模型中,旋转可以具有
rotate
(全局)或jointOrient
(本地)的id。当我忽略全局旋转,仅使用本地旋转时,我会得到模型的绑定姿势。但是,当我将全局旋转添加到关节的本地变换中时,奇怪的事情开始发生。
这是不使用全局旋转的情况:
这是使用全局旋转的效果:
在这两个截图中,我使用线条来绘制骨架,但在第一个截图中,它是不可见的,因为关节在网格内部。在第二个截图中,顶点分散无序!
为了比较,这才是第二个截图应该呈现的样子:
虽然不易看出,但第二张截图中可以看到关节处于正确的位置。
但现在有个奇怪的事情。如果我忽略COLLADA指定的反向绑定姿势,而是采用关节父级本地变换的逆乘以关节本地变换的方法,我得到以下结果:
world_matrix * inverse_world_matrix * position * weight
但这让我怀疑 COLLADA 的反向绑定姿势处于错误的空间。
所以我的问题是:COLLADA 指定其反向绑定姿势处于什么空间?如何将反向绑定姿势转换到我需要的空间?