骨架动画:fbx文件的扭曲网格但不是dae文件?

时间:2018-05-17 03:39:24

标签: opengl graphics assimp

我在使用Assimp加载和执行骨骼动画时遇到了一个非常奇怪的麻烦。我使用两个模型来测试我的代码,并且两个模型都使用Assimp Viewer正确加载,因此它们本身不会出现任何错误。但是,当我用我的代码加载这两个模型时,只有1个工作正常。

enter image description here

显然,这个不起作用。鸡脖子的动画按预期工作,但腿扭曲。

enter image description here

这个完美无缺。

我能想到的唯一区别是第一个模型是一个fbx文件而第二个模型是一个dae文件,第一个模型有多个网格,如果我想要的话我需要将它们转换回相同的根空间静态模型要正确加载,而第二个只有一个网格已经在根空间的原点。不出所料,我必须转变回同一个空间的网格是包含鸡腿的那些。

我实际上并没有使用Assimp的mOffsetMatrix,而是计算我自己的inverseBindTransform。我假设我正确计算它们,因为我的一个模型有效。下面是我的矩阵乘法概述:

modelView * toWorldMatrix * desiredPoseMatrix * inverseBindTransform * meshToWorldMat * position 

meshToWorldMat是将网格空间带回世界空间的转换。 (toWorldMatrix * desiredPoseMatrix)只是关键帧插值乘以其parentMatrix的结果。

我的做法出了什么问题?

更新:我还发现扭曲的fbx模型的一些网格共享相同的骨骼,但我不确定这是否重要。

1 个答案:

答案 0 :(得分:0)

我对骨架中的每个骨骼使用了以下转换:

math::Matrix4F Bone::getTransform(const NodePtr& meshNode) const
{
    math::Matrix4F fullCurrentMesh = meshNode->getWorldTransformation()
                                   * meshNode->getLocalInitTransformation(ETransformation::Geometry);

    math::Matrix4F fullInitMesh = meshNode->getWorldInitTransformation()
                                * meshNode->getLocalInitTransformation(ETransformation::Geometry);

    math::Matrix4F relPose0 = (m_node->getWorldInitTransformation() * m_bindPoseBone).getInverse()
                            * fullInitMesh;

    math::Matrix4F relPoseInv = fullCurrentMesh.getInverse() * m_node->getWorldTransformation();

    return relPoseInv * relPose0;
}

所有" init"矩阵的计算时间戳为0,"本地"矩阵是来自" fbx"的数据。文件,m_bindPoseBone是此骨骼的绑定姿势(也来自" fbx")