【问题标题】:Skeletal animation: distorted mesh for fbx file but not dae file?骨骼动画:fbx 文件但不是 dae 文件的变形网格?
【发布时间】:2018-10-27 05:20:16
【问题描述】:

我在使用 Assimp 加载和执行骨骼动画时遇到了一个非常奇怪的问题。我正在使用两个模型来测试我的代码,并且两个模型都使用 Assimp Viewer 正确加载,因此它们本身应该没有错误。但是,当我用我的代码加载这两个模型时,只有 1 个可以正常工作。

显然,这个不起作用。鸡脖子的动画效果符合预期,但腿变形了。

这个很完美。

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

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

modelView * toWorldMatrix * desiredPoseMatrix * inverseBindTransform * meshToWorldMat * position 

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

我的方法有什么问题?

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

【问题讨论】:

    标签: opengl graphics assimp


    【解决方案1】:

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

    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”矩阵都在 timestamp = 0 中计算,“local”矩阵是来自“fbx”文件的数据,m_bindPoseBone 是该骨骼的绑定姿势(也来自“fbx”)

    【讨论】:

    • 很抱歉,我无法遵循您的逻辑。您能否准确说明您使用的是什么矩阵及其用途?
    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 2013-10-19
    • 2017-10-14
    • 1970-01-01
    • 2017-01-30
    • 2019-05-14
    • 2012-10-17
    • 2013-08-19
    相关资源
    最近更新 更多