Próbując odpowiedzieć na odpowiedni komentarz Natana, zastanowiłem się, co może być przydatne, aby zrozumieć, co naprawdę dzieje się, gdy używasz wektorów w Przestrzeni Affine do reprezentowania wektorów 3D w standardowej Przestrzeni Euklidesowej.
Najpierw nazywam wektor tym, co ma współrzędne, więc punkt i wektor są tym samym bytem; wektor widzisz jako różnicę dwóch punktów: V = B - A ; V porusza
A w B Ze względu A + V = A + B - A = B . Umieść A = 0 (początek), a otrzymasz V = B - 0 = B : punkt B i wektor, który porusza się 0do B są tym samym.
Nazwę „wektor” - w sensie używanym w większości bibliotek 3D - gdy wektor przestrzeni afinicznej ma w = 0.
Macierz jest używana, ponieważ pozwala przedstawić funkcję liniową w formie zwartej / eleganckiej / wydajnej, ale funkcje liniowe mają główną wadę, która nie może przekształcić początku: F ( 0 ) = 0, jeśli F chce być liniowy ( między innymi F (λ X ) = λF ( X ) i F ( A + B ) = F ( A ) + F ( B ))
Oznacza to, że nie możesz zbudować macierzy wykonującej tłumaczenie, ponieważ nigdy nie przeniesiesz wektora 0 . W grę wchodzi Affine Space . Przestrzeń afiniczna nadaje wymiar przestrzeni euklidesowej, więc przeszczepy można wykonywać za pomocą skalowania i rotacji.
Przestrzeń afiniczna jest przestrzenią rzutową w tym sensie, że można zbudować relację równoważności między wektorami afinicznymi i euklidesowymi, aby można było je pomylić (tak jak to zrobiliśmy z wierszami i wektorami). Wszystkie wektory afiniczne, które rzutują na początek w tym samym kierunku, mogą być postrzegane jako ten sam wektor euklidesowy.
Oznacza to, że wszystkie wektory o takich samych proporcjach we współrzędnych można uznać za równoważne:
Matematycznie:
tzn. każdy wektor afiniczny można zredukować do wersji kanonicznej, w której w = 1 (wybieramy spośród każdego równoważnego wektora ten, który najbardziej lubimy).
Wizualnie (euklidesowy 2D - afiniczny 3D):
stąd środek „rzutowej” przestrzeni; Należy zauważyć, że tutaj przestrzeń euklidesowa to 2D (region cyjan)
Istnieje szczególny zestaw wektorów afinicznych, których nie można łatwo umieścić w ich wersji kanonicznej, która leży na (hiper) płaszczyźnie w = 0.
Możemy to pokazać wizualnie:
(powinieneś) zobaczyć, że podczas gdy w -> 0, rzutowany wektor do przestrzeni euklidesowej przechodzi do nieskończoności, ale do nieskończoności w określonym Kierunku .
Teraz jest jasne, że dodanie dwóch wektorów w przestrzeni rzutowej może prowadzić do problemów, jeśli weźmiesz pod uwagę wektor sumy jako rzutowany wektor w przestrzeni euklidesowej, to się dodaje, ponieważ zsumujesz składniki W w przestrzeni afinicznej, a następnie rzutujesz je na płaszczyzna euklidesowa (hiper).
Dlatego można sumować tylko „punkty” do „wektorów”, ponieważ „wektor” nie zmieni współrzędnej w „punktu”, jest to prawdą tylko dla „punktów”, gdzie w = 1:
Jak widzisz, zielony punkt jest tym uzyskanym przez dodanie dwóch wektorów afinicznych, które reprezentują cyjan „punkt” i wektor „V” , ale jeśli zastosujesz V do każdego wektora afinicznego w innej formie niż kanoniczny, otrzymasz złe wyniki (czerwony „punkt”).
Widzisz, że Przestrzeń Affine nie można użyć w sposób przejrzysty do opisania operacji na przestrzeniach euklidesowych, a niewłaściwe użycie terminu „wektor” ma sens pod (ścisłym) ograniczeniem sum obliczeniowych tylko dla kanonicznych wektorów rzutowych .
Mówiąc to, całkiem rozsądnie jest myśleć, że GPU zakłada, że Vector4 musi mieć w = 0 lub w = 1, chyba że naprawdę wiesz, co robisz.