.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サンプルに、シーンのみを表示するプロジェクト(アニメーションとテクスチャを含む、自分では見つからなかった)はありますか?