Estoy dibujando una escena en la que la cámara se mueve libremente por el universo. La clase de cámara realiza un seguimiento del punto de vista (o vista ), la posición de la cámara y el vector hacia arriba. Estos vectores / puntos se pasan a gluLookAt.
Pan y zoom son casi triviales de implementar. Sin embargo, yo estoy encontrando rotación alrededor del vistazo a punto de ser mucho más de un problema. Quiero escribir una función Camera.rotate que toma 2 ángulos, uno que gira hacia arriba / abajo y otro que gira hacia la izquierda / derecha a lo largo de una esfera imaginaria que se centra en el punto de mira .
¿Hay una forma fácil de hacer esto?
Leí (brevemente) sobre los cuaterniones, pero quería ver si había una solución más fácil dada la construcción relativamente simple de mi escena.
Respuestas:
Lo que está pidiendo se llama rotación de Arcball. Los cuaterniones son la solución fácil solo si comprende cómo funcionan. Sin embargo, puede lograr lo mismo sin cuaterniones.
Prerrequisitos
¿Sabes cómo rotar objetos en general? Digamos que tienes un objeto en el origen. ¿Sabes cómo lo giras (pista: multiplica por una matriz de rotación)? En caso afirmativo, supongo que sabe lo que sucederá si traduce el objeto primero y luego lo gira.
Debe saber cómo calcular una matriz de rotación a partir del eje angular (fácil como un pastel, mire la miríada de ecuaciones en línea, muchas de ellas también le dan el código)
Solución
Advertencias
Tendrá que buscar ciertos casos o singularidades en los que su cámara dejará de funcionar. Mirando hacia abajo / arriba, por ejemplo. Te dejaré descubrir cómo lidiar con eso.
EDITAR1: Cómo recalcular los vectores ortonormales de la cámara
Ya conoce la dirección de la cámara ((cameraPos - focusPoint) .normalize ()). Ahora suponga que su cámara está arriba + Y (o w / e el eje arriba actual de su mundo es ... eso depende de usted). Ahora simplemente cruce la dirección con la flecha hacia arriba para obtener la derecha . ¿Hecho? No! Su vector ascendente ya no es ortogonal a los otros dos. Para corregir esto, cruz derecha con dirección y se obtiene su nuevo arriba .
Tenga en cuenta que el Gram-Schmidt es realmente lo que debe usarse para ortonormalizar vectores.
Nuevamente, tome nota de las advertencias ya que esto no funcionará en algunos casos (la dirección es paralela a arriba, por ejemplo).
fuente
normalize(up ^ camFocusVector)
(o su opuesto si es zurdo).Lo que necesita es una cámara ArcBall típica, que es básicamente una cámara que mantiene una ubicación de destino y le permite mover la cámara de forma "esférica" alrededor de ese objetivo.
Está en XNA pero en IIRC. He usado esta implementación antes, y funcionó bastante bien:
http://roy-t.nl/index.php/2010/02/21/xna-simple-arcballcamera/
fuente
Aquí está mi código para girar alrededor de un punto, me encontré reutilizándolo mucho.
fuente
Este algoritmo muy simple para lograrlo es bastante impresionante:
Siendo P el punto central sobre el que desea rotar (el punto "mirar" u "objetivo"):
Lo usé y es agradable.
Fuente encontrada en el stackoverflow del sitio hermano: /programming/287655/opengl-rotating-a-camera-around-a-point
fuente