Por favor, perdónenme, pero necesito ayuda y he estado atrapado en esto por algunas semanas, no estoy progresando y en todos lados donde voy y veo una respuesta diferente, todo lo que intento no funciona. He tenido suficientes consejos y sugerencias, ahora realmente necesito que alguien me dé la respuesta para que pueda trabajar hacia atrás porque no puedo entender esto.
Lo que ha hecho que este tema sea más confuso es la forma en que todos usan un conjunto diferente de convenciones o reglas, y sus respuestas se basan en sus propias convenciones sin definir cuáles son.
Así que aquí está el conjunto de convenciones que he formado en base a lo que parece ser más común y lógico:
- Regla de la mano derecha para eje.
- Positivo Y está arriba, Positivo Z está hacia el espectador, Positivo X está a la derecha.
- Fila Matrices principales, transpuestas cuando se envían a sombreadores.
- Paso: rotación sobre el eje X
- Guiñada: rotación sobre el eje y
- Rollo: rotación sobre el eje z
- Orden de rotación: Roll, Pitch, Yaw (¿es correcto? ¿Alguien puede revisarme sobre esto?)
- Los valores de rotación positivos, mirando hacia abajo desde el extremo positivo de un eje, dan como resultado una rotación en el sentido de las agujas del reloj.
- La dirección predeterminada para la rotación 0 en todos los ejes es un vector que apunta hacia abajo a Y negativo.
.. dadas esas convenciones (¡por supuesto corrígeme si están equivocadas!), ¿cómo se puede:
- ¿Escribir una función LookAt? (lookAt (posición del vector, enfoque ocular del vector, arriba del vector))
- Calcular una matriz de rotación. (rotación (x, y, z))
Intenté responder estas dos preguntas por mí mismo al menos durante las últimas 3 semanas, reescribí mi función LookAt & Rotation Matrix al menos 30 veces, probé docenas de métodos y leí material que he visto en cientos de sitios web y leí muchas preguntas respondidas, copié el código de otras personas, y nada de lo que he hecho hasta ahora ha funcionado, todo ha producido un resultado incorrecto. Algunos de los cuales han producido algunos resultados extrañamente divertidos que ni siquiera se acercan a la rotación correcta.
He estado trabajando en esto todas las noches con la excepción de anoche porque me estaba frustrando tanto con el fracaso repetido que tuve que parar y tomar un descanso.
Por favor, solo muéstrame cuál es el método correcto para que pueda trabajar hacia atrás a partir de eso y averiguar cómo funciona, ¡simplemente no estoy obteniendo la respuesta correcta y esto me está volviendo un poco loco!
Estoy escribiendo en Java, pero tomaré el código escrito en cualquier idioma, la mayor parte de mi código de renderizado 3D en realidad funciona de manera bastante brillante, son solo las matemáticas que no puedo entender.
ACTUALIZACIÓN: RESUELTA
¡Gracias por tu ayuda! Ahora tengo una función LookAt en funcionamiento que realmente entiendo y no podría estar más feliz (si alguien quisiera verla, pregunte).
Intenté nuevamente crear una matriz de rotación basada en las variables de cabeceo / guiñada / balanceo y nuevamente pareció fallar, pero decidí volcar intentando usar los ángulos de Euler para la cámara libre, ya que parece no ser adecuada para el El rol, en su lugar voy a crear una clase de cuaternión, podría tener mejor suerte al seguir ese camino, de lo contrario, recurriré al uso del tono / guiñada como coordenadas esféricas y confiaré en la nueva función LookAt de trabajo para la rotación.
Si alguien más se enfrenta a un problema similar y quiere hacerme preguntas, siéntase libre de hacerlo.
Al menos ya no estoy atrapado, ¡gracias por la ayuda!
float[16]
.