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?
Odpowiedzi:
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).
źródło
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).
źródło
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ędum
na 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 jest0 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
w
i 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,w
wię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.
źródło
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.
źródło