我正在学习一个3D opengl的位置,而且它相当不错,我现在有一个漂亮的相机和一些简单的立方体物体。目前正在使用顶点数组,但我在这里很快就交换到了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);
我的立方体没有显示正确的面孔时(如下所示)。
正常
问题孩子
使用这两种图像都可以进行剔除。
我应该以什么顺序指定顶点?
(编辑)更新后的工作职能:
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;
}
答案 0 :(得分:109)
默认情况下?按逆时针顺序。
考虑面向相机的三角形:
A
|\
| \
| \
B---C
A-> B-> C将是正面(逆时针顺序),A-> C-> B将是朝后的(顺时针顺序)。
您可以通过glFrontFace()
更改OpenGL认为“面向前方”的方式:
据说多边形投影到窗口坐标 顺时针缠绕,如果一个假想的物体跟随它的路径 第一个顶点,第二个顶点,依此类推,到它的最后一个顶点,和 最后回到它的第一个顶点,顺时针方向移动 多边形的内部。据说多边形的绕组是 逆时针,如果跟随相同路径的虚构对象移动 在围绕多边形内部的逆时针方向。
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
答案 1 :(得分:7)
我学会了另一个经验法则(字面意思)来确定被称为“右手规则”的顶点顺序 想象一下你的开放手(右)在立方体内,拇指指向立方体的中心。如果然后将手握成拳头,手指将以正确的顺序通过顶点。由于您正在使用右手,因此称为“右手规则”。
相反,如果您从左手开始并将拇指指向远离立方体的中心,您的手指将再次以正确的顺序扫描顶点。这被称为“左手规则”(惊喜)。
这两种方法都可以为您提供逆时针排序。对于顺时针排序,只需使用相反的手。