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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top