BaseCrossDx12ドキュメント
【Sample102】モデルの描画
このサンプルは
Samples/Sample102ディレクトリ内にあります。
VisualStdioで該当ソリューション(VS2022では
BaseCrossDx12VS2022.sln、VS2026では
BaseCrossDx12VS2026.sln)を開いてください。
ビルド後実行すると、以下の画面が現れます。
このサンプルでは
スキンメッシュモデルを描画したものです。前項のように
プレイヤーも実装してますが、これはモデルをあちこちの角度から眺められるためです。
リソースの登録
リソース登録は
Scene::CreateAssetResources()関数で行います。構造は前項と変わりません。
void Scene::CreateAssetResources(ID3D12Device* pDevice, ID3D12GraphicsCommandList* pCommandList)
{
//テクスチャ
auto texFile = App::GetRelativeAssetsDir() + L"sky.jpg";
auto texture = BaseTexture::CreateTextureFlomFile(pCommandList, texFile);
RegisterTexture(L"SKY_TX", texture);
texFile = App::GetRelativeAssetsDir() + L"trace.png";
texture = BaseTexture::CreateTextureFlomFile(pCommandList, texFile);
RegisterTexture(L"TRACE_TX", texture);
//ステージ作成
ResetActiveStage<GameStage>(pDevice);
}
スキンメッシュモデル
モデルクラスは
Character.h/cppにあります。
BoneModelクラスです。以下は
Character.hに記述がある宣言部です。
//--------------------------------------------------------------------------------------
// モデルオブジェクト
//--------------------------------------------------------------------------------------
class BoneModel : public GameObject {
std::shared_ptr<BaseMesh> m_baseMesh;
double m_totalTime;
public:
BoneModel(const std::shared_ptr<Stage>& stage, const TransParam& param);
virtual ~BoneModel();
virtual void OnCreate()override;
virtual void OnUpdate(double elapsedTime)override;
};
このサンプルは
スキンメッシュを実装した
ボーンモデルを説明するためのものですが、できるだけ単純にしてあります。
ですので、モデルにテクスチャも入ってないし、衝突判定も入ってません。以下は実装部です。
//--------------------------------------------------------------------------------------
// モデルオブジェクト
//--------------------------------------------------------------------------------------
BoneModel::BoneModel(const std::shared_ptr<Stage>& stage, const TransParam& param) :
GameObject(stage),
m_totalTime(0.0)
{
m_transParam = param;
}
BoneModel::~BoneModel() {}
void BoneModel::OnCreate() {
//コマンドリストの取得
ID3D12GraphicsCommandList* pCommandList = BaseScene::Get()->m_pTgtCommandList;
//モデルメッシュの作成
m_baseMesh = BaseMesh::CreateSingleBoneModelMesh(
pCommandList,
App::GetRelativeAssetsDir(), L"SeaLife_Rigged\\Green_Sea_Turtle_Maya_2018.fbx"
);
//シャドウマップをつける
auto ptrShadow = AddComponent<Shadowmap>();
ptrShadow->AddBaseMesh(m_baseMesh);
//BcPNTBoneDraw描画コンポーネントをつける
auto ptrDraw = AddComponent<BcPNTBoneDraw>();
ptrDraw->AddBaseMesh(m_baseMesh);
}
void BoneModel::OnUpdate(double elapsedTime) {
//2秒で一回りするアニメーション
m_totalTime += elapsedTime;
if (m_totalTime >= 2.0) {
m_totalTime = 0.0;
}
//描画コンポーネントを取り出して
//アニメーションを更新する
auto ptrDraw = GetComponent<BcPNTBoneDraw>();
ptrDraw->UpdateAnimation(m_totalTime);
}
ここで重要なのは
BoneModel::OnUpdate()関数です。
m_totalTimeは
double型のメンバ変数で
0.0に初期化されます。
BoneModel::OnUpdate()関数は前回のターンからの経過時間が渡されるので、それを
m_totalTimeに加算して。それが
2.0を超えたら
0.0に戻すという処理です。その変数は描画コンポーネントの
UpdateAnimation()関数に渡されます。これだけで
ボーンアニメーションが実装できます