Warning: Declaration of action_plugin_linebreak::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /home/stepism/www/wiki/lib/plugins/linebreak/action.php on line 0

Warning: Declaration of action_plugin_syntaxhighlighter3_action::register(Doku_Event_Handler &$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /home/stepism/www/wiki/lib/plugins/syntaxhighlighter3/action/action.php on line 0

Warning: Declaration of syntax_plugin_linebreak::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /home/stepism/www/wiki/lib/plugins/linebreak/syntax.php on line 19

Warning: Declaration of syntax_plugin_linebreak::render($mode, &$renderer, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /home/stepism/www/wiki/lib/plugins/linebreak/syntax.php on line 19
016 FBXモデルの表示 [stepism]

ユーザ用ツール

サイト用ツール


サイドバー

About

Contents

Materials Link

その他

PR


wiki:opengl:tips:016

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

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

wiki/opengl/tips/016.txt · 最終更新: 2014/11/07 08:00 (外部編集)