web-dev-qa-db-ja.com

頂点をカリングのためにOpenGLに送信する順序

私は3d openglのスポットを学習しています。それは順調に進んでいます。現時点では、Niceカメラが動き回っており、いくつかの単純な立方体オブジェクトがあります。現在頂点配列を使用していますが、ここではVBOにすばやく切り替えています。カリングを有効にしようとしているだけですが、頂点を指定する順序がわからないので、今は次のようにしています。

_void cube::update_verts(){
GLushort cur=0;

///back face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;

///right face
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;

///top face
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;

///front face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;

///bottom face
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;

///left face
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;


}

///Drawing Code:

glVertexPointer(3,GL_FLOAT,0,object.verts);
glColorPointer(3,GL_UNSIGNED_BYTE,0,object.colors);
glDrawArrays(GL_QUADS,0,6*4);
_

しかし、私がglEnable(GL_CULL_FACE);を実行すると、立方体が正しい面を表示しないため、これは間違いなく間違いです(以下を参照)。

通常 Regular View From Top

問題のある子 View From Side

これらの画像の両方で、カリングが有効になります。

頂点を指定する順序は?


(編集)更新された作業関数:

_void cube::update_verts(){
GLushort cur=0;

///top face
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;


///bottom face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;

///left face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;

///right face
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;

///front face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz;


///back face
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z;
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z;
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z;

}
_
28
ultifinitus

デフォルトでは?反時計回りの順序で。

カメラに面している三角形を考えます。

_A
|\
| \
|  \
B---C
_

A-> B-> Cは前向き(反時計回り)、A-> C-> Bは後ろ向き(時計回り)です。

glFrontFace() を使用して、OpenGLが「正面を向く」と見なす方法を変更できます。

ポリゴンのウィンドウ座標への投影は、最初の頂点、2番目の頂点などから最後の頂点までのパスをたどり、最後に最初の頂点に戻る仮想オブジェクトが、ポリゴンの内部を中心とする時計回りの方向。同じパスをたどる架空のオブジェクトがポリゴンの内部を中心に反時計回りに移動する場合、ポリゴンのワインディングは反時計回りと呼ばれます。 glFrontFaceは、ウィンドウ座標が時計回りに曲がっている、またはウィンドウ座標が反時計回りに曲がっているポリゴンを前面に配置するかどうかを指定します。 _GL_CCW_をmodeに渡すと、反時計回りのポリゴンが正面を向きます。 _GL_CW_は、時計回りのポリゴンを前面に選択します。

デフォルトでは、反時計回りのポリゴンが正面を向いていると見なされます。

頂点の順序を決めるには、理想的な立方体を考えます。

_  6---7
 /|  /|
2---3 |
| 4-|-5
|/  |/ 
0---1
_

それぞれの顔について、カメラ(あなたの心の目)に向かって頭を回転させます。

_Sides:
2---3  3---7  7---6  6---2
|   |  |   |  |   |  |   |
|   |  |   |  |   |  |   |
0---1  1---5  5---4  4---0

Bottom/Top
0---1  6---7
|   |  |   |
|   |  |   |
4---5  2---3
_

次に、四角形または三角形のペアを反時計回りの正しい順序で視覚的に読み取ることができます。

_2---3                3         2---3 
|   |  becomes      /|   and   |  / 
|   |             /  |         |/ 
0---1            0---1         0 

Triangles 0-1-3 and 0-3-2
Quad 0-1-3-2
_
109
genpfault

「右手の法則」として知られている、頂点の順序を決定するための別の経験則(文字通り)を学びました。
親指を立方体の中心に向けた状態で、開いた手(右)を立方体の内側に想像してください。次に手をこぶしに曲げると、指が頂点を正しい順序で通過します。これには右手を使用しているため、「右手ルール」と呼ばれます。

逆に、左手から始めて親指を立方体の中心から遠ざけると、指は再び正しい順序で頂点をスイープします。これは「左手の法則」(驚き)として知られています。

どちらの方法でも、反時計回りの順序になります。時計回りに注文するには、反対の手を使用します。

6