You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求排查DirectX 11中Assimp加载的DAE模型骨骼异常问题

DirectX11引擎中Assimp加载DAE模型骨骼渲染异常排查

我在DirectX 11引擎中使用Assimp加载器打开.dae模型文件时出现运行异常,团队排查后认为代码无问题,经他人提示怀疑是模型本身存在问题,请求帮忙排查。

已发现的问题

  • 调试结果显示基向量数值错误
  • 骨骼信息处理处于局部空间,导致预期的世界空间位置、旋转及基向量无法正确应用

渲染效果对比

  • 引擎渲染效果:
    引擎渲染效果
  • 工具渲染效果:
    工具渲染效果

加载模型的核心代码

void Model::recursiveProcessBoneMatrix(aiMatrix4x4 matrix, const std::wstring& nodeName)
{
    const ModelNode* modelNode = FindNode(nodeName);
    aiMatrix4x4 transform = modelNode->mTransformation;

    if (mParentModel)
    {
        // 查找模型中同名节点的代码
        ModelNode* parentModelNode = mParentModel->FindNode(nodeName);
        if (parentModelNode)
        {
            /*
            根据父模型对应节点的层级信息设置自身层级
            虽然能强制将模型移动到目标节点位置,但会引发旋转问题
            */
            Bone* bone = mParentModel->FindBone(nodeName);

            if (bone != nullptr)
            {
                bone = mParentModel->GetBone(bone->mIndex);

                matrix = bone->mLocalMatrix;
            }
        }
    }

    matrix = matrix * transform;


    if (mBoneMap.find(nodeName) != mBoneMap.end())
    {
        Bone* bone = &mBoneMap.find(nodeName)->second;
        aiMatrix4x4 glovalInvers = FindNode(L"Scene")->GetTransformation();

        // bone->mOffsetMatrix - 将顶点转换到骨骼空间(类似世界、视图、投影变换)
        // matrix - 从根节点开始的变换矩阵
        bone->mFinalMatrix = glovalInvers.Inverse() * matrix * bone->mOffsetMatrix;
        bone->mLocalMatrix = matrix;

        mBones[bone->mIndex].mFinalMatrix = bone->mFinalMatrix;
        mBones[bone->mIndex].mLocalMatrix = matrix;
    }

    for (size_t i = 0; i < modelNode->mChilds.size(); ++i)
    {
        recursiveProcessBoneMatrix(matrix, modelNode->mChilds[i]->mName);
    }
}

内容的提问来源于stack exchange,提问作者user19632259

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:52:54