¿Cómo calcular una matriz de rotación 3x3 a partir de 2 vectores de dirección?

10

Tengo 2 vectores de dirección, para el eje X y el eje Y del objeto. ¿Cómo calculo la matriz de rotación del objeto con estos?

El flash
fuente

Respuestas:

17

La idea básica es utilizar un producto cruzado para generar los ejes ortogonales adicionales de su matriz de rotación, en función de los ejes que ya tiene.

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Tenga en cuenta que lo anterior no hace suposiciones sobre los vectores X e Y (aparte de que no son idénticos), y hace muchas matemáticas adicionales que podría no tener que hacer en su situación.

Por ejemplo, en este código estoy haciendo un segundo producto cruzado para asegurarme de que nuestra matriz tenga un eje Y ortogonal, en lugar de confiar ciegamente en que los ejes X e Y de entrada están exactamente separados 90 grados. Si en su situación está seguro de que sus ejes de entrada son realmente ortogonales entre sí, puede omitir el segundo producto cruzado y simplemente asignar el vector Y de entrada directamente, en lugar de volver a calcularlo.

Tenga en cuenta que estoy asumiendo que su representación matricial tiene miembros vectoriales accesibles 'X, Y, Z'. Algunas implementaciones simplemente exponen una matriz de nueve flotantes, en cuyo caso el vector 'X' será los elementos 0, 1 y 2, o 0, 3 y 6, dependiendo de si la matriz es fila-mayor o columna- mayor. En esta situación (molesta), generalmente encuentro que es más fácil probar ambas formas y ver cuál funciona, en lugar de buscar en la documentación para tratar de averiguar qué orden está utilizando su implementación de matriz particular. :)

Finalmente, tenga en cuenta que dependiendo de la manejabilidad de su sistema de coordenadas 3D, puede necesitar multiplicar MZ por uno negativo, para generar una matriz de rotación legal para su motor 3D.

Trevor Powell
fuente
¡Muchas gracias! Haré esto y les haré saber mis resultados.
TheFlash el
¡Gracias por la respuesta tan útil! Sin embargo, tengo curiosidad: ¿no es el vector X siempre los elementos 0, 1 y 2, independientemente de que la matriz sea mayor de fila o columna? 0, 3 y 6 implicarían acceder a la primera columna de una matriz de fila mayor, o viceversa.
fbrereto
1
+1 para al menos afirmar () que los dos vectores no son iguales, pero creo que también debería requerir que no sean vectores cero.
hans_meine
1
Tenga en cuenta que esto no tiene en cuenta un caso donde Xestá -Y.
Rafał Cieślak