Respuestas:
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.
X
está -Y
.