3Dプログラミング応用 1-1A

~スキン非対応のxfileの表示~

1-1-1.D3DXLoadMeshHierarchyFromX 関数について

モーションつきxfileを読み込むには D3DXLoadMeshHierarchyFromX 関数を使う。

この関数の呼び出しに、どんな引数が必要か確認しよう。


引数の画像

◆ LPCSTR Filename

→ ファイル名 これは問題なし


◆ DWORD MeshOptions

→ Meshに含まれるIndexBufferとVertexBufferの作成時に与えるフラグを指定する

このパラメータは D3DXMESH_MANAGED を指定するのが一般的


◆ LPDIRECT3DDEVICE9 pDevice

→ D3Dデバイス これも問題なし


◆ LPD3DXALLOCATEHIERARCHY pAlloc

→ ID3DXAllocateHierarchy へのポインタ

この関数の処理中に作成される構造体のメモリ確保、初期化の方法について定義している


◆ LPD3DXLOADUSERDATA pUserDataLoader,

→ xfileに拡張情報が含れている場合、それの処理方法を指定する

今回は不要なのでNULL


◆ LPD3DXFRAME* ppFrameHierarchy,

→ 出力その1 階層化されたフレームの情報が与えられる


◆ LPD3DXANIMATIONCONTROLLER* ppAnimController

→ 出力その2 上記のフレームを動かすためのコントローラ


これらの関数を呼び出すことで、ppFrameHierarchyとppAnimControllerに、モーション再生に必要な情報が帰ってくる。


ネックとなるのは pAlloc パラメータである。

この引数には ID3DXAllocateHierarchy* を与える必要があるのだが ID3DXAllocateHierarchy は仮想クラスなので、このクラス自体を生成することはできない。

また、IDirect3DTexture9 における CreateTexture のようなインスタンスを生成してくれる関数もない。

マニュアルにも「このインターフェイスは、アプリケーションによって実装され~」と書いてある。つまり、


1.自分で ID3DXAllocateHierarchy を継承したクラスを作成

2.自作クラスで ID3DXAllocateHierarchy の仮想メンバ関数を定義

3.自作クラスをインスタンス化


以上の手順を踏んで、そのアドレスをパラメータとして渡すことになる。

▲TOP

1-1-2.CMyAllocateHierarchy クラスの実装

ID3DXAllocateHierarchy インターフェイスを継承した CMyAllocateHierarchy クラスを作成する。


↓インターフェイスは4つの仮想関数をもっている

CreateFrame フレーム オブジェクトの割り当てを要求します
CreateMeshContainer メッシュ コンテナー オブジェクトの割り当てを要求します
DestroyFrame フレーム オブジェクトの割り当て解除を要求します
DestroyMeshContainer メッシュ コンテナー オブジェクトの割り当て解除を要求します

これらを順に実装していきます。


◆ MyAllocateHierarchy.h

MyAllocateHierarchy.h

◆ MyAllocateHierarchy.cpp

MyAllocateHierarchy.cpp

▲TOP

1-1-3.CAnimateObject クラスの実装

つづいて、描画に必要な情報を管理するクラス CAnimateObject を作成する。


↓主なメンバ関数は以下のとおり

Create D3DXLoadMeshHierarchyFromX関数を呼び、xfileを読み込む
戻り値をメンバ変数に格納
Update 描画前に呼び出され、行列等を更新する
Render 描画処理

◆ AnimateObject.h

AnimateObject.h

◆ AnimateObject.cpp

AnimateObject.cpp

▲TOP

1-1-4.EmptyProject.cpp に追記

CAnimateObjectを利用するコードをメインソースファイルに追記


◆ EmptyProject.cpp (一部)

EmptyProject.cpp (一部)

1-1-5.動作確認

↓このように椅子と重なるように人間とカツラが表示されたら成功。

1-1-5 動作確認

▲TOP

>「1-1B スキンメッシュ対応のxfile表示」へ続く