Transformer la matrice de multiplication

21

J'ai des difficultés à essayer de trouver le bon ordre de multiplication pour une matrice de transformation finale. J'ai toujours un mouvement étrange ou une géométrie déformée. Mon modèle actuel est expliqué ci-dessous:

Pour un seul nœud, mon ordre de multiplication est le suivant:

L = S * R * T

L = matrice de transformation locale

S = matrice à l'échelle locale

R = matrice de rotation locale

T = matrice de traduction locale

Pour la transformation du monde d'un nœud:

W = PW * L

W = matrice de transformation mondiale

PW = matrice de transformation du monde parent

L = la matrice de transformation locale calculée ci-dessus

Lors du rendu, pour chaque nœud, je calcule la matrice:

MV = Inv (C) * NW

MV = la matrice de transformation de la vue du modèle pour un nœud particulier

Inv (C) = la matrice de transformation inverse de la caméra

NW = matrice de transformation mondiale du nœud calculée ci-dessus.

Enfin, dans le shader, j'ai la transformation en jachère:

TVP = PRP * MV * VP

TVP = position finale du sommet transformé

PRP = matrice de perspective

MV = matrice de transformation du monde du nœud calculée ci-dessus

VP = position du sommet non transformée.

Avec le modèle actuel, les nœuds enfants qui ont une rotation locale tournent étrangement lors de la transformation de la caméra. Où me suis-je trompé avec l'ordre de multiplication?

Colin Dumitru
la source

Réponses:

37

Toute combinaison de l'ordre S*R*Tdonne une matrice de transformation valide. Cependant, il est assez courant de commencer par redimensionner l'objet, puis de le faire pivoter, puis de le traduire:

L = T * R * S

Si vous ne le faites pas dans cet ordre, une mise à l'échelle non uniforme sera affectée par la rotation précédente, donnant à votre objet un aspect asymétrique. Et la rotation sera affectée par la traduction, ce qui rendra la position finale de votre objet très différente de ce que la valeur de la traduction vous attendrait.

sam hocevar
la source
Pouvez-vous expliquer cela un peu plus? D'après ce à quoi je suis habitué, la rotation ne peut pas être affectée par une translation car c'est une différence d'orientation entre deux images, indépendamment de la position. Au lieu de cela, une translation peut être affectée par une rotation qui se produit avant elle, car elle se traduira sur l'axe de rotation nouvellement défini. Dans L = TRS, la translation se produit en premier, elle n'est donc pas affectée par les nouveaux vecteurs créés par la rotation.
user-2147482637
4
La confusion vient du fait que vous parlez de transformations locales (où le cadre reste lié à l'objet), alors que les transformations décrites ici se produisent dans l'espace du monde (où il n'y a qu'un seul référentiel fixe, le monde). Conceptuellement, votre façon de voir les choses est valide et équivaut à appliquer des transformations dans l'ordre inverse.
sam hocevar