Muy buenas a tod@s!!
Soy nuevo en el foro, me dedico a la programación y soy nulo en mates, de hecho me ha costado elegir donde meter este tema, la cosa es que llevo ya una semana con este problema y no veo luz por ningún lado, espero que me podais dar alguna pista, de antemano muchas gracias por vuestro tiempo.
Lo que pretendo es crear un sistema de coordenadas a partir de tres puntos conocidos, para ello lo que hago es:
Defino 3 puntos P1, p2 y p3
P1, define el origen del sistema.
P2, define el vector del eje X.
P3, define el plano XY.
Calculo vector en eje X
\( \overrightarrow{VX} = P2 - P1 \)
vector auxiliar para calcular VY
\( \overrightarrow{VA} = P3 - P1 \)
Vector en eje Y
\( \overrightarrow{VY} = \overrightarrow{VX} * \overrightarrow{VA} \)
y vector en eje z
\( \overrightarrow{VZ} = \overrightarrow{VY} * \overrightarrow{VX} \)
Calcúlo los vectores unitarios para formar la matriz de transformación
\(
Matriz Rot = \begin{bmatrix}{VXnorm.x}&{VYnorm.x}&{VZnorm.x}\\{VXnorm.y}&{VYnorm.y}&{VZnorm.y}\\{VXnorm.z}&{VYnorm.z}&{VZnorm.z}\end{bmatrix}
\)
Hasta aqui creo que voy bien, ahora necesito obtener los angulos sobre cada eje para hacer las rotaciones.
Segun leo en
http://www.songho.ca/opengl/gl_anglestoaxes.html una de las muchas (pero muchas) páginas que he consultado, para un orden de rotaciones ZXY (es el que necesito) tengo que aplicar las siguientes ecuaciones:
EJE Y:
\( VXnorm.z = -Sin(B) \) ; B = rot en Y, por lo tanto
\( rot Y = 90 - arcCos(-VXnorm.z) \), aqui tendria que ser arcSin(-VXnorm.z), pero el sistema donde tengo que implementar la programación no me permite la función arcoseno y por lo que he visto así también se puede calcular.
EJE X:
\( VZnorm.z = Cos(B)Cos(A) \) ; A = rot en X, por lo tanto
\( \displaystyle rot X = arcCos(\frac{VZnorm.z}{Cos(rot Y)}) \)
EJE Z:
\( VXnorm.x = Cos(C)Cos(B) \) ; C = rot en Z, por lo tanto
\( \displaystyle rot Z = arcCos(\frac{VXnorm.x}{Cos(rot Y)}) \)
Es esto correcto?, esta bien aplicado?
Uso un simulador 3d para comprobar los calculos, y me dan resultados diferentes, por ejemplo:
P1 = -278, 182, 45
P2 = -230, 178, -30
P3 = -210, 160, -10
la matriz de rotacion resultante es:
\(
Matriz Rot = \begin{bmatrix}
{0.538511}&{-0.484505}&{0.689392}\\
{-0.0448759}&{-0.833484}&{-0.550718}\\
{-0.841423}&{-0.265631}&{0.470583}\end{bmatrix}
\)
El programa de simulación que utilizo tiene una función que hace esto mismo que pretendo hacer y me da los siguientes resultados:
rX = 119.44
rY = 57.29
rZ = -4.76
Y según mis calculos:
rX = 29.44, muy diferente, coincide que 119.44 - 90 = 29.44, sospechoso, pero ni idea
rY = 57.29, este valor siempre me da bien
rZ = 4.76, mismo valor pero con signo cambiado
Intuyo que tiene algo que ver con que cos(20) = cos(340), es decir que tengo el mismo resultado de coseno para dos valores distintos, pero.. ¿en función de qué modifico el valor de los resultados??

Cualquier ayuda o aclaración me seria de gran ayuda, perdón por el tocho pero no sabia como resumirlo
Muchas gracias y saludos,