gluperspective ejemplo opengl glulookat

ejemplo - ¿Qué es exactamente el vector UP en la función LookAt de OpenGL?



opengl camera (4)

Funciona exactamente de la manera en que parece que funciona.

Imagina que estás en algún punto del espacio. Y ellos imaginan que estás mirando algunas unidades de punto 2000 directamente en la dirección -Z de ti.

Hay un número infinito de cámaras posibles con estas características, pero son diferentes basándose únicamente en tener una dirección "hacia arriba" diferente. Entonces las diferentes direcciones "hacia arriba" corresponden a tener una orientación diferente alrededor de la dirección de visión.

El vector ascendente es la dirección vectorial alineada con la dirección "ascendente" que desea que tenga la cámara. Es decir, si dibujaras el vector ascendente desde el punto de tu cámara, verías una línea vertical recta apuntando hacia arriba.

Ahora, mira hacia atrás a tu vista imaginada, y mira esa línea vertical. ¿Podría decir si esa línea vertical se estaba moviendo hacia o lejos de usted? No; es solo una línea vertical. Por lo tanto, no importa si el vector ascendente apunta parcialmente en la dirección de la vista. Lo que importa es que la dirección hacia arriba no apunta exactamente en la dirección de la vista.

Cuando le das a la dirección hacia arriba una coordenada Z que no es cero, ahora apunta parcialmente en la dirección de la vista (es decir, el eje Z). Esa parte es en última instancia irrelevante para la dirección ascendente que obtienes, por lo que se ignora. Cuando le das a la dirección hacia arriba una coordenada X distinta de cero, eso no está en la dirección de la vista, por lo que es significativo.

El objetivo de esto es que si cambias el punto de vista de la vista o el punto de origen de la cámara, no tienes que cambiar la dirección hacia arriba también. Mientras no mires directamente a lo largo del eje ascendente, estarás bien.

esto está relacionado con la ubicación de destino de LookAt no importa si es z = 0 o z = 1000 o -1000?

Lo intenté

gluLookAt(512, 384, 2000, 512, 384, 0, 0.0f, 1.0f, 0.0f);

y las cosas funcionan bien, y ahora cambio la tercera fila (el vector UP), el último número a 0.8 :

gluLookAt(512, 384, 2000, 512, 384, 0, 0.0f, 1.0f, 0.8f);

y es exactamente lo mismo ... luego probé y modifiqué la 3ra línea, el primer número a 0.8 :

gluLookAt(512, 384, 2000, 512, 384, 0, 0.8f, 1.0f, 0.8f);

Ahora la vista es como si giró 45 grados hacia la izquierda. ¿Cómo funciona este vector UP?


Los dos primeros parámetros de gluLookAt son la posición de la cámara y el objetivo de la cámara. Con solo esos dos, la cámara no está totalmente restringida. Imagínate parado en alguna parte sosteniendo una cámara. Puede sostener la cámara horizontalmente para tomar una imagen de paisaje, o puede sostener la cámara verticalmente para tomar una imagen de retrato. En ambos casos, la posición de la cámara y la posición del sujeto de la imagen son las mismas. Podría girar la cámara en cualquier ángulo y esos dos valores no cambiarán. El tercer parámetro, el vector ascendente, selecciona la orientación de la cámara.


El vector ascendente determina qué dirección está "arriba". Piense en ello como una cámara de video ... si sostiene la cámara "correctamente", entonces una línea imaginaria que va hacia arriba desde el centro de la cámara a la parte superior de la cámara podría representarse por un vector (0,1,0) . Si inclina la cámara 45 grados hacia la derecha, la línea imaginaria que va desde el centro de la cámara a la "parte superior" de la cámara se representará ahora con un nuevo vector (1,1,0). Si luego inclina la cámara "hacia atrás" un poco, su vector "ascendente" ahora se convierte en (1,1,1) [o (1,1, -1) ... Siempre obtengo la polaridad del eje z invertido].

Entonces, en resumen, el vector UP describe el giro de la cámara diciendo qué punto está "arriba" en la orientación de la cámara.

Espero que ayude. :)

(editar para corregir el resumen según el comentario)


El vector ascendente se usa para crear un producto cruzado entre el ojo y el vector central suministrado a gluLookAt.

Desde los encabezados GLKit en iOS, puede ver la implementación como:

static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) { GLKVector3 ev = { eyeX, eyeY, eyeZ }; GLKVector3 cv = { centerX, centerY, centerZ }; GLKVector3 uv = { upX, upY, upZ }; GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv))); GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n)); GLKVector3 v = GLKVector3CrossProduct(n, u); GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f, u.v[1], v.v[1], n.v[1], 0.0f, u.v[2], v.v[2], n.v[2], 0.0f, GLKVector3DotProduct(GLKVector3Negate(u), ev), GLKVector3DotProduct(GLKVector3Negate(v), ev), GLKVector3DotProduct(GLKVector3Negate(n), ev), 1.0f }; return m; }

La respuesta aceptada en esta pregunta ¿Cómo uso gluLookAt correctamente? proporciona una buena descripción de lo que el vector ascendente realmente impacta.

(La intuición detrás del vector "arriba" en gluLookAt es simple: mire cualquier cosa. Ahora incline la cabeza 90 grados. Donde usted no ha cambiado, la dirección que está mirando no ha cambiado, pero la imagen en su la retina claramente tiene. ¿Cuál es la diferencia? A dónde apunta la parte superior de la cabeza. Ese es el vector ascendente).