その4 ポリゴンと頂点の情報を取得する事始め
3Dモデルといえば頂点とポリゴンの情報が欠かせません。この章ではFBXからポリゴンと頂点の情報を取得する方法の基本部分を知る事でFBX
SDKでモデルの情報を取るコツを掴む事にしましょう。
@ KFbxMeshクラス
メッシュの情報はKFbxMeshクラスにすべて格納されています。このインスタンスを得るには前章で取得したKFbxNodeAttributeオブジェクトが「KFbxNodeAttribute::eMesh」である事を確認してからKFbxMeshにキャストします:
メッシュオブジェクトの取得 KFbxNodeAttribute *pAttrib = pNode->GetNodeAttribute();
if ( pAttrib )
{
KFbxNodeAttribute::EAttributeType type = pAttrib->GetAttributeType();
if ( type == KFbxNodeAttribute::eMESH )
{
// メッシュにダウンキャスト
KFbxMesh *pMesh = (KFbxMesh*)pAttrib;
}
}
ノードタイプがeMESHである時点でKFbxNodeAttributeの正体がKFbxMeshだと判断して問題ありません。詳しくは前章のクラス図を参照ください。
A ポリゴン情報の取得
KFbxMeshオブジェクトは壮大な3Dモデル情報の親玉です。このクラスからはポリゴンだけでなくテクスチャやマテリアルなど極めて沢山の情報を取得できます。3Dモデルの基本中の基本であるポリゴン情報については主に次の項目を取得できます:
・ 総ポリゴン数 (GetPolygonCount)
・ ポリゴン頂点インデックス数 (GetPolygonVertexCount)
・ ポリゴン頂点インデックス配列 (GetPolygonVertices)
PolygonVertexという言葉は直訳すればポリゴン頂点ですが、これは頂点インデックス(頂点番号)なので注意してください。
各情報を得るには下記のようにします:
ポリゴン基本情報の取得 KFbxMesh *pMesh = (KFbxMesh*)pAttrib;
int PolygonNum = pMesh->GetPolygonCount();
int PolygonVertexNum = pMesh->GetPolygonVertexCount();
int *IndexAry = pMesh->GetPolygonVertices();
インデックス配列の本体はIndexAryで、int型のポインタとして得られます。
頂点インデックスをいくつかまとめるとポリゴンになります。1つのポリゴンを構成する頂点のインデックス番号のセットを得るにはKFbxMesh::GetPolygonVertexメソッドを用います(GetPolygonVerticesメソッドと似ているので注意)。FBXは多角形ポリゴンをサポートしていますので、ポリゴンを構成する頂点インデックスの数は「3」とは限りません。1つのポリゴンを構成する頂点インデックスの数はKFbxMesh::GetPolygonSizeメソッドで得られます。これら2つのメソッドを組み合わせると次のようにポリゴンインデックスセットを取得できます:
1つのポリゴンを構成する頂点インデックスを取得 for ( int p = 0; p < PolygonNum; p++ ) {
int IndexNumInPolygon = pMesh->GetPolygonSize( p ); // p番目のポリゴンの頂点数
for ( int n = 0; n < IndexNumInPolygon; n++ ) {
// ポリゴンpを構成するn番目の頂点のインデックス番号
int IndexNumber = pMesh->GetPolygonVertex( p, n );
}
}
上の添え字とポリゴンやインデックスの関係は下図の通りです:
B 頂点の情報
メッシュの最も小さくて重要な情報が頂点(Vertex)です。頂点には座標はもちろんの事、法線、カラー、UV座標、マテリアル情報など沢山の付加情報もついています。
メッシュに含まれている頂点の数はKFbxMesh::GetControlPointsCountメソッドで、頂点のローカル座標はKFbxMesh::GetControlPointsメソッドで取得できます。
頂点座標を取得 int controlNum = pMesh->GetControlPointsCount(); // 頂点数
KFbxVector4* src = pMesh->GetControlPoints(); // 頂点座標配列
// コピー
D3DXVECTOR4* controlAry = new D3DXVECTOR4[ controlNum ];
for ( int i = 0; i < controlNum; ++i ) {
controlAry[ i ].x = src[ i ][ 0 ];
controlAry[ i ].y = src[ i ][ 1 ];
controlAry[ i ].z = src[ i ][ 2 ];
controlAry[ i ].w = src[ i ][ 3 ];
}
KFbxVector4はFBX SDKが用意しているベクトルを格納する配列で、各要素へは[]演算子でアクセスします。
GetControlPointsメソッドによって取得できる頂点座標配列は、先のインデックス配列と関連しています。インデックスは上からずらっとポリゴン単位で要素番号が並んでおり、ポリゴンの頂点座標と次の関係を持っています:
頂点座標と頂点インデックスがあればポリゴンを描画することが可能になります。これだけでも大きな前進です。
頂点にはこの他にも頂点カラーやUV座標など様々な情報が付加しています。少しずつ掘り下げながら見ていく事にしましょう。