Dlaczego potrzebujemy czwartej współrzędnej do podzielenia przez z?

12

Tutaj przeczytałem odpowiedź:

Co robi karta graficzna z czwartym elementem wektora jako końcową pozycją?

„Czwarty element jest trikiem pozwalającym śledzić rzut perspektywiczny. Podczas wykonywania rzutowania perspektywicznego chcesz podzielić przez z: x '= x / z, y' = y / z, ale nie jest to operacja, która można zaimplementować za pomocą macierzy 3x3 działającej na wektorze x, y, z. Sztuczka, która stała się standardem w tym zakresie, to dołączenie czwartej współrzędnej, w, i zadeklarowanie, że x, y, z będzie zawsze dzielone przez w po zastosowaniu wszystkich transformacji i przed rasteryzacją. ”

ale nie rozumiem, dlaczego nie możemy podzielić przez Z za pomocą macierzy 3x3?

nie możemy po prostu pomnożyć

1/z 0 0
0 1/z 0
0 0 1/z

dostać [x/z y/z 1]

?

Społeczność
źródło
Spróbuj wyrazić transformację (lub kompozycję transformacji), która obejmuje tłumaczenie gdzieś w łańcuchu. Bez wartości aw nie można wyrazić jej w jednej macierzy.
DMGregory
Rozumiem część dotyczącą tłumaczenia, ale po prostu nie rozumiem, w jaki sposób dodanie czwartej współrzędnej pomoże lub jest
Za to, co warto, możesz zrobić to, co powiedziałeś. Dzielenie xiy przez z jest poprawną metodą konwersji współrzędnych 3d na przestrzeń ekranu 2d z rzutowaniem, w którym odległe obiekty stają się mniejsze. W jest jednorodną współrzędną, która pozwala przenieść ją do czwartego wymiaru, aby móc wykonać tłumaczenie.
Alan Wolfe,

Odpowiedzi:

14

Ponieważ jeśli dzielisz się tylko [x, y, z]przez zsiebie [x/z, y/z, 1], tracisz rzeczywistą wartość z, co jest faktycznie przydatne, jeśli chcesz zrobić wycinanie w płaszczyźnie bliskiej / dalekiej lub wypełnić bufor Z.

Dlatego najlepszym sposobem na zachowanie niektórych informacji z, przynajmniej na GPU, jest użycie 4 komponentów zamiast 3. W praktyce to, co faktycznie znajduje się w dwóch ostatnich komponentach wektorowych przed podziałem perspektywy, zależy od rodzaju projekcji i efektów chcieć.

Na przykład w przypadku rzutu perspektywicznego jest to wynikowy wektor 4-komponentowy:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Po podziale perspektywy wektor staje się:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

I c + d/zpozostawia nas część z wystarczającą ilością informacji, aby wypełnić bufor Z.

sam hocevar
źródło
Można podzielić X i Y tylko przez Z, uzyskując [x / z, y / z, z]. Procesor graficzny nie musi dokonywać podziału wektorów, mógł zostać zaprojektowany do wykonywania dowolnych obliczeń.
user253751,
3

Technicznie możesz to zrobić. Ale po co zawracać sobie głowę? Do czasu ukończenia finału zmożesz:

  • zbuduj macierz 3x3 zgodnie z opisem, marnując 9 * sizeof(float)bajty miejsca, wydając cykle na obliczenia 1/z(jeden podział), a następnie wykonując dziewięć mnożników i sześć sum, aby uzyskać końcowy wierzchołek, lub
  • możesz zrobić trzy dywizje, jak to obecnie robi nowoczesny rurociąg

Jeden z nich wydaje mi się bardziej optymalny i nie jest pierwszy. Nawet jeśli istnieje zoptymalizowany sprzęt do mnożenia macierzy, co z pewnością tak jest, jest on koncepcyjnie bardziej złożony niż prosty podział.

Plus, matryca 3x3 nie można kodować tłumaczenie, a więc macierz 4x4 (a więc czwarta wwspółrzędnych) jest stosowany wcześniej w rurociągu w każdym razie . Oznacza to, że masz już czwarty komponent, więc możesz go również użyć do przeniesienia użytecznej wartości i podziału z nią.


źródło