====== 016 FBXモデルの表示 ======
{{:wiki:opengl:tips:opengl_fbxdraw.png?200|}}
===== 概要 =====
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 VtxData;
unsigned long vertexCount;
unsigned long indexCount;
std::vector 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 );
}
ここでは、マテリアルは一つだけに対応しています。