在OpenGL中转换FBX模型的坐标系

Posted

技术标签:

【中文标题】在OpenGL中转换FBX模型的坐标系【英文标题】:Converting coordinates system for FBX model in OpenGL 【发布时间】:2013-08-11 18:55:09 【问题描述】:

我使用 Autodesk FBX SDK2013 加载 FBX 模型。默认情况下,模型在 X 轴上旋转 90 度。

SDK 提供了这个方法:

FbxAxisSystem::OpenGL.ConvertScene(scene);

执行轴转换。但它不起作用。调用它不会改变任何事情。此外,FBX 导出器似乎默认使用 OpenGL 右手系统,至少在导入时是这样说的:

     FbxAxisSystem fbxAxis = scene->GetGlobalSettings().GetAxisSystem();

            if (fbxAxis != FbxAxisSystem::OpenGL)
            
                      //....
            

返回假。 所以我不明白;如果是 OpenGL(右手系统,为什么模型的 Z 轴向上? 是SDK的bug吗?

【问题讨论】:

惯用手与上轴的方向无关。此外,什么是“向上”还取决于您如何查看场景。 在我的场景中 Y 向上,而 -Z 向前。导入模型的 Y(在 3dsMax 中为 Z)与我的 Z 对齐,而我希望它与我的 Y 对齐... "导入模型的 Y(在 3dsMax 中是 Z)与我的 Z 对齐" 所以在 Max 中你说“Z”。它在将您的 FBX 文件作为“Z”进入您的应用程序后出现。这是……错了吗?似乎模型在 Max 中的方向不正确。 【参考方案1】:

我终于找到了解决方案。有人here 实际上说 ConvertScene() 不会影响顶点数组,而是设置节点全局/局部矩阵。通过这些我们可以转换节点几何或顶点。

那么这里是怎么做的:

    FbxMatrix globalTransform = mesh->GetNode()->GetScene()->GetEvaluator()->GetNodeGlobalTransform( mesh->GetNode());
dvec4 c0 =  glm::make_vec4((double*)  globalTransform.GetColumn(0).Buffer());
dvec4 c1 =  glm::make_vec4((double*) globalTransform.GetColumn(1).Buffer());
dvec4 c2 =  glm::make_vec4((double*) globalTransform.GetColumn(2).Buffer());
dvec4 c3 =  glm::make_vec4((double*) globalTransform.GetColumn(3).Buffer());
glm::mat4 convertMatr =mat4(c0,c1,c2,c3);
convertMatr = inverse(convertMatr); //need to inverse otherwise the model is upside down

然后使用 convertMatr 来转换网格的顶点。希望它对任何人都有帮助,因为 Autodesk 论坛没有太多响应。

【讨论】:

以上是关于在OpenGL中转换FBX模型的坐标系的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 OpenGL 渲染 FBX 导入的纹理模型

当涉及旋转时,将鼠标坐标转换为 OpenGL 中的模型坐标

openGL中的坐标系

Unity学习fbx格式模型分离和坐标轴调整

Unity学习fbx格式模型分离和坐标轴调整

unity导入fbx模型后获取其中mesh的绝对世界坐标