Ordem de multiplicação da matriz de transformação

21

Estou com dificuldades para tentar descobrir a ordem de multiplicação correta para uma matriz de transformação final. Eu sempre recebo movimentos estranhos ou geometria distorcida. Meu modelo atual é explicado abaixo:

Para um único nó, minha ordem de multiplicação é:

L = S * R * T

Onde

L = matriz de transformação local

S = matriz em escala local

R = matriz de rotação local

T = matriz de conversão local

Para a transformação do mundo de um nó:

W = PW * L

Onde

W = matriz de transformação mundial

PW = matriz de transformação do mundo pai

L = a matriz de transformação local calculada acima

Ao renderizar, para cada nó, calculo a matriz:

MV = Inv (C) * NW

Onde

MV = matriz de transformação da visualização de modelo para um nó específico

Inv (C) = a matriz de transformação inversa da câmera

NW = matriz de transformação mundial do nó calculada acima.

Finalmente, no sombreador, tenho a seguinte transformação:

TVP = PRP * MV * VP

Onde

TVP = posição final do vértice transformado

PRP = matriz de perspectiva

MV = matriz de transformação mundial do nó calculada acima

VP = posição do vértice não transformado.

Com o modelo atual, os nós filhos que têm rotação local giram estranhamente ao transformar a câmera. Onde eu errei com a ordem de multiplicação?

Colin Dumitru
fonte

Respostas:

37

Qualquer combinação do pedido S*R*Tfornece uma matriz de transformação válida. No entanto, é bastante comum escalar primeiro o objeto, girá-lo e traduzi-lo:

L = T * R * S

Se você não fizer nessa ordem, uma escala não uniforme será afetada pela rotação anterior, fazendo com que seu objeto pareça inclinado. E a rotação será afetada pela tradução, tornando a posição final do seu objeto muito diferente do que o valor da tradução faria com que você esperasse.

sam hocevar
fonte
Você pode explicar isso um pouco mais? Pelo que estou acostumado, a rotação não pode ser afetada por uma tradução, pois é uma diferença de orientação entre dois quadros, independente da posição. Em vez disso, uma conversão pode ser afetada por uma rotação que ocorre antes dela, pois será convertida no novo eixo de rotação definido. Em L = TRS, a conversão ocorre primeiro, portanto, não é afetada pelos novos vetores criados pela rotação.
user-2147482637
4
A confusão vem do fato de você estar falando sobre transformações locais (onde o quadro permanece vinculado ao objeto), enquanto as transformações descritas aqui acontecem no espaço do mundo (onde há apenas um quadro de referência fixo, o mundo). Conceitualmente, sua maneira de ver as coisas é válida e equivale a aplicar transformações em ordem inversa.
217156 Sam_Hocevar