Що робить відеокарта з четвертим елементом вектора як кінцевим положенням?


25

З цього питання, схоже, ви хочете вектору положення чотирьох елементів, так як простіше змінити його положення за допомогою матричного множення.

Само по собі це означає, що четвертий елемент повинен просто ігноруватися, розглядаючи його як представлення 3D-точки (якщо не передбачається перетворення), але я знаю, що це неправда, як коли я постачаю вектор4 в GPU, якщо четвертий елемент не один, він не відображається - чому?

Яке значення має четвертий елемент, як тільки він знаходиться в растерізаторі?

EDIT : Переглядаючи це питання було дещо погано сформульовано; в другому абзаці було б точніше сказати: "якщо значення четвертого елемента не знаходиться в певному діапазоні, воно не відображається" правильно "/" як очікувалося "".


чи не дає вектор4 з координатами (x, y, z, 0,5) однакові результати вектора4 з координатами (2x, 2y, 2z, 1)?
FxIII

@FxIII, я не зміг точно відтворити це, але ти маєш рацію, що це був неправильний конспект, зроблений у моєму первісному дописі, після ще кількох експериментів я оновив його.
sebf

Відповіді:


23

Четвертий компонент - хитрість відстежувати перспективну проекцію. Коли ви робите перспективну проекцію, ви хочете поділити на z: x '= x / z, y' = y / z, але це не операція, яка може бути реалізована матрицею 3x3, що працює на вектор x, y, z. Трюк, який став для цього стандартним, полягає в тому, щоб додати четверту координату, w, і оголосити, що x, y, z завжди будуть розділені на w після того, як будуть застосовані всі перетворення і до растерізації.

Перспективне проектування виконується, маючи матрицю, яка переміщується z на w, так що ви в кінцевому підсумку ділите на z. Але це також дає вам можливість залишити w = 1,0, якщо ви не хочете робити поділ; наприклад, якщо ви просто хочете паралельну проекцію, або обертання чи інше.

Можливість кодування позицій як w = 1, напрямків як w = 0 та використання четвертого рядка / стовпця матриці для перекладу є приємною побічною перевагою, але це не головна причина додавання w. Можна було б використати афінні перетворення (матриця 3x3 плюс трикомпонентний вектор трансляції) для здійснення перекладу без жодного виду. (Треба було б відслідковувати, що таке посада та який напрямок, і застосовувати різні функції трансформації до кожної; це трохи незручно, але насправді не велика справа.)

(BTW, математично, вектори, доповнені w, називаються однорідними координатами , і вони живуть у місці, званому проективним простором . Однак, для того, щоб робити 3D-графіку, вища математика не повинна розуміти вищу математику.)


Ще раз трохи невірно говорити про вектори і точки в цих термінах, оскільки між точками і векторами існує ізоморфізм (точка і вектор, які переміщують початок до цієї точки, є тією ж сутністю). Правильніше було б говорити про точки / вектори (w! = 0) та (проективні) напрямки (w = 0). У будь-якому разі неправомірне використання терміна "вектор" є досить консолідованим стандартом у мові 3d бібліотек.
FxIII

@FxIII: Виправлено. Використовувати "вектор" в стандартному математичному сенсі було заплутано і як синонім "напрям" у тому самому дописі.
Нікол Болас

@FxIII та Нікол Болас: Я не згоден. Ви дійсно кодуєте вектори як w = 0 - включаючи як вектори, які просто представляють напрямок, так і фактичні вектори, де важлива довжина. Наприклад, ви можете перетворити вектор кутової швидкості (напрям = вісь обертання, довжина = швидкість) об'єкта між локальним та світовим простором, використовуючи матрицю об'єкта. Ви не хочете, щоб кутова швидкість додавала до нього переклад об'єкта; ви хочете лише повернути його. Отже, ви встановите w = 0. Я не бачу проблеми?
Натан Рід

@NathanReed Я сподіваюся, що мій пост допомагає з'ясувати точку, все-таки значна частина моєї точки зору полягає у визначенні та неправильному використанні терміна вектор плюс примат лінійної алгебри над стандартною термінологією 3D-бібліотеки. Звичайно, обидва є дискусійними, оскільки кожне визначення та претензія на першість
FxIII,

@Nathan, зараз я чітко бачу мету четвертого елемента та те, як інформація, яку він містить, використовується растерізатором. Дуже дякую!
sebf

10

Намагаючись відповісти на відповідний коментар Натана, я подумав, що може бути корисним, щоб зрозуміти, що насправді відбувається, коли ви використовуєте вектори в 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, якщо ви дійсно не знаєте, що робите.


Отримати одну відповідь на це питання було дуже важко, оскільки всі вони сприяли розумінню того, як використовується зв'язок четвертого компонента і навіщо він потрібен. Ваше пояснення евклідового та афінного простору є дуже корисним, я, безумовно, не зрозумів би цього, як я зараз без цього рівня деталізації. Велике спасибі!
sebf

+1 для гарного пояснення (та діаграм!) Проективного простору. Однак афінний простір і проективний простір - це не одне і те ж (див. У Вікіпедії визначення афінного простору). Можливо, хороший спосіб сказати це: проективний 3-простір і афінний 3-простір можуть бути вбудовані в R ^ 4, але вбудови не є цілком співзвучними. Кодування векторів з афінного простору як w = 0 можливе і корисне, але не має сенсу з проективного погляду. Так само проективні напрямки (точки нескінченності) не мають сенсу з афінної точки зору.
Натан Рід

1

Припустимо такий вектор, як (x, y, z, w). Цей вектор має 4 компоненти x (x координата у просторі), y (y координата у просторі), z (координата z у просторі) та цікавий та загадковий w компонент. Насправді більшість 3D-ігор працюють у 4d просторі. Її також називають 4d однорідним простором. Є кілька очевидних переваг цього ->

1> Це допомагає нам у поєднанні матриць перекладу та обертання в одне ціле. Але ви можете подумати, для чого це використовувати, ми могли б просто помножити матрицю перекладу та обертання, і це все, але більше в цьому немає нічого. Якщо у нас немає w компонент у всіх наших векторах, тоді, коли ми помножимо 3d-вектор (xyz) на комбіновану матрицю перекладу та обертання будь-яким способом, ми будемо несвідомо масштабувати значення за допомогою x, y або z (саме так діє множення матриці), і це буде можливо, пошкоджена матриця позицій (частина перекладу комбінованої матриці) через масштабування. Для виправлення цієї проблеми вводиться 4-й компонентний вектор, і цей компонент вектора (w) буде містити значення 1,0 у 99% випадків. Цей 4-й компонент дозволяє нам мати немасштабні значення позиції (переклад). Матриця представлена ​​як->

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

і тоді ми маємо просту, але потужну матрицю. :)

2> Ми копіюємо значення z в компонент w на етапі перспективного проектування і ділимо з ним x, y. Цим чином об'єкти стають коротшими, коли вони віддаляються від екрана.


Дякую! Я все більше і більше бачу необхідність використання четвертого компонента в будь-якому справді корисному представленні сутності в 3D-просторі.
sebf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.