1

隣り合った一連の立方体を描いていますが、それらが役に立たないため、接触しているすべての側面をカリングしたいと考えています。問題は、側面を選別する方法がわからないことです。glBegin()/glEnd() 呼び出しで呼び出されているキューブの側面をカリングする方法を誰かが説明できますか?

4

2 に答える 2

2

OpenGL はこれを行いません。自分で選別する必要があります。

最近のプロジェクトで次のことを行いました。

立方体の位置のコレクションから、各面のエントリをディクショナリに追加しました。これは、顔の中心位置を顔の法線にマッピングしました。新しい (ポジション、ノーマル) ペアを追加する前に、そのポジションの存在をテストします。見つかった場合: 既存のエントリを削除し、新しいエントリを破棄します。それ以外の場合は、新しい (位置、法線) を追加します。

このディクショナリから、頂点と三角形のリストを作成でき、面が接触することはありません。

これを行うにはもっと効率的な方法があるかもしれませんが、これは私のアプリケーションには十分であり、実装も簡単でした。

編集:

PSEUDOCODE:

d = dictionary<vec3, vec3>

for each cube:
    for face 1..6:
        pos = faceCenterFor(cube, face)
        if pos in d:
            remove d[pos]
        else:
            d[pos] = normalFor(cube, face)

for each (pos, normal) in d:
    draw(vertsForFace(pos, normal))
    # or save verts to an array for drawing later
于 2011-06-07T17:58:32.263 に答える
0

立方体の面法線を確実に指定する場合は、少なくとも背面カリングを有効にすることができます ( glEnable())。ただし、立方体の側面については、手動でカリングする必要がある可能性があります。

ただし、側面の法線を後ろ向きに設定して、背面のカリングによって拾われるようにすることもできます。

(例) を使用して各面の法線を指定します。

gl.glNormal3f(1, 0, 0);

バック フェース カリングの使用:

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
于 2012-08-06T17:46:47.517 に答える