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

3
我使用Autodesk FBX SDK2013加载FBX模型。默认情况下,模型会绕X轴旋转90度。
SDK提供了以下方法:
FbxAxisSystem::OpenGL.ConvertScene(scene);

执行轴变换。但它没有起作用。调用它不会改变任何东西。此外,似乎FBX导出器默认使用OpenGL右手坐标系,至少在导入时是这样说的:
     FbxAxisSystem fbxAxis = scene->GetGlobalSettings().GetAxisSystem();

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

返回false。我不理解;如果它是OpenGL(右手坐标系),为什么模型的Z轴是向上的?这是SDK的bug吗?


左右惯用性与上轴方向无关。此外,“上”取决于您查看场景的方式。 - Nicol Bolas
在我的场景中,Y轴是向上的,而-Z轴是向前的。导入的模型的Y轴(在3dsMax中为Z轴)与我的Z轴对齐,而我希望它与我的Y轴对齐... - Michael IV
“导入的模型的Y轴(在3dsMax中为Z轴)与我的Z轴对齐”所以在Max中你说“Z”。然后通过FBX文件进入您的应用程序后,它会显示为“Z”。这是错误的吗?看起来更可能是模型在Max中定位不正确。” - Nicol Bolas
1个回答

4

我终于找到了解决方案。有人在这里说,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论坛不太响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接