Преобразование системы координат для модели FBX в OpenGL



Я загружаю модели FBX с помощью Autodesk FBX SDK2013.Модели по умолчанию поворачиваются на 90 градусов по оси X.



SDK предоставляет этот метод:



FbxAxisSystem::OpenGL.ConvertScene(scene);


Для выполнения преобразования оси.Но это не работает.Вызов его ничего не меняет.Более того, похоже, что экспортер FBX по умолчанию использует OpenGL right hand sytem,по крайней мере, так он говорит при импорте:



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

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


Возвращает false.
Так что я не понимаю;если это OpenGL (правая рука системы, почему модели имеют ось Z как вверх?
Это ошибка SDK?

576   1  

1 ответ:

Я наконец нашел решение.Кто-то здесь фактически сказал, что 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 forum не слишком отзывчив.

Comments

    Ничего не найдено.