0

で作られた高さマップがありglVertex3f、マウスを使用して特定のポイントで高さを動的に変更できる方法が必要です。これは、Simcity のようなゲームがこの youtube クリップのような地形を作成するときに行うのとほぼ同じです。

これは、地形を作成するための高さマップ ループです。

for(float x = 0.0; x < MAP_WIDTH; x += d)
{
    for(float z = 0.0; z < MAP_HEIGHT; z += d)
    {
        glColor3f(1.0f,1.0f,1.f);

        glBegin(GL_TRIANGLE_FAN);   

            Color(HeightMap[(int)x][(int)z]);
            glVertex3f( x, HeightMap[(int)x][(int)z], -z);

            Color(HeightMap[(int)x+d][(int)z]);
            glVertex3f( x+d, HeightMap[(int)x+d][(int)z], -z);

            Color(HeightMap[(int)x+d][(int)z+d]);
            glVertex3f( x+d, HeightMap[(int)x+d][(int)z+d], -z+-d);

            Color(HeightMap[(int)x][(int)z+d]);
            glVertex3f( x, HeightMap[(int)x][(int)z+d], -z+-d);
        glEnd();
    }
}

ご覧のとおり、高さマップは 2 次元配列から「高さ」データを取得します。そのため、マウスでマップをクリックすると、2d 配列内の正しい要素を変更する必要があります。

gluLookAtそれが違いを生む場合、私は Camera クラスで使用します。

  • これについて最善の方法は何ですか?
  • 画面座標を地図座標に変換するにはどうすればよいですか?

補足: 非推奨だと聞きましたglBegin / glEndが、代わりに何を使用しますか、それともまったく必要ありませんか?

4

1 に答える 1

0

glBegin/glEnd を置き換えるには、Vertex Array Objects (VAO) を調べる必要があります。

それにもかかわらず、最初にそこにあるもので動作させることができ、後で最も効率的な API の使用法を使用することを心配することができると思います.

必要なのは、マウスの画面座標、地形のモデル、ビュー、投影行列を取得し、マウス カーソルをオブジェクト空間に返す gluUnprojectです。
次に、地形にレイキャストを実行し、レイが交差する頂点を持ち上げることができます。

于 2012-05-27T01:02:13.303 に答える