¿Cuál es la forma más fácil de alinear el eje Z con un vector?
Pregunta
Dado un punto como (0, 0, 0) y un vector como (x, y, z). ¿Cuál es la forma más fácil de alinear el eje Z negativo centrado en (0, 0, 0) para apuntar en la dirección de este vector? Los ejemplos que usan OpenGL serían bienvenidos, pero no necesarios.
Solución
Hay muchas formas diferentes de rotar un marco de coordenadas para apuntar en una dirección determinada; todos dejarán el eje z apuntando en la dirección que desee, pero con variaciones en la orientación de los ejes x e y.
Lo siguiente le proporciona la rotación más corta, que puede o no ser lo que desea.
vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}
Otros consejos
Probablemente desee echar un vistazo al artículo de Diana Gruber
Para responder a mi propia pregunta, la mejor respuesta que he encontrado es esta:
Divida el vector en "componentes". El componente x es el desplazamiento a lo largo del eje x. Si pasamos a la trigonometría, tenemos que cos (alpha) = x / vector_magnitude. Si calculamos el RHS, entonces podemos derivar alfa, que es la cantidad en la que tendríamos que girar alrededor del eje y.
Entonces el sistema de coordenadas se puede alinear con el vector mediante una serie de llamadas a glRotatef ()
Hay muchos recursos disponibles para rotar sus coordenadas (u objetos rotativos, lo que equivale a lo mismo). Aprendí mucho de este sitio , ambos sobre cómo programar en múltiples dimensiones y especialmente cómo manipular vectores
La página aquí tiene una sección " Transformaciones para mover un vector al eje z " ese parece ser lo que quieres, o tal vez lo contrario.