Намагаючись відповісти на відповідний коментар Натана, я подумав, що може бути корисним, щоб зрозуміти, що насправді відбувається, коли ви використовуєте вектори в Affine Space для представлення 3D-векторів у стандартному Евклідовому просторі.
Спочатку я буду називати вектор, який має координати, тому точка і вектор - це одне ціле; ви можете бачити вектор як різницю двох точок: V = B - A ; У переміщує
А в В , тому що А + V = A + B - A = B . Покладіть A = 0 (початок), і ви отримаєте, що V = B - 0 = B : точка B і вектор, який рухається 0до Б - те саме.
Я назву "вектор" - у тому сенсі, який використовується у більшості бібліотек 3D - коли вектор афінного простору має w = 0.
Матриця використовується тому, що вони дозволяють представляти лінійну функцію в компактній / елегантній / ефективній формі, але лінійні функції мають головний недолік, який не може перетворити походження: F ( 0 ) = 0, якщо F хоче бути лінійним ( наприклад, інші F (λ X ) = λF ( X ) і F ( A + B ) = F ( A ) + F ( B ))
Це означає, що ви не можете побудувати матрицю, яка робить переклад, оскільки ви ніколи не переміщуватимете вектор 0 . Тут грає Affine Space . Аффінний простір додає вимір евклідовому простору, тому трансплантації можна зробити за допомогою масштабування та обертання.
Простір Аффіни - це проективний простір у тому сенсі, що ви можете побудувати відношення еквівалентності між векторами Аффіна та Евкліда, щоб ви могли їх переплутати (як ми це робили з пунктами та векторами). Усі афінні вектори, котрі проектуються на початок з однаковим напрямком, можна розглядати як один і той же евклідовий вектор.
Це означає, що всі вектори, які мають однакові пропорції в координатах, можна вважати рівнозначними:
Математично:
тобто кожен афінний вектор може бути зведений до версії канону, де w = 1 (ми вибираємо серед кожного еквівалентного вектора той, який нам найбільше подобається).
Візуально (2D евклідова - 3D афін):
звідси середнє значення "проективного" простору; Ви повинні помітити, що тут евклідовий простір 2D (синюшна область)
Існує певний набір афінних векторів, який не можна поставити у своїй канонічній версії (з легкістю) той, що лежить у (гіпер) площині w = 0.
Ми можемо показати це візуально:
те, що ви (повинні) бачити, це те, що тоді як w -> 0, тоді проектований вектор в евклідовий простір переходить до нескінченного, а до нескінченного в певному напрямку .
Тепер зрозуміло, що додавання двох векторів в проективний простір може призвести до проблем, коли ви розглядаєте вектор суми як проектований вектор в евклідовому просторі, це додається, тому що ви підсумуєте W компоненти в афінному просторі, а потім запроектуєте їх на евклідова (гіпер) площина.
Ось чому ви можете підсумовувати лише "точки" до "векторів", оскільки "вектор" не змінить координату w "точки", це справедливо лише для "точок", де w = 1:
Як ви бачите, зелена точка - це отримана додавання двох афінних векторів, які представляють синюшну "точку" і V "вектор" , але якщо застосувати V до кожного афінному вектору у формі, відмінній від канону, ви отримаєте неправильні результати (червона "" точка "").
Ви бачите, що Affine Space не може бути прозоро використаний для опису операцій на Евклідових просторах, а неправильне використання терміна "вектор" має сенс під (суворим) обмеженням обчислювальних сум лише для проективних векторів канону .
Сказав це, цілком розумно думати, що GPU припускає, що вектор Vector4 повинен мати w = 0 або w = 1, якщо ви дійсно не знаєте, що робите.