你能检查一下我提取的collada(.dae)模型中是否有任何错误吗?

Can you check if there are any errors in the collada (.dae) models that I extracted?

提问人:user19632259 提问时间:8/5/2023 更新时间:8/5/2023 访问量:25

问:

我在 DirectX 11 引擎中使用了 Assimp 加载程序打开了我的 .dae 模型文件,但它无法正常工作。

我和我的团队不相信我的代码中有任何错误,所以我向其他人寻求帮助。他们认为模型本身可能存在问题。我将上传模型文件,如果您能告诉我它们是否有任何问题,我将不胜感激。

我预计会出现以下问题:

调试结果显示,基本向量的值不正确。 我所操作的骨骼信息位于局部空间中,因此预期的世界位置、旋转和底面未正确应用。

型号 - Google 云端硬盘

my engine moddel tool model

这是我用来加载模型的代码。

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

    if (mParentModel)
    {
        // Code written to search for nodes with the same name in the model.
        ModelNode* parentModelNode = mParentModel->FindNode(nodeName);
        if (parentModelNode)
        {
            /*
            Set my hierarchy information based on the parent's corresponding node hierarchy.
            Although the model is forced to move to the position of that node, 
            it causes rotation issues.
            */
            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 - vectex to bonespace (like world, view, projection transform)
        //matrix - transformed martrix from root
        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);
    }
}
游戏引擎 游戏开发 DirectX-11 Collada Assimp

评论

0赞 Maico De Blasio 8/6/2023
这是很正常的。网格的所有部分都将以模型原点为中心,并且只有在应用骨骼调色板变换后才会平移到它们在场景中的适当相对位置。如果你的递归骨矩阵处理函数不起作用,请尝试研究矩阵相乘的顺序,以及你是否传入了列优先矩阵,我认为这是 Assimp 所需要的。

答: 暂无答案