Um auf den entsprechenden Kommentar von Natan zu antworten, habe ich einige Überlegungen angestellt, die nützlich sein können, um zu verstehen, was wirklich passiert, wenn Sie Vektoren im affinen Raum verwenden, um 3D-Vektoren im euklidischen Standardraum darzustellen.
Zuerst werde ich einen Vektor aufrufen , der Koordinaten hat, so dass ein Punkt und ein Vektor dasselbe Gebilde sind. Sie können einen Vektor als Differenz von zwei Punkten sehen: V = B - A ; V bewegt
A in B , da A + V = A + B - A = B . Wenn Sie A = 0 (den Ursprung) setzen, erhalten Sie V = B - 0 = B : den Punkt B und den Vektor, der 0 bewegtbis B sind dasselbe.
Ich werde "Vektor" nennen - in dem Sinne, wie er in den meisten 3D-Bibliotheken verwendet wird -, wenn ein Vektor des affinen Raums w = 0 hat.
Die Matrix wird verwendet, weil Sie damit eine lineare Funktion in einer kompakten / eleganten / effizienten Form darstellen können, aber lineare Funktionen haben den Hauptnachteil, dass der Ursprung nicht transformiert werden kann: F ( 0 ) = 0, wenn F linear sein soll ( Amog andere Sache solchen F (λ X ) = & lgr; F ( X ) und F ( A + B ) = F ( A ) + F ( B ))
Dies bedeutet, dass Sie keine Matrix erstellen können, die eine Übersetzung ausführt, da Sie den Vektor 0 niemals verschieben werden. Hier kommt der Affine Space ins Spiel . Der affine Raum fügt dem euklidischen Raum eine Dimension hinzu, sodass mit Skalierung und Rotation translantiert werden kann.
Der affine Raum ist ein projektiver Raum in dem Sinne, dass Sie eine Äquivalenzbeziehung zwischen affinen und euklidischen Vektoren aufbauen können, um sie zu verwechseln (wie wir es mit Poins und Vektoren getan haben). Alle affinen Vektoren, die mit der gleichen Richtung zum Ursprung projizieren, können als der gleiche euklidische Vektor angesehen werden.
Dies bedeutet, dass alle Vektoren, die die gleichen Proportionen in den Koordinaten haben, als äquivalent betrachtet werden können:
Mathematisch:
dh jeder affine Vektor kann auf eine Canon-Version mit w = 1 reduziert werden (wir wählen aus jedem äquivalenten Vektor denjenigen aus, den wir am besten mögen).
Visuell (2D euklidisch - 3D affin):
daher der Mittelwert von "projektivem" Raum; Sie sollten beachten, dass hier der euklidische Raum 2D ist (der Cyan-Bereich)
Es gibt eine bestimmte Menge von affinen Vektoren, die (mit Leichtigkeit) nicht in ihre kanonische Version gebracht werden können, die auf der (Hyper-) Ebene w = 0 liegt.
Wir können es visuell zeigen:
Was Sie sehen (sollten), ist, dass, während w -> 0, der projizierte Vektor in den euklidischen Raum zum Unendlichen, aber zum Unendlichen in einer bestimmten Richtung geht .
Es ist nun klar, dass das Addieren von zwei Vektoren im projektiven Raum zu Problemen führen kann, wenn Sie den Summenvektor als projizierten Vektor im euklidischen Raum betrachten. Dies hängt an, weil Sie die W-Komponenten im affinen Raum summieren und dann auf den projizieren euklidische (Hyper-) Ebene.
Aus diesem Grund können Sie nur "Punkte" zu "Vektoren" summieren, da ein "Vektor" die w-Koordinate des "Punkts" nicht ändert. Dies gilt nur für "Punkte" mit w = 1:
Wie Sie sehen, ist der grüne Punkt derjenige, der erhalten wird, indem die zwei affinen Vektoren addiert werden, die den Cyan- "Punkt" und den V- "Vektor" darstellen . Wenn Sie jedoch V auf jeden affinen Vektor in einer vom Kanon verschiedenen Form anwenden , erhalten Sie ein falsches Ergebnis (der rote "" Punkt "").
Sie sehen, dass der affine Raum nicht transparent zur Beschreibung der Operation auf euklidischen Räumen verwendet werden kann und der Missbrauch des Begriffs "Vektor" unter der (strengen) Beschränkung von Berechnungssummen nur für kanonprojektive Vektoren Sinn macht .
Es ist durchaus vernünftig anzunehmen , dass die GPU annimmt, dass ein Vector4 w = 0 oder w = 1 haben muss, es sei denn, Sie wissen wirklich, was Sie tun.