ホーム < ゲームつくろー! < FBX修得編

その8 レイヤー要素を取得する:マテリアル


 本章ではFBXファイルからマテリアル情報を取得する方法を見ていきます。



@ マテリアル情報

 1つのレイヤーに含まれるマテリアル配列はKFbxLayerElementMaterialクラスに、個々のマテリアルはKFbxSurfaceMaterialクラスにまとめられています。それらを取得するには次のようにします:

マテリアル情報の取得
KFbxLayerElementMaterial *pMaterials;
pMaterials = pMesh->GetLayer(l)->GetMaterials();
if ( pMaterials )
{
   int MaterialNum = pElemMaterials->GetDirectArray().GetCount();
   for ( int i = 0; i < MaterialNum; i++ ) {
      // マテリアル取得
      KFbxSurfaceMaterial *pMaterial = pElemMaterials->GetDirectArray().GetAt(i);
   }
}

 KFbxLayer::GetMaterialsメソッドでマテリアル配列を取得し、その要素をKFbxLayerElementMaterial::GetDirectArray().GetAt(i)として取得しています。

 マテリアルには主に次のような情報が格納されています:

・ シェーディングモデル
・ アンビエント
・ ディフューズ
・ スペキュラ
・ エミッシブ
・ 光沢
・ バンプ
・ 透過度
・ 反射

 これら項目の殆どは前章のテクスチャ取得部分で説明したそれと同じですが、シェーディングモデルは目新しい項目です。これはマテリアルの定義方法でして、文字列として「lambert」か「phong」が設定されています。lambert(ランバート)は上記の項目のうちアンビエント、ディフューズ、エミッシブ、バンプ、透過度でマテリアルを表す方法です。一方phong(フォン)はランバートにスペキュラ、光沢、反射の「光の跳ね返り方」を追加したより複雑なマテリアルです。

 KFbxSurfaceMaterialクラスは基本クラスになっていて、各シェーディングモードモデルを表すクラス(KFbxSurfaceLambert、KFbxSurfacePhong)はそのクラスを継承しています。先のソースで取得したのはKFbxSurfaceMaterialオブジェクトへのポインタですが、シェーディングモードをチェックすれば、派生クラスにキャストする事が可能です。このキャストにはお約束の方法があります:

ランバートかフォンにキャスト
// ランバートにキャスト
if ( pMaterial->GetNewFbxClassId().Is(KFbxSurfaceLambert::ClassId) ) {
  KFbxSurfaceLambert *pLambert = (KFbxSurfaceLambert*)pMaterial;
}

// フォンにキャスト
if ( pMaterial->GetNewFbxClassId().Is(KFbxSurfacePhong::ClassId) ) {
KFbxSurfaceLambert *pPhong = (KFbxSurfaceLambert*)pMaterial;
}

GetNewFbxClassIdメソッドは明示的なキャストメソッドで、上のようにキャストしたいクラスのクラスID(ClassID)を指定するとキャストの可否をチェックしてくれます。キャストが可能であれば条件文の中に入って安全にキャストを行えます。



A 情報の取得

 キャスト後にはアンビエントやディフューズなどの情報を取得できます。ただ、ちょっとその取得方法にはクセがあります。

 ここでは例としてアンビエント情報の取得部分を見てみます:

アンビエント情報の取得
KFbxPropertyDouble3 Ambient;   // アンビエントプロパティ
KFbxColor color;               // カラー

Ambient = pPhong->GetAmbientColor();
color.Set( Ambient.Get()[0], Ambient.Get()[1], Ambient.Get()[2] );

KFbxSurfacePhong::GetAmbientColorメソッドで戻ってくるのは単純な色情報ではなくてKFbxPropertyというプロパティ情報です。これには名前や上限などの各種付加情報があります。ここで欲しいのは色情報のみでして、それはKFbxProperty::Getメソッドで取得します。

 ちょっとややこしいのですが、KFbxSurfacePhong::GetAmbientColorメソッドの戻り値はKFbxPropertyDouble3というKFbxTypedProperty<KFbxDouble3>テンプレートのtypedefに代入できます。そしてGetメソッドはテンプレート引数を返してくれます。色をセットする時にAmbient.Get()[1]などと配列形式にできているのはそのためです。微妙な仕様ですが、そういうもんだと納得するしかありません(^-^;

 アンビエントファクターの場合は次のようになります:

アンビエントファクターの取得
KFbxPropertyDouble1 AmbientFactor;   // アンビエントファクター
double factor;                       // ファクター

AmbientFactor = pPhong->GetAmbientFactor();
factor = AmbientFactor.Get();

ファクター系はdouble型の値なので、KFbxPropertyDouble1で取得しています。これはKFbxProperty<KfbxDouble1>と同じです(typedefしています)。


 ディフューズやスペキュラ、透過度など他のマテリアル成分もこれと全く同じ方法で取得する事ができます。マテリアルは1つのレイヤーに複数個定義されている事があります。これは1つのメッシュが特定のポリゴングループに分かれている時に生じるようです(現在調査中)。その辺りについて詳しく分かり次第追記していく予定です。