En Qué Orden Debo Enviar Mis Vértices A OpenGL para El Sacrificio


Estoy aprendiendo un punto de opengl 3d, y va bastante bien, tengo una buena cámara en movimiento y algunos objetos simples de cubo, en este momento. Actualmente usando matrices de vértices, pero estoy intercambiando a VBOs bastante rápido aquí. Solo estoy tratando de habilitar el sacrificio, sin embargo, no estoy seguro de qué orden en el que debo especificar mis vértices, ahora mismo esto es lo que estoy haciendo:

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);

Sin embargo, definitivamente es bastante incorrecto, porque cuando glEnable(GL_CULL_FACE); mis cubos no muestran las caras correctas (como se ve debajo).

Normal Vista Regular Desde Arriba

Niño problemático Vista Desde Un Lado

Con ambas imágenes se habilita el sacrificio.

¿En qué orden debo especificar los vértices?


(EDITAR) Función de trabajo actualizada:

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;

}
Author: ultifinitus, 2011-11-16

2 answers

Por defecto? En orden antihorario.

Considere un triángulo frente a la cámara:

A
|\
| \
|  \
B---C

A->B->C estaría orientado hacia delante (en sentido contrario a las agujas del reloj), A->C->B estaría orientado hacia atrás (en sentido contrario a las agujas del reloj).

Puede cambiar la forma en que OpenGL considera "frente" a través de glFrontFace():

Se dice que la proyección de un polígono a las coordenadas de la ventana tiene enrollamiento en el sentido de las agujas del reloj si un objeto imaginario sigue la trayectoria de su primer vértice, su segundo vértice, y así sucesivamente, a su último vértice, y finalmente de vuelta a su primer vértice, se mueve en el sentido de las agujas del reloj el interior del polígono. Se dice que la bobina del polígono es en sentido contrario a las agujas del reloj si el objeto imaginario que sigue la misma ruta se mueve en sentido antihorario sobre el interior del polígono. glFrontFace especifica si los polígonos con devanado en sentido horario coordenadas de ventana, o bobinado en sentido antihorario en coordenadas de ventana, son de frente. Pasar GL_CCW a mode selecciona polígonos en sentido contrario a las agujas del reloj; GL_CW selecciona en sentido de las agujas del reloj polígonos como frente.

De forma predeterminada, los polígonos en sentido contrario a las agujas del reloj se consideran frontales.

Para ordenar sus vértices, considere un cubo ideal:

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

Para cada cara mentalmente girarla hacia la cámara (el ojo de tu mente):

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

Entonces puede leer visualmente los pares de cuadrantes o triángulos a la derecha orden en sentido contrario a las agujas del reloj:

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
 99
Author: genpfault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 03:47:16

Aprendí otra regla general (literalmente) para determinar el orden de vértices conocida como la "regla de la mano derecha".
Imagina tu mano abierta (derecha) dentro del cubo con tu pulgar apuntando hacia el centro del cubo. Si luego rizas tu mano en un puño, tus dedos pasarán los vértices en el orden correcto. Puesto que usted está usando su mano derecha para esto se llama la "regla de la mano derecha".

Por el contrario, si empiezas con la mano izquierda y apuntas con el pulgar en el centro del cubo, tus dedos barrerán de nuevo los vértices en el orden correcto. Esto se conoce como la "regla de la mano izquierda" (sorpresa).

Ambos métodos funcionan para darle orden en sentido contrario a las agujas del reloj. Para ordenar en el sentido de las agujas del reloj, simplemente use la mano opuesta.

 6
Author: TopSecretPorkChop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-22 19:06:00