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
- Obtener de la cámara hacia arriba y la derecha vectores. Tenga en cuenta que deben normalizarse.
- Obtenga el vector desde el punto de enfoque a la cámara (camPosition - Focus). Este es el vector que vas a rotar. Llamemos esto camFocusVector .
- Decida cuánto desea rotar en guiñada / inclinación en relación con la cámara
- Crea dos matrices de rotación. La primera matriz de rotación usará la parte superior de la cámara como el eje y el ángulo de guiñada que usted decidió. La segunda matriz de rotación usará la derecha de la cámara como eje y paso de ángulo que se decidió.
- Ahora gire el camFocusVector con las nuevas matrices de rotación. Esta es ahora su nueva posición de la cámara en relación con el origen. Por supuesto, queremos que sea relativo al punto de enfoque ...
- Agregue la posición del punto de enfoque a camFocusVector . Esta es ahora la nueva posición de su cámara. Traduce tu cámara en consecuencia.
- Finalmente, pídale a la cámara que enfoque el punto de enfoque llamando a su función lookAt ()
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).