PR

【DXライブラリ】空などの背景を描画する(3Dゲーム版)

DXライブラリとC言語でゲーム制作。今回は3Dゲームでの空などの背景を描画する方法について。スカイドーム(スカイボックス)を使うのが一般的です。

どうやって空などの背景を描画する?

3Dゲームを作っていくと意外と詰まるポイントなのが背景の描画。2Dゲームなら背景用の画像を表示すればOKだが3Dゲームとなるとそうはいかない。

でっかい画像を用意してカメラの向きに合わせて描画する部分を求めて…というのもあるが、3Dゲームだとスカイドーム(スカイボックス)を利用して背景を描画するのが一般的。スカイドーム(スカイボックス)は巨大な半球型のモデルでそれにテクスチャを貼り付けて空、背景を表現するといった手法。Unityなどでもこれが使われている。

当然ながらスカイドーム(スカイボックス)用のモデルは3Dモデリングソフトで制作する。そんなに難しい作業ではないのでBlenderなどでさくっと作ろう。以下ここのブログ主の別サイトの記事。

【Blender4.5】スカイドーム(スカイボックス)を作る
Blenderで3D背景モデルとなるスカイドーム(スカイボックス)の作り方について説明しています。UV球を追加して面を反転、テクスチャを貼る。これでOK

サンプルコード

それでは実装。以前作った Map.cpp にスカイドーム(スカイボックス)を描画するコードを追加していく。

Map.cpp

#include "Player.h" //これをインクルードに追加

//マップの構造体
typedef struct {
	int ModelHandle; //モデルハンドル
	VECTOR Position; //マップの座標
}map_t;

//これを追加
map_t background;

まずはスカイドーム(スカイボックス)用の変数を用意。プレイヤーの座標に合わせて背景モデルの座標を更新するので Player.h をインクルードしておく。

そしてメイン処理を追加していく。

//マップの初期化
void Map_Initialize() {
	//以下の処理を追加
	//背景モデルの読み込み
	background.ModelHandle = MV1LoadModel("読み込みたい背景モデルのパス");

	//背景モデルの座標の初期化
	background.Position = VGet(0.0f, 0.0f, 0.0f);
}

//略

//マップの更新
void Map_Update() {
    //背景モデルの座標はプレイヤーの座標
    Player_GetPosition(&background.Position);
}

//マップの描画
void Map_Draw() {
    //背景の描画を追加
    MV1DrawModel(background.ModelHandle);

    //マップの描画
    MV1DrawModel(map.ModelHandle);
}

//マップの終了処理
void Map_Finalize() {
    MV1DeleteModel(background.ModelHandle);
    MV1DeleteModel(map.ModelHandle);
}

背景モデルを描画する際、どの3Dモデル・画像よりも一番早く描画するか、Zバッファを使用して描画をすること。そうしないと前後関係がおかしい描画結果になることがあるため。

そして Game.cpp の描画処理をする Game_Draw() を以下のように変更する。

Game.cpp

//描画
void Game_Draw() {
    //マップの描画。これが一番最初になるようにする。
    Map_Draw();

    //敵の描画
    EnemyMng_Draw();

    //プレイヤーの描画
    Player_Draw();

    //画像の描画
    //Image_Draw();
}

コメント

タイトルとURLをコピーしました