Opengl 带骨骼的动画

Opengl 带骨骼的动画,opengl,animation,skinning,Opengl,Animation,Skinning,我正在制作一个简单的骨骼动画库,但我陷入了某些问题 我所拥有的: 带有少量骨骼的网格通过动画附着到该网格。网格已正确蒙皮。它是3d studio max文件 我所做的: 我用我的插件导出这个蒙皮网格。我取第一个动画帧,用这个矩阵伪码乘以每个顶点 Matrix invertedBoneMatrix = ZeroMatrix; invertedBoneMatrix += bone1WorldTransform * weight1; invertedBoneMatrix += bone2WorldTr

我正在制作一个简单的骨骼动画库,但我陷入了某些问题

我所拥有的: 带有少量骨骼的网格通过动画附着到该网格。网格已正确蒙皮。它是3d studio max文件

我所做的:

我用我的插件导出这个蒙皮网格。我取第一个动画帧,用这个矩阵伪码乘以每个顶点

Matrix invertedBoneMatrix = ZeroMatrix;
invertedBoneMatrix += bone1WorldTransform * weight1;
invertedBoneMatrix += bone2WorldTransform * weight2;
invertedBoneMatrix += bone3WorldTransform * weight3;
invertedBoneMatrix += bone4WorldTransform * weight4;
invertedBoneMatrix.Invert();

foreach (vertex)
   vertex = invertedBoneMatrix * vertex;
当我在引擎中加载此模型时,我计算每个动画帧中每个骨骼的世界变换,并将每个顶点乘以具有适当权重的相应骨骼世界变换

问题: 只有第一帧看起来很好,其他帧失真


也许我的代码中有错误,但我想知道我的方法是否正确——将所有顶点带到其相应骨骼的局部空间。

为什么要反转生成的矩阵?通常骨骼变换是向前的,所以我不明白为什么要反转它。顶点的右侧乘法表明,您实际上是想根据是否使用行或列主顺序对矩阵进行转置,您可能需要交换乘法中的顺序或在其中添加一些转置。无论如何,这里有些关于反转的东西是并没有意义的。@datenwolf我想我需要乘以逆矩阵,将顶点带到骨骼局部空间。这里的第一个答案解释了这一点:啊,我知道你的问题在哪里了。在您链接的Q&A中,在应用动画之前,将应用逆变换来补偿模型装配的任何中性姿势。这也是为什么动画的第一帧看起来很好的原因:实际上,在应用实际动画变换之前,您将模型置于中性姿势。我对3DSMax的定义有点生疏,但我认为每种模型格式使用的转换链稍有不同,您必须仔细检查,您所做的匹配3DS的语义。但为什么第一帧是好的,而其他帧不是?在我的步骤1中,我在导出过程中使用了中间帧,然后,在动画过程中,这是唯一看起来很好的帧。如果看不到其余代码,很难判断。