Pourquoi transformer les normales avec la transposée de l'inverse de la matrice modelview?
Je suis en train de travailler sur certains shaders, et j'ai besoin de transformer les normales.
J'ai lu dans quelques tutoriels de la méthode de transformation des normales est vous les multiplier avec la transposée de l'inverse de la matrice modelview. Mais je ne peux pas en trouver l'explication de pourquoi est-ce si, et quelle est la logique derrière cela?
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à ce tutoriel:
https://paroj.github.io/gltut/Illumination/Tut09%20Normal%20Transformation.html
Vous pouvez imaginer que, lorsque la surface d'une sphère s'étend (de sorte que la sphère est mise à l'échelle le long d'un axe ou quelque chose de similaire) les normales de la surface de tous "" virage vers l'autre. Il s'avère que vous devez inverser le barème appliqué pour les normales à atteindre cet objectif. C'est la même que la transformation de la Inverse de la Transposition de la Matrice. Le lien ci-dessus montre comment calculer l'inverse de la transposition de matrice de cette.
Notez également que lorsque l'échelle est uniforme, vous pouvez tout simplement passer à la matrice d'origine comme matrice normale. Imaginez la même sphère d'être réduit de façon uniforme le long de tous les axes, la surface ne sera pas étirer ou se plier, ni les normales.
Il découle de la définition de la normale.
Supposons que vous avez la normale,
N
, et un vecteur,V
, un vecteur tangent à la même position sur l'objet en tant que normale. Ensuite, par définition,N·V = 0
.Vecteurs tangents exécution dans la même direction que la surface d'un objet. Donc, si votre surface est plane alors la tangente est la différence entre les deux points de repère sur l'objet. Donc, si
V = Q - R
oùQ
etR
sont des points sur la surface, puis si vous transformez l'objet parB
:La même logique s'applique pour les surfaces non planes en considérant les limites.
Dans ce cas, supposons que vous avez l'intention de transformer le modèle de la matrice
B
. DoncB
sera appliquée à la géométrie. Ensuite, pour comprendre ce qu'il faut faire pour les normales, vous devez résoudre pour la matrice,A
de sorte que:Les transformant en une ligne et la colonne chose à éliminer l'explicite produit scalaire:
Tirez le transposer à l'extérieur, d'éliminer les parenthèses:
De sorte que "la transposition de la normale" [produit] avec "la transposition de la dite matrice de transformation" [produit] avec "la transformation que nous sommes des problèmes pour" [produit] avec "le vecteur sur la surface du modèle" = 0
Mais nous avons commencé par affirmer que
transpose(N)*V = 0
, puisque c'est la même chose que de dire queN·V = 0
. Donc, pour répondre à nos contraintes, nous avons besoin de la partie médiane de l'expression —transpose(A)*B
— pour s'en aller.Par conséquent, nous pouvons conclure que:
A
" semble tout à fait clair pour moi. Votre question fait l'implicite point que j'avais décrit verbalement A et B à l'envers si.B
est le modèle de la matrice de transformation, comment savons-nous que la tangenteV
doit être multipliée par elle et pas la normaleN
?Mon préféré preuve en est ci-dessous, où N est la normale et V est un vecteur tangent. Depuis qu'ils sont perpendiculaires leur produit scalaire est nul. M est tout 3x3 inversible de transformation (M-1 * M = I). N' et V' sont les vecteurs transformés par M.
Pour obtenir un peu d'intuition, de considérer le cisaillement de la transformation ci-dessous.
Notez que cela ne pas s'appliquent à des vecteurs tangents.
Si le modèle de la matrice est composée de translation, de rotation et d'échelle, vous n'avez pas besoin de faire l'inverse l'transposer pour calculer la matrice normale. Il suffit de diviser la normale par carré de l'échelle et de la multiplier par le modèle de la matrice et nous avons fini. Vous pouvez étendre que pour toute matrice avec des axes perpendiculaires, juste calculer le carré de l'échelle pour chacun des axes de la matrice que vous utilisez à la place.
J'ai écrit les détails dans mon blog: https://lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Ne comprends pas pourquoi vous n'avez pas à zéro, le 4ème élément du vecteur de direction avant de multiplier avec le modèle de la matrice. Aucune inverse ou de transposition nécessaires. Pensez à le vecteur de direction comme la différence entre deux points. Déplacer les deux points avec le reste du modèle, - ils sont toujours dans la même position relative par rapport au modèle. La différence entre les deux points pour obtenir la nouvelle direction, et le 4ème élément, annule à zéro. Beaucoup moins cher.