目次

016 FBXモデルの表示

概要

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 );
}

ここでは、マテリアルは一つだけに対応しています。