Dlaczego przestrzeń na klipy w OpenGL ma 4 wymiary?

13

Wykorzystam to jako ogólne odniesienie, ale im więcej dokumentów i książek w przeglądarce, tym mniej rozumiem.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

w tej książce online znajduje się przykład narysowania pierwszego i klasycznego świata Witaj w OpenGL na temat tworzenia trójkąta.

Struktura wierzchołka trójkąta jest zadeklarowana zgodnie z powyższym kodem.

Książka, podobnie jak wszystkie inne źródła na ten temat, podkreśla, że ​​Clip Space jest strukturą 4D, która służy do decydowania o tym, co zostanie zrasteryzowane i wyrenderowane na ekranie.

Oto moje pytania:

  • nie wyobrażam sobie czegoś w 4D, nie sądzę, że człowiek może to zrobić, czym jest 4D dla tego miejsca Clip?
  • najbardziej czytelny dla człowieka dokument, który przeczytałem, mówi o kamerze, która jest jedynie abstrakcją koncepcji wycinania, i rozumiem, że problem polega na tym, dlaczego nie skorzystać z koncepcji kamery w pierwszej kolejności, co jest bardziej znana struktura 3D? Jedyny problem związany z koncepcją kamery polega na tym, że musisz zdefiniować perspektywę w inny sposób, a więc w zasadzie musisz dodać kolejne stwierdzenie o tym, jaki rodzaj kamery chcesz mieć.
  • Jak mam to przeczytać 0.75f, 0.75f, 0.0f, 1.0f? Wszystko, co otrzymuję, to to, że wszystkie są wartościami zmiennoprzecinkowymi i otrzymuję znaczenie pierwszych 3 wartości, co to znaczy ostatnia?
użytkownik827992
źródło
4
Rozdział 4 wyjaśnia dokładnie, co robi czwarty składnik. Właściwie, podrap to; Rozdział 1 wyjaśnia transformację klip-to-NDC w sekcji rasteryzacji w połowie drogi .
Nicol Bolas,
2
@NicolBolas autor podaje swoje wyjaśnienia w pierwszym rozdziale i nie zamieszcza żadnych odniesień do następnych rozdziałów, również udaje, że wyjaśnia, co będzie dalej, gdy komentuje jakiś kod c ++, a problem polega na tym, że jeśli nie do końca wszystko wyjaśni rozdział 1 nie ma większego sensu umieszczanie tego, co powinienem wiedzieć, na pierwszym miejscu w rozdziale 4, szczególnie jeśli potrzebuję tych pojęć, aby rozszyfrować zawartość tego rozdziału. Czytam to teraz, a nie tylko jeden raz, teraz wiem, że powinienem szukać dalszej odpowiedzi, przejrzę różne rozdziały.
user827992,
1
Nie musisz niczego dekodować; napisano w rozdziale 1: Komponent W jest podzielony na pozostałe 3 komponenty. Zostało to również stwierdzone we wstępie. Odsuwa się to do 4 rozdziału, dlaczego OpenGL to robi. Odkłada się to na później, ponieważ nie ma znaczenia dla danego zadania.
Nicol Bolas,
3
Nadal byłaby to nieistotna informacja dla danego problemu (tj. Renderowanie trójkąta). Jesteś tego ciekawy , ale nie musisz rozumieć, dlaczego tak to jest rozumieć, że tak to działa. Ucząc się czegokolwiek, pierwszym krokiem jest zrozumienie, co to jest. Gdy zrozumiesz, co się dzieje, może odbyć się dyskusja na temat tego , dlaczego tak jest.
Nicol Bolas,
1
Ta odpowiedź może pomóc.
iammilind

Odpowiedzi:

9

Magiczny termin to „jednorodne współrzędne”, które są używane w systemach, w których ważna jest perspektywa. Zajrzyj na wiki, aby zobaczyć ogólny zarys, ale jest to długa nauka, aby naprawdę ją zrozumieć (czego nie rozumiem).

ddyer
źródło
10

Przeczytaj wprowadzenie książek, które czytasz, będziesz zaskoczony;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html w części Omówienie rasteryzacji

Wartość „w” (gdzie pierwsze 3 wartości to x, yiz) zasadniczo mówi, jakie są wymiary przestrzeni klipu. Ponieważ jest to 1 wartość skalarna, wszystkie 3 wymiary przestrzeni klipu są równe (i dlatego przestrzeń klipu jest sześcianem). Każdy wierzchołek ma swoją własną przestrzeń klipu, w której istnieje (i zasadniczo musi się „dopasować”, w przeciwnym razie CLIPS: D), nie ma 1 „świata”, który jest przestrzenią klipu (chociaż wszystkie przestrzenie klipu są w tym samym „ świat "Myślę, że nawet mam z tym problem; P).

Więc jeśli twój wierzchołek ma na przykład współrzędną [1,1,1], jeśli przestrzeń klipu wynosi 1, wówczas wierzchołek znajduje się w prawym górnym rogu w pobliżu rogu ekranu (gdy wszystko jest domyślne, nie wiem, czy kierunki można zmienić). Ale jeśli wierzchołek ma przestrzeń klipu równą 2, to współrzędna [1,1,1] będzie gdzieś, powiedzmy, 3 ćwiartki w poprzek ekranu po prawej, 3 ćwiartki w poprzek ekranu do góry, a trzeci wymiar to możesz się domyślić.

Wydaje mi się, że powiedzmy, że przestrzeń klipu wynosząca 5 oznaczałaby, że lokalizacje w tym obszarze klipu mieszczą się w zakresie od -5 do 5 w każdym wymiarze, zamiast sześcianu o wymiarach 5 x 5 x 5. Ale to prawdopodobnie dlatego, że po prostu: wszystkie współrzędne xy i z są podzielone przez wymiar przestrzeni klipu, więc w zasadzie twoje wierzchołki podlegają temu:

x = x / w

y = r / w

z = z / w

I to sprawia, że ​​wszystko jest możliwe. Myślę, że powodem tego jest łatwe porównanie. Jeśli współrzędne zostały podzielone przez wymiar przestrzeni wycięcia, wówczas współrzędna, która ma 1 lub więcej komponentów o wartości większej niż 1, istnieje poza obszarem wycięcia. Jeśli więc przestrzeń na klip ma na przykład 1024, ale współrzędna wynosi [2000,3, -100], to składnik x (2000) znajduje się poza przestrzenią na klip (tylko w zakresie od -1024 do 1024).

obliczeniowo łatwo jest stwierdzić, czy coś znajduje się w schowku, jeśli wszystko, co musisz zrobić, to (bardzo nieuprzejmie wstawić ofc): (x / w) <1 && (x / w)> - 1, a następnie renderować. Ponadto przypuszczam, że wszystkie przestrzenie klipu wszystkich wierzchołków mają ten sam rozmiar (więc każda kostka przestrzeni klipu w zakresie od -1 do 1 w każdym wymiarze) ułatwia wszystko, co nastąpi po procesie normalizacji, ponieważ od tego momentu wszystkie współrzędne są unosi się w zakresie od 0 do 1 (pomijając to, co zostało obcięte).

dammkewl
źródło
Pytanie brzmiało: dlaczego klip-space jest taki, jaki jest, a nie to, co oznacza clip-space. To jest sens podziału przez W.
Nicol Bolas,
2
Odpowiada na 3 pytanie z 3 punktorów =)
dammkewl
8

TL; DR nie jest przestrzenią 4D, jest 3D plus liczba skalująca, która praktycznie zawsze wynosi 1. Jeśli jest to 1, możesz ją zignorować, a pierwsze trzy liczby to x, y, z. Jeśli nie, komplikuje się.

Oto proste wyjaśnienie. Wierzchołki w 3D powinny mieć tylko trzy komponenty

⌈x⌉ v = |y| ⌊z⌋

Jeśli chcemy nimi manipulować (np. Obracanie, skalowanie itp.), Używamy macierzy. Najczęstszym przykładem jest oczywiście matryca Model-View-Projection (MVP), która przekształca współrzędne świata w przestrzeń klipu. Lubię to:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Ma to jednak dużą wadę: tłumaczenie nie jest możliwe. Jeśli [x,y,z]wynosi zero, bez względu mna wynik zawsze będzie zero, więc nie możemy mieć MVP obejmującego tłumaczenie. Oczywiście chcielibyśmy to. Rozwiązaniem jest dodanie 1 na końcu naszych wektorów i rozszerzenie macierzy do 4x4:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(Jeśli spojrzysz na jakąkolwiek ortogonalną matrycę MVP - np. Z glOrtho()- zauważysz, że czwarty rząd jest 0 0 0 1. Czasami jest nawet ukryty.) Jeśli przejdziesz przez matematykę, zobaczysz, że jest to to samo, co

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

Czwarty składnik jest wywoływany wi chociaż nie musi to być 1, prawie zawsze tak jest ( przed transformacją i tak; potem jest zwykle ponownie homogenizowany przez podzielenie całego wektora przez, wwięc jest ponownie 1). To rodzaj włamania, aby umożliwić matrycom transformacji dołączanie tłumaczenia.

Edytować

Uważam, że pierwotną motywacją były projekcje perspektywiczne , które nie są możliwe przy współrzędnych 3D. Istnieją inne transformacje, które można wykonać tylko za pomocą wektorów 4D, ale tłumaczenie jest najłatwiejsze do zrozumienia.

Timmmm
źródło
2
Wyjaśnij swoje opinie negatywne.
Timmmm,
+1, zakładając, że informacje są prawidłowe, było to dobre wytłumaczenie i było dla mnie pomocne. dzięki
Łukasz
1

Jest jeszcze jeden powód, który widzę i który nie był wspomniany w poprzednich odpowiedziach.

Macierze tłumaczeń to 4x4, dzięki czemu można również tłumaczyć obiekt dookoła „świata”. Ponieważ za pomocą macierzy 3x3 można obracać i skalować współrzędne 3d, ale można tłumaczyć współrzędne 3d tylko za pomocą macierzy 4x4, stąd potrzeba wyrażenia współrzędnych 3d w wektorze 4d.

Marco
źródło
wystarczy tylko wektor 4d w takich definicjach. matryca 4x4 nie służy wyłącznie do dodawania, tak jak wszyscy lubią zakładać i domagać się innych. jeśli wszystko, co chciałeś, to dodać tłumaczenie po obrocie (do punktu 3d), wystarczy zdefiniować macierz 4x3. jest o wiele bardziej wydajny, jeśli to wszystko, czego szukasz. nie musisz ograniczać się do reguł, które zostały stworzone z wielu innych powodów, po prostu dlatego, że wygląda to ładniej. lol
Puddle