Skip to main content

自分でランダムな地形?を作って表示する。テクスチャもつける

🌱 ステップ①:データの設計(どんな情報を使うか?)

地形を作るには「たくさんの点(てん)」が必要です。
この点は「頂点(ちょうてん)」と呼ばれていて、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クラスを作ってテクスチャ張った時とほぼ同じだよ。
それが、地形の大きさで並んでるだけだと思えばいいです。