FBXの情報が取得できていますので、これを利用してOpenGLを使ってモデルを表示してみます。まず、描画に必要な情報を収集するための構造体を用意します。
struct COLOR_RGBA { float r, g, b, a; }; struct VERTEX_DATA { Vector3 vPos; Vector3 vNor; Vector2 vTexcoord; }; struct MATERIAL_CONSTANT_DATA { COLOR_RGBA ambient; COLOR_RGBA diffuse; COLOR_RGBA specular; COLOR_RGBA emissive; }; struct MATERIAL_DATA { COLOR_RGBA ambient; COLOR_RGBA diffuse; COLOR_RGBA specular; COLOR_RGBA emissive; float specularPower; float TransparencyFactor; // 透過度。 MATERIAL_CONSTANT_DATA materialConstantData; }; // ノード。 struct MESH_NODE { std::vector<VERTEX_DATA> VtxData; unsigned long vertexCount; unsigned long indexCount; std::vector<MATERIAL_DATA> materialData; float mat4x4[16]; MESH_NODE() { vertexCount = 0; indexCount = 0; } };
MESH_NODE 構造体が、が全ての情報を受け取ります。そうすると、描画は以下の様になります。
// モデル描画 void DrawModel() { glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_NORMAL_ARRAY ); for( size_t i = 0; i < s_nodeCoount; i++ ) { glPushMatrix(); { // size_t mat_count = s_pMeshNode[ i ].materialData.size(); // for( size_t j = 0; j < mat_count; j++ ) { // MATERIAL_DATA* pMat = &s_pMeshNode[ i ].materialData[ j ]; MATERIAL_DATA* pMat = &s_pMeshNode[ i ].materialData[ 0 ]; if( !pMat ) { continue; } glMaterialfv( GL_FRONT_AND_BACK,GL_AMBIENT, (const GLfloat *)&pMat->ambient ); glMaterialfv( GL_FRONT_AND_BACK,GL_DIFFUSE, (const GLfloat *)&pMat->diffuse ); glMaterialfv( GL_FRONT_AND_BACK,GL_SPECULAR, (const GLfloat *)&pMat->specular ); glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, pMat->specularPower ); glDisable( GL_TEXTURE_2D ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); if( s_pMeshNode[ i ].VtxData.size() > 1 ) { glVertexPointer( 3, GL_FLOAT, sizeof( VERTEX_DATA ), &s_pMeshNode[ i ].VtxData[ 0 ].vPos.x ); glNormalPointer( GL_FLOAT, sizeof( VERTEX_DATA ), &s_pMeshNode[ i ].VtxData[ 0 ].vNor.x ); glDrawArrays( GL_TRIANGLES, 0, s_pMeshNode[ i ].VtxData.size() ); } } } glPopMatrix(); } glDisableClientState( GL_VERTEX_ARRAY ); glDisableClientState( GL_NORMAL_ARRAY ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glDisable( GL_TEXTURE_2D ); }
ここでは、マテリアルは一つだけに対応しています。