У меня небольшая проблема с импортом / отображением файлов .fbx.
Я проверил примеры, но те, которые меня интересуют больше всего (анимация и текстура), плохо документированы для понимания кем-то, кто плохо знаком с этим, как я.
Это то, что я пробовал: мне удалось получить вершины и нормали, но я застрял на получении координат текстуры для каждой вершины.
Вот мой код до сих пор:
3dModelBasicStructs.h
struct vertex
{
float x,y,z;
};
struct texturecoords
{
float a,b;
};
struct poligon
{
int a,b,c;
};
model.h
#ifndef MODEL_H
#define MODEL_H
#define FBXSDK_NEW_API
#define MAX_VERTICES 80000
#include "3dModelBasicStructs.h"
#include <fbxsdk.h>
#include <iostream>
#include <GL/glut.h>
using namespace std;
class Model
{
public:
Model(char*);
~Model();
void ShowDetails();
char* GetModelName();
void SetModelName( char* );
void GetFbxInfo( FbxNode* );
void RenderModel();
private:
char Name[25];
vertex vertices[MAX_VERTICES];
texturecoords txt[MAX_VERTICES];
float *normals;
int numNormals;
int *indices;
int numIndices;
int numVertices;
};
#endif
model.cpp
#include "Model.h"
Model::Model(char *filename)
{
cout<<"\nA model has been built!";
numVertices=0;
numIndices=0;
FbxManager *manager = FbxManager::Create();
FbxIOSettings *ioSettings = FbxIOSettings::Create(manager, IOSROOT);
manager->SetIOSettings(ioSettings);
FbxImporter *importer=FbxImporter::Create(manager,"");
importer->Initialize(filename,-1,manager->GetIOSettings());
FbxScene *scene = FbxScene::Create(manager,"tempName");
importer->Import(scene);
importer->Destroy();
FbxNode* rootNode = scene->GetRootNode();
this->SetModelName(filename);
if(rootNode) { this->GetFbxInfo(rootNode); }
}
Model::~Model()
{
cout<<"\nA model has been destroyed!";
glDisableClientState(GL_VERTEX_ARRAY);
}
void Model::ShowDetails()
{
cout<<"\nName:"<<Name;
cout<<"\nVertices Number:"<<numVertices;
cout<<"\nIndices Number:"<<numIndices;
}
char* Model::GetModelName()
{
return Name;
}
void Model::SetModelName(char *x)
{
strcpy(Name,x);
}
void Model::GetFbxInfo( FbxNode* Node )
{
int numKids = Node->GetChildCount();
FbxNode *childNode = 0;
for ( int i=0 ; i<numKids ; i++)
{
childNode = Node->GetChild(i);
FbxMesh *mesh = childNode->GetMesh();
if ( mesh != NULL)
{
//================= Get Vertices ====================================
int numVerts = mesh->GetControlPointsCount();
for ( int j=0; j<numVerts; j++)
{
FbxVector4 vert = mesh->GetControlPointAt(j);
vertices[numVertices].x=(float)vert.mData[0];
vertices[numVertices].y=(float)vert.mData[1];
vertices[numVertices++].z=(float)vert.mData[2];
// cout<<"\n"<<vertices[numVertices-1].x<<" "<<vertices[numVertices-1].y<<" "<<vertices[numVertices-1].z;
}
//================= Get Indices ====================================
numIndices=mesh->GetPolygonVertexCount();
indices = new int[numIndices];
indices = mesh->GetPolygonVertices();
cout<<numIndices;
//================= Get Normals ====================================
FbxGeometryElementNormal* normalEl = mesh->GetElementNormal();
if( normalEl)
{
numNormals = mesh->GetPolygonCount()*3;
normals = new float[numNormals*3];
int vertexCounter=0;
for(int polyCounter = 0 ; polyCounter<mesh->GetPolygonCount(); polyCounter++)
{
for(int i=0;i<3;i++)
{
FbxVector4 normal = normalEl->GetDirectArray().GetAt(vertexCounter);
normals[vertexCounter*3+0] = normal[0];
normals[vertexCounter*3+1] = normal[1];
normals[vertexCounter*3+2] = normal[2];
cout<<"\n"<<normals[vertexCounter*3+0]<<" "<<normals[vertexCounter*3+1]<<" "<<normals[vertexCounter*3+2];
vertexCounter++;
}
}
}
}
this->GetFbxInfo(childNode);
}
}
void Model::RenderModel()
{
int i,j;
for(i=0;i<numIndices-3;i++)
{
glBegin(GL_TRIANGLES);
glNormal3f(normals[i*3+0],normals[i*3+1],normals[i*3+2]);
for(j=i;j<=i+2;j++)
glVertex3f(vertices[indices[j]].x,vertices[indices[j]].y,vertices[indices[j]].z);
glEnd();
}
}
Мои вопросы:
- Как получить координаты текстуры?
- Как мне заставить блендер экспортировать текстуру в формат фото? (например .jpg или .tga)
- Есть ли какие-либо ошибки в моем отображении?
- Есть ли в образцах .fbx проект, который отображает только сцену (включая анимацию и текстуру; я сам не смог ее найти)?
Я не эксперт в FBX, но у меня есть некоторый опыт с этим, вот мои предложения
Я бы предложил перейти к примеру в $ (FBXSDK) \ samples \ ImportScene
Это покажет вам, как получить УФ-координаты и другие данные
У меня не работает блендер с экспортом FBX, извините
Я быстро просмотрел ваш код, поэтому не могу сказать 100%, если у вас есть ошибки, но я дам вам несколько советов, которые я изучу, работая с FBX SDK.
В зависимости от программного обеспечения 3D вы должны проверить, нужно ли конвертировать ваши UV координаты. Например, это может быть тем же, что ожидает ваше программное обеспечение, или вам нужно это сделать.
mine.U = fbx.U
мой.V = 1 - fbx.V
Также FBX в зависимости от экспортера (мой опыт работы с 3ds max) будет изменять Y & Z только для переводов, вращение будет инвертировано. Я хочу сказать, что если вы экспортируете (в 3ds max) Y-UP, lclTranslation будет соответствовать 1: 1, но lclRotation будет таким
myRot.x = fbxRot.x
myRot.y = fbxRot.z
myRot.z = fbxRot.y
Также не забудьте проверить, является ли система координат левой или правой и соответствует ли она тому, что ожидает ваше программное обеспечение, если не исправляет ее.
Создавать и настраивать импортер для FBX сложно, не сдавайтесь!
источник
Получение координат текстуры для моделей с одним набором UV с помощью FBX SDK 2013:
источник