107.モデルの描画

このサンプルはFullTutorial007というディレクトリに含まれます。
 BaseCrossDx11.slnというソリューションを開くとDx11版が起動します。
 リビルドして実行すると以下の画面が出てきます。

 

図0107a

 


解説

 この項でのデータはモデルの描画です。モデルはFBXモデルとして作成し、あらかじめFbx2BinVS2015によって.bmfファイルとして作成しておき、mediaディレクトリに保存しておきます。

プレイヤー

 プレイヤーはPlayer.h/cppに記述があります。
 前項までの球体のオブジェクトと実装方法は基本的に変わりません。  変わる部分は描画コンポーネントPNTBoneModelDrawを使用するところと、衝突判定にCollisionCapsuleを使っているところです。ただし衝突はCollisionSphereを使用したほうが処理は速いです。
 また今回は前項までのプレイヤーの動きからボールの発射は抜いてあります。またステートマシン単純なものを使用しています。
 以下はPlayer::OnCreate()関数(抜粋)です。
//初期化
void Player::OnCreate() {

//中略

    //Rigidbodyをつける
    auto PtrRedid = AddComponent<Rigidbody>();
    //衝突判定をつける
    auto PtrCol = AddComponent<CollisionSphere>();
    PtrCol->SetIsHitAction(IsHitAction::Auto);
    //文字列をつける
    auto PtrString = AddComponent<StringSprite>();
    PtrString->SetText(L"");
    PtrString->SetTextRect(Rect2D<float>(16.0f, 16.0f, 640.0f, 480.0f));

    Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
    SpanMat.affineTransformation(
        Vec3(1.0f, 1.0f, 1.0f),
        Vec3(0.0f, 0.0f, 0.0f),
        Vec3(0.0f, XM_PI, 0.0f),
        Vec3(0.0f, -0.5f, 0.0f)
    );

    //影をつける(シャドウマップを描画する)
    auto ShadowPtr = AddComponent<Shadowmap>();

    //影の形(メッシュ)を設定
    ShadowPtr->SetMeshResource(L"Chara_R_MESH");
    ShadowPtr->SetMeshToTransformMatrix(SpanMat);

    //描画コンポーネントの設定
    auto PtrDraw = AddComponent<BcPNTBoneModelDraw>();
    //描画するメッシュを設定
    PtrDraw->SetMeshResource(L"Chara_R_MESH");
    PtrDraw->SetMeshToTransformMatrix(SpanMat);

    PtrDraw->AddAnimation(L"Default", 60, 20, true, 20.0f);
    PtrDraw->AddAnimation(L"Hit", 30, 30, false, 30.0f);
    PtrDraw->ChangeCurrentAnimation(L"Default");

//中略

}
 モデルのメッシュはL"Chara_R_MESH"という名前であらかじめリソース登録されています。GameStage.cppを参照ください。
 モデルを使う場合に注意したいのはモデルの大きさや向きです。ローカル座標の中心が、おなかの部分にある場合と足元にある場合もあるでしょう。これはモデルを作成するときに、モデル作成者と十分に話し合いを行い、またFbx2BinVS2015によるデータ作成時にも調整が必要ですが、それでも実際のステージ上の大きさなどと違っている場合、
    Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
    SpanMat.affineTransformation(
        Vec3(1.0f, 1.0f, 1.0f),
        Vec3(0.0f, 0.0f, 0.0f),
        Vec3(0.0f, XM_PI, 0.0f),
        Vec3(0.0f, -0.5f, 0.0f)
    );
 のようにモデルとトランスフォームの間の差分行列を作成し、
    PtrDraw->SetMeshToTransformMatrix(SpanMat);
 と差分行列を設定します。(影も同様です)
 このモデルはアニメーションがついています。アニメーションの設定は
    PtrDraw->AddAnimation(L"Default", 60, 20, true, 20.0f);
    PtrDraw->AddAnimation(L"Hit", 30, 30, false, 30.0f);
    PtrDraw->ChangeCurrentAnimation(L"Default");
 のように描画コンポーネントに設定します。
 それで、アニメーションを切り替えるタイミングで
    auto PtrDraw = GetComponent<PNTBoneModelDraw>();
    PtrDraw->ChangeCurrentAnimation(アニメーション名);
 と、描画コンポーネントで呼び出せばアニメーションが切り替わります。

スタティックモデル

 このサンプルにはもう一つモデルが配置されています。
 アニメションしないモデルです。これもあらかじめFbx2BinVS2015スタティックモデルとしてデータ化しておきます。
 スタティックモデルのオブジェクトはChgaracter.h/cppにあるStaticModelクラスです。以下はStaticModel::OnCreate()関数(抜粋)です。
//初期化
void StaticModel::OnCreate() {

//中略

    Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
    SpanMat.affineTransformation(
        Vec3(1.0f, 1.0f, 1.0f),
        Vec3(0.0f, 0.0f, 0.0f),
        Vec3(0.0f, 0.0f, 0.0f),
        Vec3(0.0f, -0.28f, 0.0f)
    );

    auto PtrColl = AddComponent<CollisionCapsule>();
    PtrColl->SetFixed(true);

    //影をつける(シャドウマップを描画する)
    auto ShadowPtr = AddComponent<Shadowmap>();
    //影の形(メッシュ)を設定
    ShadowPtr->SetMeshResource(L"MODEL_MESH");
    ShadowPtr->SetMeshToTransformMatrix(SpanMat);

    auto PtrDraw = AddComponent<BcPNTStaticModelDraw>();
    PtrDraw->SetFogEnabled(true);
    PtrDraw->SetMeshResource(L"MODEL_MESH");
    PtrDraw->SetMeshToTransformMatrix(SpanMat);
}
 ここでもL"Chara_Rst_MESH"はあらかじめリソース化しています。このモデルは表示と衝突判定だけするので、更新処理はありません。

 BaseCrossではゲームオブジェクトに対して形状や描画方法をコンポーネントによって設定することで別のタイプのオブジェクトを作成します。ですからゲームオブジェクトは、初期時は何もしない、何も表示しないオブジェクトです。このような仕様によって自由度の高いオブジェクトの作成を実装しています。