2010-11-03 14 views
6

Estoy tratando de entender la función glLookAt.Función OpenGL LookAt: ¿el vector ascendente es arbitrario?

Se necesitan 3 trillizos. El primero es la posición del ojo, el segundo es el punto en el que el ojo mira. Ese punto aparecerá en el centro de mi ventana gráfica, ¿verdad? El tercero es el vector 'arriba'. Entiendo el significado del vector 'arriba' si es perpendicular al vector del ojo al punto fijo. La pregunta es, ¿está permitido especificar otros vectores para arriba, y, si es así, cuál es el significado, entonces?

Un enlace a una explicación gráfica detallada de gluPerstpective, glLookAt y glFrustum sería también muy apreciada. La documentación oficial de OpenGL no parece ser para novatos.

Tenga en cuenta que entiendo el significado de un vector ascendente cuando es perpendicular al vector eye-> object. La pregunta es cuál es el significado (si hay alguno), si no lo es. No puedo resolverlo jugando con parámetros.

+0

Muchas gracias a todos. Cada respuesta tiene un poco de información útil. Y mi pregunta es respondida Gracias –

Respuesta

10

Funciona siempre que sea "suficientemente perpendicular" al vector ascendente. Lo que importa es el plano entre el vector ascendente y el vector de observación.

Si estos dos se alinean, la dirección ascendente será más o menos aleatoria (basada en los bits muy pequeños en sus valores), ya que un pequeño ajuste de la misma la dejará apuntando arriba/izquierda/derecha de la mirada- en el vector.

Si tienen un ángulo de separación suficientemente grande (en matemática de punto flotante de 32 bits) funcionará bien. Este ángulo no suele ser más de un grado, por lo que pueden estar muy cerca. Pero si la diferencia se reduce a unos pocos bits, cada bit modificado producirá un gran cambio direccional.

Se trata de precisión numérica.

(estoy seguro de que hay más términos matemáticos & definiciones para esto, pero ha pasado unos años desde la universidad .. :)

última palabra: Si los vectores son paralelos, entonces el UP- la dirección es completamente indefinida y obtendrás una matriz de vista degenerada.

+0

Gracias. ¿Podrías mirar mi comentario a la respuesta de thecoshman? ¿Es esto lo que quieres decir? –

+0

Lo que está diciendo es que si su vector ascendente es (0,1,0) y usted decide alinear su ojo y objeto para que la normalidad de eye-> object sea (o muy cercana a) (0,1,0)) encontrará que la cámara podría girar o girar en un ángulo indefinido. Sin embargo, he descubierto que en la práctica, que esto no sucede, nunca alineo los dos lo suficiente como para entrar en este problema. – thecoshman

+0

@Armen: Correcto. Y a medida que la proyección se hace más pequeña (a medida que el vector ascendente y el vector lookat se vuelven colineales) la dirección de la proyección (que es lo que importa) cambiará abruptamente con pequeños cambios en cualquiera de los vectores. Es solo entonces que vas a tener problemas. – Macke

0

Sí. Es arbitrario, lo que le permite hacer que la cámara "gire", es decir, que parezca que la escena gira alrededor del eje del ojo.

+0

Quiero decir que sé que es arbitrario siempre que sea perpendicular al eje del ojo, pero ¿qué pasa cuando no lo es? Todavía no me imagino el significado ... –

2

En esta página web tienen un gran tutorial

http://www.xmission.com/~nate/tutors.html

http://users.polytech.unice.fr/~buffa/cours/synthese_image/DOCS/www.xmission.com/Nate/tutors.html

descargar los archivos ejecutables y puede cambiar los valores de los parámetros de la función glLookAt y ver qué pasa "en tiempo real".

+0

Gracias! ¡Esto fue realmente útil! –

+0

Y como siempre con contenido vinculado: "Error 404 - Documento no encontrado" – Kromster

+1

@KromStern, gracias por señalarlo. He actualizado la respuesta con un nuevo enlace. – bruno

3

El vector ascendente permite que openGL sepa de qué manera tiene su cámara.

Piense en el mundo real, si tiene puntos en el espacio, puede trazar una línea de uno a otro. Luego puede alinear un objeto, como una cámara, de manera que apunte de uno a otro. Pero no tienes manera de saber cómo objetar debe rotar alrededor de este eje que hace la línea. El vector ascendente indica en qué dirección debe estar la cámara.

la mayor parte del tiempo, su vector ascendente será (0,1,0) lo que significa que la cámara se girará como lo haría normalmente con una cámara, o si mantuvo la cabeza erguida. si configura su vector ascendente (1,0,0), sería como sostener la cabeza de lado, por lo tanto, desde la base de la cabeza hasta la parte superior de la cabeza, apuntando hacia la derecha. Todavía estás mirando desde el mismo punto (más o menos) al mismo punto, pero tu 'arriba' ha cambiado. Un vector de aspecto de (0, -1,0) haría que la cámara esté boca abajo, como si estuvieras haciendo una parada de manos.

Una forma en que podría pensar en esto, su brazo es un vector desde la posición de la cámara (su hombro) a la cámara en su punto (su dedo índice) si saca su pulgar, este es su vector ascendente.

Esta imagen podría ayudarle a http://images.gamedev.net/features/programming/oglch3excerpt/03fig11.jpg

eidt

perpendicular o no.

Veo lo que está preguntando ahora.ejemplo, usted en (10,10,10) mirando (0,0,0) el vector resultante para su dirección de mirada es (-10, -10, -10) el vector perpendicular a esto no importa con el propósito de you up vector glLookAt, si quieres que la vista esté orientada para que seas como una persona normal que solo mira un poco hacia abajo, simplemente configura el vector en (0,1,0) De hecho, a menos que quieras poder rodar la cámara, no necesitas que esto sea otra cosa.

+0

Muchas gracias, pero todavía no entiendo qué sucede si el vector ascendente NO es perpendicular al vector del ojo al objeto –

+0

Supongamos que A es el plano perpendicular al vector ojo-> objeto. ¿Estás diciendo que solo importa la proyección en el plano A del vector ascendente? –

+0

erm ... déjame pensar aquí. si, yo pienso. Todo lo que puedo decir con certeza es que el objeto-ojo apunta muy hacia arriba o hacia abajo, el mismo vector de arriba todavía funciona. No tengo que trabajar lo que es perpendicular a mi vector de búsqueda, si OpenGL lo necesita, entonces lo está resolviendo por sí mismo (para ti) – thecoshman

-4

Paso afuera, mira la luna. El horizonte está en la parte inferior. Inclina tu cabeza hacia la izquierda, el horizonte gira hacia la derecha. El vector ascendente es la orientación de tu cabeza.

+0

Dondequiera que incline mi cabeza, el vector ascendente seguirá siendo perpendicular al vector yo mismo> luna.Mi pregunta es qué sucede cuando no es –

+0

No estoy seguro de por qué querría complicarlo, pero seguramente calcula lo normal. Solo giraría fuera de control cuando el vector ascendente coincida con el vector de vista. –

1

El vector ascendente no tiene que ser perpendicular a la dirección de observación. Mientras no esté paralelo (o muy cerca de ser paralelo) a la dirección de observación, deberías estar bien.

Dado que tiene un plano de vista normal, N (la dirección de mira) y un vector ascendente (que no debe ser paralelo a N), UV calcula el vector ascendente real que se utilizará en la cámara transformada por primero calculando el vector V = UV - (N * UV) N. A su vez, V se usa para calcular el vector ascendente real usado al crear un vector que es perpendicular tanto a N como a V como U = N x V.

Cuestiones relacionadas