calcular nova posição de vértice, dada uma matriz de transformação?

7

Como posso obter a nova posição do meu vértice, dada uma matriz de transformação 4x4 ou simplesmente 9 pontos flutuantes (posiçãoX, posiçãoY, posiçãoZ, rotaçãoH, rotaçãoP, rotaçãoP, rotaçãoR, escalaX, escalaY, escalaZ)? Normalmente, posso atribuir a matriz à minha malha final (ou "nó", ou "objeto" ou "geom"), mas agora preciso fazê-lo manualmente.

ioa
fonte

Respostas:

5

Para aplicar uma matriz de transformação 4x4 geral a um vértice representado como um vetor tridimensional, você precisa:

  1. Expanda o vetor para a quarta dimensão adicionando 1 como o componente w:

    (x, y, z) => (x, y, z, 1)

  2. 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 ]
  3. 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 wserá 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.

David Gouveia
fonte
2
Não vai doer se você acrescentar que é assim que você multiplica por um ponto representado como uma coluna; para uma linha, você primeiro escreve o vetor e depois a matriz; também, se você deseja multiplicar várias matrizes, organiza-o de maneira que na equação, a matriz mais próxima do vetor é aplicada primeiro, mas sempre é bom dizer isso porque algumas bibliotecas tratam pontos como linhas e outras como colunas e você precisa distinguir isso para aplicar matrizes corretamente, também se indo para ir de coluna a representação linha você tem que transpor a matriz de transformação
dreta
11
@dreta Eu pensei sobre alguns desses pontos. Eu poderia adicioná-lo mas eu penso seu comentário já faz um grande trabalho a cobrir todas as bases, então eu upvoted-lo em vez: P
David Gouveia
1

Multiplicação matriz-vetor:

[ rxx rxy rxz px ] [ vx ]   [ vx' ]
[ ryx ryy ryz py ] [ vy ]   [ vy' ]
[ ryx ryy ryz pz ] [ vz ] = [ vz' ]
[   0   0   0  1 ] [  1 ]   [  1  ]

Veja a página na wikipedia para mais informações.

Mihai Maruseac
fonte
Então multiplique cada componente vetorial pela coluna correspondente da matriz e ignore a última linha?
IOA
Não, você faz multiplicação de matrizes, como na matemática. Por exemplo, o vx'termo é calculado como estevx' = rxx * vx + rxy * vy + rxz * vz + px
Mihai Maruseac
OK. Espero que você não se importe de eu aceitar a resposta acima. Eu acho que será mais informativo para os outros também.
IOA
Claro, ele é escrito de forma mais limpa, que merece :)
Mihai Maruseac