Cercando di rispondere al commento appropriato di Natan, ho fatto alcune considerazioni che possono essere utili per capire cosa succede realmente quando usi i vettori nello Spazio Affine per rappresentare i vettori 3D nello Spazio Euclideo standard.
Per prima cosa chiamerò vector qualunque cosa abbia coordinate, quindi un punto e un vettore sono la stessa entità; puoi vedere un vettore come differenza di due punti: V = B - A ; V muove
A in B perché A + V = A + B - A = B . Inserisci A = 0 (l'origine) e otterrai quel V = B - 0 = B : il punto B e il vettore che si muove 0a B sono la stessa cosa.
Chiamerò "vettore" - nel senso usato nella maggior parte delle librerie 3D - quando un vettore dello spazio affine ha w = 0.
La matrice viene utilizzata perché consente di rappresentare una funzione lineare in una forma compatta / elegante / efficiente, ma le funzioni lineari presentano il principale svantaggio che non può trasformare l'origine: F ( 0 ) = 0 se F vuole essere lineare ( amog altra cosa come F (λ X ) = λF ( X ) e F ( A + B ) = F ( A ) + F ( B ))
Ciò significa che non è possibile costruire una matrice che esegua una traduzione poiché non si sposta mai il vettore 0 . Qui entra in gioco lo spazio affine . Lo spazio affine aggiunge una dimensione allo spazio euclideo in modo che le traslanzioni possano essere fatte con ridimensionamento e rotazioni.
Lo spazio affine è uno spazio proiettivo, nel senso che puoi costruire una relazione di equivalenza tra vettori affini ed euclidei in modo da poterli confondere (come abbiamo fatto con poins e vettori). Tutti i vettori affini che proiettano all'origine con la stessa direzione possono essere visti come lo stesso vettore euclideo.
Ciò significa che tutti i vettori che hanno le stesse proporzioni nelle coordinate possono essere considerati equivalenti:
Matematicamente:
cioè ogni vettore affine può essere ridotto a una versione canonica dove w = 1 (scegliamo tra ogni vettore equivalente quello che ci piace di più).
Visivamente (euclidee 2D - 3D affine):
da qui la media dello spazio "proiettivo" ; Dovresti notare che qui lo spazio euclideo è 2D (la regione ciano)
C'è un particolare insieme di vettori affini che non possono essere messi nella loro versione canonica (con facilità) quello che giace sul (iper) piano w = 0.
Possiamo mostrarlo visivamente:
quello che (dovresti) vedere è che mentre w -> 0 il vettore proiettato nello spazio euclideo va all'infinito ma all'infinito in una direzione particolare .
Ora è chiaro che sommare due vettori nello spazio proiettivo può portare a problemi quando si considera il vettore di somma come vettore proiettato nello spazio euclideo, ciò si aggiunge perché si sommano i componenti W nello spazio affine e quindi li si proietta sul piano euclideo (iper).
Questo è il motivo per cui puoi sommare solo "punti" a "vettori" perché un "vettore" non cambierà la coordinata w del "punto", ciò vale solo per "punti" dove w = 1:
Come vedi il punto verde è quello ottenuto aggiungendo i due vettori affini che rappresentano il "punto" ciano e il "vettore" V , ma se applichi V a ogni vettore affine in una forma diversa da quella canonica, otterrai risultati errati (il "" punto "" rosso).
Vedete che Affine Space non può essere usato in modo trasparente per descrivere l'operazione su Spazi euclidei e l' uso improprio del termine "vettore" ha senso sotto il vincolo (rigoroso) di somme di calcolo solo su vettori proiettivi canonici .
Detto questo, è abbastanza ragionevole pensare che la GPU presuma che un Vector4 debba avere w = 0 o w = 1, a meno che tu non sappia veramente cosa stai facendo.