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