请求排查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
相关产品推荐
相关产品推荐

