自分でランダムな地形?を作って表示する。テクスチャもつける
🌱 ステップ①:データの設計(どんな情報を使うか?)
地形を作るには「たくさんの点(てん)」が必要です。
この点は「頂点(ちょうてん)」と呼ばれていて、1つ1つの頂点には次のような情報があります:
名前 | 何の情報? |
|---|---|
position | その点がどこにあるか(x, y, z) |
normal | 光の当たり方(かたむき) |
uv | 絵(テクスチャ)の貼り方 |
これをたくさん集めて、「地面の形」を作っていきます。
地面の形は三角形をたくさん並べてできていて、三角形のつなぎ方を indices という番号のデータで管理します。
🧺 ステップ②:データの準備(どうやってデータを持っておく?)
C++のクラスで、Terrain(テレイン)という「地面クラス」を作ります。
中にはこんな変数があります:
std::vector<Vertex> vertices_; // 点の集まり(地面の形)
std::vector<uint32_t> indices_; // 三角形のつなぎ方(番号)
int width, height; // 地面の横と縦のマスの数
float scale; // 1マスの大きさ(例:1.0f = 1メートル)このクラスで、地面を作ったり、表示したりできるようになります!
🌋 ステップ③:ランダムに地形を作る(でこぼこをつけよう!)
MakeTerrain() という関数で、地面をランダムにでこぼこさせます。
ここでは「サイコロのような乱数(ランスウ)」を使って、山や谷を作ります:
float y = ランダムな数 * 高さの倍率;そして、点を1マスずつ作っていきます:
for (int z = 0; z < 高さのマス数; z++) {
for (int x = 0; x < 横のマス数; x++) {
Vertex v;
v.position = { xの位置, yの高さ, zの位置 };
...
vertices_.push_back(v);
}
}そのあと、「マス」を三角形2枚にわけて、indices_ に三角形を作ります。
例として、横5×縦4の頂点グリッド(幅5×高さ4)を使います。
■ 地形の頂点の並び(vertices_のインデックス)
z方向(奥行き)
↑
|
| (0,0) (1,0) (2,0) (3,0) (4,0)
| 0 1 2 3 4
|
| (0,1) (1,1) (2,1) (3,1) (4,1)
| 5 6 7 8 9
|
| (0,2) (1,2) (2,2) (3,2) (4,2)
| 10 11 12 13 14
|
| (0,3) (1,3) (2,3) (3,3) (4,3)
| 15 16 17 18 19
+--------------------------------------→ x方向(横)■ 説明
vertices_という動的配列には、上から下、左から右の順番で頂点が入っています。vertices_[0]は左上、vertices_[19]は右下の頂点です。- 各頂点には
x, y, zの位置や、法線(normal)、UVなどの情報が入っています。
■ 使いどころ
この並び順は次の処理で使われます:
インデックスの生成(3つで三角形を作る)GetHeight(x, z)で高さを調べる- テクスチャのUVを計算する
🖼️ ステップ④:地形を画面に表示する(ゲームの絵にする!)
できあがった vertices_ と indices_ を「GPU(じーぴーゆー)」に送って、DirectXで描きます。
context->IASetVertexBuffers(...); // 頂点(点)の情報をセット
context->IASetIndexBuffer(...); // 三角形のつなぎ方をセット
context->DrawIndexed(...); // 実際に画面に描く!描くときには、光の当たり方や、テクスチャ(地面の絵)も設定して、見た目をよくします。
✅ まとめ
ステップ | やることの意味 |
|---|---|
データの設計 | 地面に必要な情報を決める(点や三角形) |
データの準備 | 地面の形を覚えるための変数を作る |
ランダム地形生成 | 高さをランダムに決めて地形を作る |
地形の表示 | 地形のデータをGPUに送って画面に描く |
ここまでくれば、あとはQuadクラスを作ってテクスチャ張った時とほぼ同じだよ。
それが、地形の大きさで並んでるだけだと思えばいいです。
No Comments