Pour répondre au commentaire approprié de Natan, j'ai fait quelques réflexions qui peuvent être utiles pour comprendre ce qui se passe réellement lorsque vous utilisez des vecteurs dans l'espace affine pour représenter des vecteurs 3D dans l'espace euclidien standard.
D'abord, j'appellerai vecteur ce qui a des coordonnées, donc un point et un vecteur sont la même entité; vous pouvez voir un vecteur comme une différence de deux points: V = B - A ; V déplace
A dans B car A + V = A + B - A = B . Mettez A = 0 (l'origine) et vous obtiendrez que V = B - 0 = B : le point B et le vecteur qui se déplace 0à B sont la même chose.
J'appellerai "vecteur" - dans le sens utilisé dans la majorité des bibliothèques 3D - lorsqu'un vecteur de l'espace affine a w = 0.
Les matrices sont utilisées car elles vous permettent de représenter une fonction linéaire sous une forme compacte / élégante / efficace, mais les fonctions linéaires ont l'inconvénient majeur de ne pas pouvoir transformer l'origine: F ( 0 ) = 0 si F veut être linéaire ( entre autres choses telles que F (λ X ) = λF ( X ) et F ( A + B ) = F ( A ) + F ( B ))
Cela signifie que vous ne pouvez pas construire une matrice qui effectue une traduction car vous ne déplacerez jamais le vecteur 0 . Ici entre en jeu l' Espace Affine . L'espace affine ajoute une dimension à l'espace euclidien pour que les traslantions puissent être effectuées avec des échelles et des rotations.
L'Espace Affine est un espace projectif dans le sens où vous pouvez construire une relation d'équivalence entre les vecteurs Affine et Euclidienne afin de pouvoir les confondre (comme nous l'avons fait avec les poins et les vecteurs). Tous les vecteurs affines qui se projettent à l'origine avec la même direction peuvent être vus comme le même vecteur euclidien.
Cela signifie que tous les vecteurs qui ont les mêmes proportions dans les coordonnées peuvent être considérés comme équivalents:
Mathématiquement:
c'est-à-dire que chaque vecteur affine peut être réduit à une version canon où w = 1 (nous choisissons parmi chaque vecteur équivalent celui que nous aimons le mieux).
Visuellement (euclidienne 2D - affine 3D):
d'où la moyenne de l' espace "projectif" ; Vous remarquerez qu'ici l'espace euclidien est 2D (la région cyan)
Il existe un ensemble particulier de vecteurs affines qui ne peuvent pas être mis dans leur version canonique (avec facilité) celui qui se trouve sur le (hyper) plan w = 0.
On peut le montrer visuellement:
ce que vous (devriez) voir, c'est que tandis que w -> 0, le vecteur projeté dans l'espace euclidien va à l'infini mais à l'infini dans une direction particulière .
Il est maintenant clair que l'addition de deux vecteurs dans l'espace projectif peut entraîner des problèmes lorsque vous considérez le vecteur de somme comme un vecteur projeté dans l'espace euclidien, cela s'ajoute car vous additionnez les composants W dans l'espace affine, puis les projetez dans le (hyper) plan euclidien.
C'est pourquoi vous ne pouvez additionner que les "points" aux "vecteurs" car un "vecteur" ne changera pas la coordonnée w du "point" ceci n'est vrai que pour les "points" où w = 1:
Comme vous le voyez, le point vert est celui obtenu en ajoutant les deux vecteurs affines qui représentent le "point" cyan et le "vecteur" V , mais si vous appliquez V à chaque vecteur affine sous une forme différente de celle du canon, vous obtiendrez un mauvais résultat (le "" point "" rouge).
Vous voyez que Affine Space ne peut pas être utilisé de manière transparente pour décrire le fonctionnement sur les espaces euclidiens et l' utilisation abusive du terme "vecteur" a du sens sous la contrainte (stricte) des sommes de calcul uniquement sur des vecteurs projectifs canon .
Cela dit, il est tout à fait raisonnable de penser que le GPU suppose qu'un Vector4 doit avoir w = 0 ou w = 1, sauf si vous savez vraiment ce que vous faites.