class CSkinnedMesh

【概要】
 CMesh の拡張クラス。アニメーション機能を追加。

重要度メソッド名 解説アクセス
CSkinnedMesh(CD3DEnv *pEnv, TCHAR *fname)
コンストラクタ
public
~CSkinnedMesh()
デストラクタ
public
virtual void
Render(LPDIRECT3DDEVICE9 lpd3ddev)
モデルデータをグラフィックデバイスに対して描画する。
public
virtual void
RenderWithoutMaterials(LPDIRECT3DDEVICE9 lpd3ddev,D3DMATERIAL9 *pMaterial)
モデルデータをグラフィックデバイスに対して描画する。メッシュ内のマテリアルは無視する。
public
HRESULT
FrameMove(D3DXMATRIX *pMatWorld, D3DXMATRIX *pMatView, FLOAT fElapsedTime)
アニメーションのグローバルタイムをfElapsedTimeの分進める。
public
HRESULT
GetAnimationController(LPD3DXANIMATIONCONTROLLER *p)
アニメーションコントローラを取得する。リファレンスカウントがインクリメントされる。
public
HRESULT
AdjustAnimation(D3DXMATRIX *pMatWorld, D3DXMATRIX *pMatView)
アニメーションコントローラによりグローバルタイムを変更せず、アニメーションを適用する。
public
HRESULT
ResetAnimation(D3DXMATRIX *pMatWorld, D3DXMATRIX *pMatView)
アニメーションのグローバルタイムをリセットする。
public
void
ResetAnimationMatrices()
全てのアニメーションを初期状態に戻す。
public
void
SetFog(FLOAT fStart, FLOAT fEnd)
フォグを設定する。現状はリニアフォグのみのサポート。
public
void
AddAnimation(TCHAR *fname)
アニメーションをファイルから追加読み込みする。
public
void
SetLightEnable(DWORD dwNum,BOOL bLight)
ライトを有効または無効にする。
public
void
RenderBones(LPDIRECT3DDEVICE9 lpd3ddev)
ボーンを直線で表現してレンダリングする。
public

※重要度の意味:

◎これを知らないとこのライブラリを使えないレベル。
○知っておいたほうが良いレベル。
△知らなくても支障は無いレベル。

※:注意点1
CSkinnedMeshに対する以下のメソッドの呼び出しは成功しない。 GetFVF(), GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9 *ppVB), GetIndexBuffer(LPDIRECT3DINDEXBUFFER9 *ppIB), GetNumVertices(), GetNumFaces()

※:注意点2
メッシュの読み込みは、InitDeviceObjects の内部で行われている。 メッシュの再読み込みが行われる際には必ずこのメソッドが呼び出される為、 このメソッドをオーバライドする事で、メッシュを読み込んだ後の後処理を行う事ができる。
例:当たり判定に使用する為、D3DXFrameFind を用いて、メッシュ内のパーツを示すポインタをセットアップする・・・など。

※:注意点3
1頂点あたり影響可能なボーンの数は4までである。モデラーから出力する際、設定に注意が必要である。

※:注意点4
CSkinnedMeshに対する以下のメソッドの返す値は誤差が大きく不正確である。 GetRadius(), GetBoundingSphere(), GetBoundingBox()
必要であれば、各自正確なものを実装されたい。


CSkinnedMesh(CD3DEnv *pEnv, TCHAR *fname)

引数:pEnv:このメッシュオブジェクトが使用する描画環境へのポインタ。
fName:ファイルネームを示す文字列へのポインタ(実行ファイルからの相対パス)。


コンストラクタ。ファイルネームが示すメッシュを読み込む様に、本クラスを初期化する。 実際にはクラスを生成した時点ではファイルは読み込まれないので、描画環境に対して、 ReloadGraphics()などで明示的に読み込み指示をする必要がある。


~CSkinnedMesh()

デストラクタ


virtual void Render(LPDIRECT3DDEVICE9 lpd3ddev)

引数: lpd3ddev 描画に使用するDirect3D9 デバイス。

引数に指定された Direct3D9 デバイスに対して描画を行う。
ワールド行列やビュー行列については、 FrameMove, AdjustAnimation, ResetAnimation のいずれかのメソッド に最後に渡した行列が使用される。


virtual void RenderWithoutMaterials(LPDIRECT3DDEVICE9 lpd3ddev,D3DMATERIAL9 *pMaterial)

引数:lpd3ddev:描画に使用するDirect3D9 デバイス。
pMaterials:描画に使用されるマテリアル。

引数に指定された Direct3D9 デバイスに対して描画を行う。
メッシュ内のマテリアルは無視し、引数のマテリアルを使用して描画する。
ワールド行列やビュー行列については、このメソッド呼び出しの前に設定しておく必要がある。


HRESULT FrameMove(D3DXMATRIX *pMatWorld, D3DXMATRIX *pMatView, FLOAT fElapsedTime)

引数:pMatWorld:階層構造を成すメッシュの根となるモデルに対するワールド行列。
pMatView:階層構造を成すメッシュの根となるモデルに対するビュー行列。
fElapsedTime:アニメーションを進める時間。
返値: 成功なら S_OK

引数 fElapsedTime に時間を与えて、アニメーションを進める。 時間は相対的に指定する。


HRESULT GetAnimationController(LPD3DXANIMATIONCONTROLLER *p)

引数: p:アニメーションコントローラを返す為のポインタ。
返値: 成功したら、S_OK

アニメーションコントローラを返す。アニメーションコントローラについては、 Direct3D のドキュメントを参照の事

【使用例(サンプル を参照)】

    LPD3DXANIMATIONCONTROLLER    pAnim = NULL;
    if (SUCCEEDED(g_pMesh->GetAnimationController(&pAnim))){
        LPD3DXANIMATIONSET    pAnimSet = NULL;
        if (SUCCEEDED(pAnim->GetAnimationSet(0,&pAnimSet))){
            period = (float)pAnimSet->GetPeriod();
            g_fTime += timeElapsed * (1.0f/60.0f);
            if (g_fTime > period)
                g_fTime -= period;

            pAnim->SetTrackAnimationSet(0,pAnimSet);
            pAnim->SetTrackEnable(0,true);
            pAnim->SetTrackSpeed(0,1.0f);
            pAnim->SetTrackWeight(0,1.0f);
            pAnim->SetTrackAnimTime(0,g_fTime);

            g_pMesh->ResetAnimation(&matWorld,g_pD3DEnv->GetSystemView());
            pAnimSet->Release();
        }
        pAnim->Release();    // ※
    }
※GetAnimationController メソッドはアニメーションコントローラのリファレンスカウントをインクリメントする為、 使用終了後すぐ、Release して、リファレンスカウントをデクリメントしている。


HRESULT AdjustAnimation(D3DXMATRIX *pMatWorld, D3DXMATRIX *pMatView)

引数:pMatWorld:階層構造を成すメッシュの根となるモデルに対するワールド行列。
pMatView:階層構造を成すメッシュの根となるモデルに対するビュー行列。
返値: 成功なら S_OK

アニメーションに変更を加えずに、ワールド行列とビュー行列を更新する。


HRESULT ResetAnimation(D3DXMATRIX *pMatWorld, D3DXMATRIX *pMatView)

引数:pMatWorld:階層構造を成すメッシュの根となるモデルに対するワールド行列。
pMatView:階層構造を成すメッシュの根となるモデルに対するビュー行列。
返値: 成功なら S_OK

アニメーションのグローバルタイムをゼロリセットし、ワールド行列とビュー行列を更新する。


void ResetAnimationMatrices()

引数:なし。
返値: 成功なら S_OK

アニメーションに使用している行列を全て初期状態に戻す。


void SetFog(FLOAT fStart, FLOAT fEnd)

引数:fStart:フォグのかかり始めるZの値。
fEnd:フォグがもっとも濃くなるZの値。

頂点フォグの開始点と終了点を設定する。現在は線形フォグのみサポートする。

【使用例】
g_pMesh->SetFog(6.0f,10.0f);
lpd3ddev->SetRenderState(D3DRS_FOGENABLE,TRUE);
lpd3ddev->SetRenderState(D3DRS_FOGCOLOR,D3DCOLOR_XRGB(168,168,168));
g_pMesh->Render(lpd3ddev);


HRESULT AddAnimation(TCHAR *fname)

引数: fname:追加読み込みするファイル名。
返値: 成功したら S_OK

アニメーションを追加読み込みする。メッシュファイルは、InitDeviceObjects メソッドで 読み込まれる為、InitDeviceObject をオーバライドする等で、InitDeviceObjects が 呼ばれる度にアニメーションを読み込む様にする必要がある。


void SetLightEnable(DWORD dwNum,BOOL bLight)

引数:dwNum:不使用(0を指定すること)。
bLight:TRUE であれば有効、FALSE であれば無効。

照光計算を有効または無効にする。


void RenderBones(LPDIRECT3DDEVICE9 lpd3ddev)

引数:lpd3ddev:描画用のデバイス。

本来不可視であるボーンをスクリーンに描画する。


D3DQuickLib のTOPページへ。