Najważniejsze jest to, że konwertuje twoje punkty (wierzchołki) z przestrzeni świata 3D na przestrzeń ekranu 2D.
Oznacza to, że po pomnożeniu wierzchołka przez tę macierz, współrzędne X i Y są pozycjonowane na ekranie (między [-1, 1]), a Z jest głębokością. Z służy do buforowania głębokości i określa, jak daleko wierzchołek (lub fragment) znajduje się od twoich kamer w pobliżu płaszczyzny.
Projekcja oznacza, że wierzchołki, które są bliżej od bliskiej płaszczyzny, są bardziej oddalone od środka ekranu -> trójkąt bliżej kamery wydaje się większy niż ten, który jest daleko. A to zależy od twojego pola widzenia - wpisujesz je w funkcji createProjectionMatrix lub createFrustum. Działa, ponieważ tnie i skaluje fragment aparatu i wierzchołki w nim do kostki jednostkowej. Wartości większe niż 1 i mniejsze niż -1 nie są wyświetlane.
Utrzymuje również proporcje pikseli, więc piksel może być kwadratowy. To jest proste. Po prostu wycina fragment aparatu w ten sposób: szerszy ekran -> więcej pionowego ścinania i odwrotnie.
Prosta odpowiedź:
określa frustum aparatu i dobrze:
- sprawi, że obiekty, które są blisko ciebie, będą większe niż obiekty, które są daleko od ciebie.
- zachowaj proporcje pikseli - Każdy lubi kwadratowy piksel, prawda? :)
Ta odpowiedź jest długo po fakcie, ale ponieważ znalazłem to w google, może to jeszcze komuś pomoże. Chcę tylko wyjaśnić, co mówili JasonD i Notabene: O wiele łatwiej jest wykonywać obliczenia obcinania (dowiedz się, co powinieneś zobaczyć, a czego nie powinieneś widzieć z powodu tego, w jaki sposób patrzysz, jak daleko jest, itp. .). Zamiast sprawdzać, czy rzeczy przecinają płaszczyzny na obrzeżach fragmentu widoku, po prostu porównujesz x, y, z wszystkiego do xMax, xMin, yMax itp. , ponieważ masz po prostu sześcian. Jest to trochę bardziej skomplikowane, jeśli chcesz mieć tylko część czegoś do pokazania, ale matematyka jest nadal lepsza z kostką jednostkową niż z frustum.
Kilka rzeczy, które wprowadziłem w błąd w innych odpowiedziach:
-Nie ścinasz boków od frustum widoku, w pewnym sensie wypaczasz go w sześcian przy użyciu homogenicznych przekształceń macierzy.
- W tym kroku nie konwertujemy do ekranu 2D. Ten krok nie jest konieczny do tego. Teoretycznie moglibyśmy wykonać całą naszą pracę bez konwersji frustum na kostkę, co byłoby bardziej intuicyjne, ale trudniejsze matematyczne - ale grafika polega na wykonywaniu obliczeń naprawdę szybko, ponieważ w przypadku przeciętnej gry / czegokolwiek jest dużo obliczeń na sekundę.
Więcej szczegółów: Konwertujemy niekoniecznie sześcian jednostkowy, po prostu musi to być prostokątne pudełko, aby zadziałały nasze obliczenia maks. Min. W rzeczywistości w klasie użyliśmy ramki, w której kamera jest skierowana w dół względem osi Z, z wynosi od 0 do 1, x zmienia się od -1 do 1, a y zmienia się od -1 do 1. Ogólnie w matematyce 1, 0, a -1 to dobre liczby ułatwiające obliczenia, zakładam, że dlatego nie przechodzimy od -100 do 100 czy coś takiego.
TLDR: Ułatwia przycinanie.
Edycja: sedno ma bobobobo. Ogólnie wszystko jest trójkątami: D.
Źródło: Biorąc udział w grafice uniwersyteckiej
źródło
Uważam, że dzieje się tak, ponieważ OpenGL nie może przyjmować założeń dotyczących sposobu wyświetlania obrazu (proporcje lub rozdzielczość, szczegóły sprzętu itp.). Renderuje i obrazuje w formę pośrednią, którą system operacyjny lub sterownik lub cokolwiek skaluje do prawidłowej rozdzielczości / wielkości.
źródło
Zauważyłem, że odpowiedź została już zaakceptowana, ale generalnie przydatne do obcinania jest przekształcenie widoku frustum w kostkę jednostkową.
źródło
Zastanawiałem się także nad tym. Jest kilka rzeczy do rozważenia.
Po pierwsze, tak, wszystko na świecie przekształca się w tę kostkę jednostkową [-1,1] skupioną wokół źródła. Jeśli coś nie znajduje się w tej jednostce, to nie będzie wyświetlane.
Zaletą jest to, że teraz możesz dość łatwo wyrywać trójkąty. (Jeśli wszystkie 3 wierzchołki trójkąta mają
x > 1
lubx < -1
wtedy trójkąt może zostać ubity).źródło
Poleciłbym sprawdzić lekcję o macierzy projekcji perspektywicznej na Scratchapixel
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Wyjaśnia to wyraźnie, dlaczego należy wypaczać przestrzeń w kształcie ściętego widoku do kostki jednostkowej. Dlaczego? Zasadniczo dlatego, że proces rzutowania punktów 3D na kanwie wymagał konwersji ich przestrzeni NDC, która jest przestrzenią, w której punkty na ekranie są odwzorowywane w zakresie [-1,1] (zakładając, że ekran jest kwadratowy). Teraz ponownie mapujemy współrzędną punktu Z do zakresu [0,1] (lub czasami [-1,1]), dlatego w końcu otrzymujemy sześcian. Faktem jest, że gdy punkty są zawarte w sześcianie, łatwiej jest je przetwarzać niż wtedy, gdy są zdefiniowane w widoku frustrum (co jest dziwną przestrzenią, ściętą piramidą). Innym powodem jest to, że w pewien sposób przenosi wszelkiego rodzaju transformację rzutową, jaką można sobie wyobrazić w CG w to samo miejsce (kostka jednostkowa). Niezależnie od tego, czy na przykład korzystasz z projekcji perspektywicznej czy ortograficznej,
Chociaż może zbytnio skupiasz się na tym, dlaczego. Sześcian jednostkowy jest tak naprawdę wynikiem procesu matematycznego lub wykorzystanego do rzutowania wierzchołków na ekran, a następnie odwzorowania ich współrzędnych na przestrzeń rastrową.
źródło