DXライブラリとC言語でゲーム制作。今回は3Dゲームでの空などの背景を描画する方法について。
どうやって空などの背景を描画する?
3Dゲームを作っていくと意外と詰まるポイントなのが背景の描画。2Dゲームなら背景用の画像を表示すればOKだが3Dゲームとなるとそうはいかない。
でっかい画像を用意してカメラの向きに合わせて描画する部分を求めて…というのもあるが、3Dゲームだとスカイドーム(スカイボックス)を利用して背景を描画するのが一般的。スカイドーム(スカイボックス)は巨大な半球型のモデルでそれにテクスチャを貼り付けて空、背景を表現するといった手法。Unityなどでもこれが使われている。
当然ながらスカイドーム(スカイボックス)用のモデルは3Dモデリングソフトで制作する。そんなに難しい作業ではないのでBlenderなどでさくっと作ろう。
実装
それでは実装。以前作ったMap.cppにスカイドーム(スカイボックス)を描画するコードを追加していく。
Map.cpp
//以下の変数を追加 static int SkyDoomHandle; //3D背景モデル static VECTOR SkyDoomPosition; //3D背景モデルの座標
まずはスカイドーム(スカイボックス)用の変数2つを用意。今回プレイヤーの座標を使うのでスカイドーム(スカイボックス)の座標も定義しておく。
そしてメイン処理を追加していく。
//マップの初期化 void Map_Initialize() { //中略 //背景モデルの読み込み SkyDoomHandle = MV1LoadModel("読み込みたいスカイドームの3Dモデル"); //背景モデルの座標の初期化 SkyDoomPosition = VGet(0.0f, 0.0f, 0.0f); } //マップの更新 void Map_Update() { //背景マップの座標はプレイヤーと同じにする Player_GetPosition(&SkyDoomPosition); } //マップの描画 void Map_Draw() { //背景を描画 ※一番最初に描画すること! MV1DrawModel(SkyDoomHandle); //マップの描画(省略) } //マップの終了処理 void Map_Finalize() { //以下をここに追加 MV1DeleteModel(SkyDoomHandle); }
Map_Initialize() でスカイドーム(スカイボックス)のモデルの読み込みと座標の初期化をする。Map_Update() ではスカイドーム(スカイボックス)の座標をプレイヤーと同じ座標にする。プレイヤーと同じ座標にする理由はどこから見ても同じ背景に見えるようにするため。
Map_Draw() で言わずもがなスカイドーム(スカイボックス)を描画するのだが、この描画が重要でどの3Dモデル・画像よりも一番早く描画するか、Zバッファを使用して描画すること。そうしないと前後関係がおかしい描画結果になる可能性があるため。
Zバッファを使うのが無難だと思うが、Game.cpp の Game_Draw() 内で Map_Draw() が最初になっていれば問題ないはず。
Game.cpp
//描画 void Game_Draw() { //マップの描画 ※これが一番最初に来るようにする Map_Draw(); //プレイヤー、敵などの描画(省略) }
Zバッファを使う場合は本家のリファレンスを参考に。

コメント