Saya punya sedikit masalah dengan mengimpor / menampilkan file .fbx.
Saya memeriksa contoh-contohnya tetapi yang paling saya sukai (animasi dan tekstur) tidak terdokumentasi dengan baik untuk dipahami oleh seseorang yang baru dengan ini seperti saya.
Inilah yang saya coba: Saya berhasil mendapatkan simpul dan normalnya tapi saya terjebak pada mendapatkan tekstur tekstur untuk setiap simpul.
Ini kode saya sejauh ini:
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();
}
}
Pertanyaan saya adalah:
- Bagaimana saya mendapatkan tekstur coords?
- Bagaimana cara membuat blender mengekspor tekstur dalam format foto? (seperti .jpg atau .tga)
- Apakah ada kesalahan dalam tampilan saya sejauh ini?
- Apakah ada proyek dalam sampel .fbx yang hanya menampilkan adegan (termasuk animasi dan tekstur; saya tidak dapat menemukannya sendiri)?
Saya bukan ahli dalam FBX tetapi saya memiliki pengalaman dengan itu, berikut adalah saran saya
Saya sarankan memeriksa contoh dalam $ (FBXSDK) \ samples \ ImportScene
Ini akan menunjukkan kepada Anda bagaimana cara mendapatkan UV Coords dan data lainnya
Saya belum bekerja dengan blender yang mengekspor FBX, maaf
Saya sudah melihat sekilas kode Anda, jadi tidak bisa mengatakan 100% jika Anda memiliki kesalahan, tetapi saya akan memberikan beberapa saran agar saya belajar bekerja dengan FBX SDK.
Bergantung pada Perangkat Lunak 3D Anda harus memeriksa apakah Anda perlu mengkonversi Coords UV Anda. Misalnya itu bisa sama dengan yang diharapkan oleh perangkat lunak Anda atau Anda perlu melakukan ini
mine.U = fbx.U
mine.V = 1 - fbx.V
Juga FBX tergantung pada eksportir (pengalaman saya dengan 3ds maks) itu akan mengubah Y & Z hanya untuk terjemahan, rotasi akan terbalik. Yang ingin saya katakan adalah jika Anda mengekspor (dalam 3ds maks) Y-UP, lclTranslation akan cocok dengan 1: 1 tetapi lclRotasi akan seperti ini
myRot.x = fbxRot.x
myRot.y = fbxRot.z
myRot.z = fbxRot.y
Juga ingat untuk memeriksa untuk memeriksa apakah sistem koordinat Kiri atau Kanan dan apakah itu sesuai dengan apa yang diharapkan perangkat lunak Anda, jika tidak memperbaikinya.
Membuat dan importir khusus untuk FBX itu menantang jangan menyerah!
sumber
Mendapatkan koordinat tekstur untuk model dengan satu set UV Menggunakan FBX SDK 2013:
sumber