Respostas:
A idéia básica é usar um produto cruzado para gerar os eixos ortogonais extras da sua matriz de rotação, com base nos eixos que você já possui.
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;
}
Observe que o exposto acima não faz suposições sobre os vetores X e Y (além de não serem idênticos) e faz muita matemática extra que talvez não seja necessário na sua situação.
Por exemplo, neste código, estou fazendo um segundo produto cruzado para garantir que nossa matriz obtenha um eixo Y ortogonal, em vez de confiar cegamente que os eixos X e Y de entrada estão precisamente separados em 90 graus. Se na sua situação você tiver certeza de que seus eixos de entrada são realmente ortogonais entre si, poderá pular o segundo produto cruzado e apenas atribuir o vetor de entrada Y diretamente, em vez de recalculá-lo.
Observe que estou assumindo que sua representação matricial tem membros vetoriais 'X, Y, Z' acessíveis. Algumas implementações apenas expõem uma matriz de nove flutuadores. Nesse caso, o vetor 'X' será os elementos 0, 1 e 2 ou 0, 3 e 6, dependendo de a matriz ser de linha principal ou coluna. principal. Nessa situação (irritante), geralmente acho que é mais fácil tentar nos dois sentidos e ver qual deles funciona, em vez de pesquisar na documentação para tentar descobrir qual pedido a implementação de sua matriz específica está usando. :)
Por fim, observe que, dependendo da capacidade do seu sistema de coordenadas 3D, pode ser necessário multiplicar MZ por um negativo, a fim de gerar uma matriz de rotação legal para o seu mecanismo 3D.
X
está -Y
.