Mi cámara gira alrededor de un punto cuando trato de cambiar la orientación. Si giro la cámara, por ejemplo, 30 grados en el eje Y, en lugar de que la cámara mire 30 grados hacia la derecha, la cámara gira alrededor del punto que estaba mirando.¿Por qué mi cámara gira alrededor de un punto con esta matemática?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
Ahora, desde mi entender, para mover la cámara, tengo que mover el mundo por el inverso de esa cantidad. Entonces, si quiero mover +1 en el eje Z, traduzco el mundo -1 en el eje Z. Dado que estoy usando cuaterniones para representar orientaciones, utilizo la cámara inversa del cuaternión (ya que las orientaciones son siempre unidades de cuaterniones, optimizo usando el conjugado en lugar de calcular el inverso) para rotar el mundo en la cantidad correcta.
Aquí es cómo puedo convertir un cuaternión a una matriz, donde q es el cuaternión invertida:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
Después de eso, me puse el componente de traducción de la matriz:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
Y, por último Multiplico eso en la pila de matriz de vista de modelo, luego renderizo todos mis objetos. Estoy bastante seguro de que esta matemática es correcta, pero no produce los resultados que esperaba. Claramente, los vectores hacia adelante y hacia la derecha son el problema, entonces mi única pregunta es por qué están equivocados y cómo deberían establecerse si quiero obtener los resultados que estoy esperando. Gracias.
EDIT: He encontrado la solución desde this guy's quaternion camera class. Primero construyo una matriz de rotación como lo estaba haciendo antes, pero luego tomo los vectores de columna de la matriz de la primera, segunda y tercera columnas (xa, ya y za respectivamente). Entonces me puse el componente de traslación de la matriz de la siguiente manera:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
entonces la matriz resultante puede multiplicarse en la pila matriz modelview, y funciona perfectamente.
Haga de su edición una solución y acéptelo. Así es como marcamos las preguntas resueltas por aquí. También creo que mereces una explicación de lo que está pasando. Escribiré una respuesta para esto. – datenwolf