Para aplicar uma matriz de transformação 4x4 geral a um vértice representado como um vetor tridimensional, você precisa:
Expanda o vetor para a quarta dimensão adicionando 1 como o componente w:
(x, y, z) => (x, y, z, 1)
Multiplique a matriz de transformação pelo vetor quadridimensional acima. O resultado será outro vetor quadridimensional:
( 4x4 matrix ) * (x, y, z, 1) => (tx, ty, tz, w)
A fórmula geral para multiplicar uma matriz 4x4 por um vetor 4x1 é (se eu não errei):
[ m11 m12 m13 m14 ][ x ] [ m11 * x + m12 * y + m13 * z + m14 * w ]
[ m21 m22 m23 m24 ][ y ] [ m21 * x + m22 * y + m23 * z + m24 * w ]
[ m31 m32 m33 m34 ][ z ] = [ m31 * x + m32 * y + m33 * z + m34 * w ]
[ m41 m42 m43 m44 ][ w ] [ m41 * x + m42 * y + m43 * z + m44 * w ]
Ou se você considerar a configuração usual de uma matriz de transformação:
[ m11 m12 m13 px ][ x ] [ m11 * x + m12 * y + m13 * z + px ]
[ m21 m22 m23 py ][ y ] [ m21 * x + m22 * y + m23 * z + py ]
[ m31 m32 m33 pz ][ z ] = [ m31 * x + m32 * y + m33 * z + pz ]
[ 0 0 0 1 ][ 1 ] [ 1 ]
Converta-o novamente na 3ª dimensão homogeneizando o vetor, ou seja, dividindo tudo pelo quarto componente w
:
(tx, ty, tz, w) => (tx/w, ty/w, tz/w)
O fato é que, se sua matriz de transformação fizer apenas uma conversão / rotação / escala simples, o valor de w
será 1 e você poderá simplesmente soltar o quarto componente, pois será o mesmo que dividir por 1.
Mas é bom lembrar que a remoção do componente w não funciona em todos os casos, por exemplo, com matrizes de projeção, você deve se lembrar de executar esta terceira etapa.