Dlaczego poruszamy świat zamiast kamery?

87

Słyszałem, że w grze OpenGL, aby pozwolić graczowi się poruszyć, nie należy poruszać kamerą, ale poruszać całym światem.

Na przykład tutaj jest fragment tego samouczka: macierz OpenGL View

W prawdziwym życiu przyzwyczajasz się do poruszania aparatem w celu zmiany widoku określonej sceny, w OpenGL jest na odwrót. Kamera w OpenGL nie może się poruszać i jest ustawiona jako (0,0,0) zwrócona w kierunku ujemnym Z. Oznacza to, że zamiast przesuwać i obracać kamerę, świat przesuwa się i obraca wokół kamery, aby utworzyć odpowiedni widok.

Dlaczego to robimy?

danijar
źródło
1
Kamera reprezentuje jedynie widok projekcyjny. Przekształcasz świat, aby uzyskać żądaną projekcję. Pomysł jest dziwny, ale w rzeczywistości ma sens ... w pewnym sensie ... myślę
Sidar,
@sharethis, poprawiłem swoją odpowiedź z lepszym wyjaśnieniem. Dodano perspektywę projekcji z opcją matematyczną i kamerą 3D (kamera wirtualna). Może być pomocny dla ciebie i innych.
Md Mahbubur Rahman
4
W rzeczywistości nie jest to prawdą, ponieważ obie operacje (poruszanie kamerą lub obiekty na świecie) są symetryczne, nie ma możliwości określenia, która operacja miała miejsce. Myślisz o świecie poruszającym się wokół kamery, ale równie dobrze ktoś inny może wizualizować kamerę poruszającą się w odwrotnym kierunku wokół świata ... Dobra, więc możesz przenosić obiekty względem siebie, więc jeden sposób może być bardziej intuicyjny, ale żaden osoba jest „w błędzie”, oba sposoby wizualizacji sytuacji są dobre w różnych sytuacjach. Często warto pomyśleć o obu.
user3728501

Odpowiedzi:

72

Dlaczego ?

Ponieważ kamera reprezentuje widok projekcyjny.

Ale w przypadku kamery 3D (kamera wirtualna) kamera porusza się zamiast świata. Później szczegółowo wyjaśniłem tę odpowiedź.

Zrozumienie matematyczne

Widok rzutu porusza się po przestrzeni i zmienia jej orientację. Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że pożądana projekcja na ekranie nie zmienia się wraz z kierunkiem widoku.

Z tego powodu przekształcamy inne rzeczy, aby uzyskać pożądaną projekcję.

Zrozumienie z http://opengl.org

Aby wyglądać na poruszoną kamerę, aplikacja OpenGL musi przesunąć scenę z odwrotnością transformacji kamery. w przypadku OpenGL nie ma kamery. Mówiąc dokładniej, kamera zawsze znajduje się we współrzędnej przestrzeni oka (0, 0, 0)

Zrozumienie From http://open.gl

Również chcesz udostępnić następujące linie z części Matryca widokowa http://open.gl/transformations

Aby zasymulować transformację kamery, trzeba transformować świat odwrotnością tej transformacji. Przykład: jeśli chcesz przesunąć kamerę w górę, musisz zamiast tego przesunąć świat w dół.

Zrozumienie z perspektywy

W prawdziwym świecie widzimy rzeczy w sposób nazywany „perspektywą”.

Perspektywa odnosi się do koncepcji, że obiekty znajdujące się dalej są mniejsze niż te, które są bliżej Ciebie. Perspektywa oznacza również, że jeśli siedzisz na środku prostej drogi, faktycznie widzisz granice drogi jako dwie zbieżne linie.

To jest perspektywa. Perspektywa ma kluczowe znaczenie w projektach 3D. Bez perspektywy świat 3D nie wygląda na prawdziwy.

Choć może się to wydawać naturalne i oczywiste, należy wziąć pod uwagę, że podczas tworzenia renderowania 3D na komputerze próbujesz symulować świat 3D na ekranie komputera, który jest powierzchnią 2D.

Wyobraź sobie, że za ekranem komputera znajduje się prawdziwa scena 3D, a ty oglądasz ją przez „szybę” ekranu komputera. Używając perspektywy, Twoim celem jest stworzenie kodu, który renderuje to, co jest „rzutowane” na tę „szklankę” ekranu, tak jakby za ekranem znajdował się prawdziwy świat 3D. Jedynym zastrzeżeniem jest to, że ten świat 3D nie jest prawdziwy… to tylko matematyczna symulacja świata 3D.

Tak więc, gdy używasz renderowania 3D do symulacji sceny w 3D, a następnie rzutujesz scenę 3D na powierzchnię 2D ekranu, proces ten nazywa się rzutowaniem perspektywicznym.

Zacznij od intuicyjnego wyobrażenia sobie, co chcesz osiągnąć. Jeśli obiekt znajduje się bliżej widza, obiekt musi wydawać się większy. Jeśli obiekt jest dalej, musi wydawać się mniejszy. Ponadto, jeśli obiekt odsuwa się od widza, w linii prostej, chcesz, aby zbiegał się w kierunku środka ekranu, gdy przesuwa się dalej w dal.

Tłumaczenie perspektywy na matematykę

Patrząc na ilustrację na poniższym rysunku, wyobraź sobie, że obiekt znajduje się w scenie 3D. W świecie 3D pozycję obiektu można opisać jako xW, yW, zW, odnosząc się do układu współrzędnych 3D z punktem początkowym w punkcie oka. Tam właśnie znajduje się obiekt, w scenie 3D poza ekranem.

wprowadź opis zdjęcia tutaj

Gdy widz ogląda ten obiekt na ekranie, obiekt 3D jest „rzutowany” na pozycję 2D opisaną jako xP i yP, która odnosi się do układu współrzędnych 2D ekranu (płaszczyzny projekcji).

Aby umieścić te wartości we wzorze matematycznym, użyję układu współrzędnych 3D dla współrzędnych świata, gdzie oś x wskazuje w prawo, y wskazuje w górę, a dodatnie punkty z wewnątrz ekranu. Pochodzenie 3D odnosi się do położenia oka widza. Tak więc szkło ekranu znajduje się w płaszczyźnie prostopadłej (pod kątem prostym) do osi Z, w pewnym punkcie Z, który nazywam ZProj.

Możesz obliczyć rzutowane pozycje xP i yP, dzieląc pozycje świata xW i yW przez zW, w następujący sposób:

xP = K1 * xW / zW yP
= K2 * yW / zW

K1 i K2 są stałymi wyprowadzonymi z czynników geometrycznych, takich jak współczynnik kształtu płaszczyzny projekcji (twoja rzutnia) i „pole widzenia” twojego oka, które uwzględnia stopień widzenia szerokokątnego.

Możesz zobaczyć, jak ta transformacja symuluje perspektywę. Punkty w pobliżu boków ekranu są przesuwane w kierunku środka wraz ze wzrostem odległości od oka (ZW). Jednocześnie punkty znajdujące się bliżej środka (0,0) są znacznie mniej zależne od odległości od oka i pozostają blisko środka.

Ten podział przez z jest znanym „podziałem perspektywicznym”.

Teraz rozważmy, że obiekt w scenie 3D jest zdefiniowany jako seria wierzchołków. Stosując tego rodzaju transformację do wszystkich wierzchołków geometrii, skutecznie upewniasz się, że obiekt skurczy się, gdy znajdzie się dalej od punktu oka.

Inne ważne przypadki

  • W przypadku kamery 3D (wirtualnej kamery) kamera porusza się zamiast świata.

Aby lepiej zrozumieć kamery 3D, wyobraź sobie, że kręcisz film. Musisz ustawić scenę, którą chcesz sfotografować i potrzebujesz aparatu. Aby uzyskać materiał filmowy, będziesz przemierzać scenę aparatem, strzelając do obiektów w scenie pod różnymi kątami i punktami widzenia.

Ten sam proces filmowania zachodzi w przypadku kamery 3D. Potrzebujesz „wirtualnej” kamery, która może wędrować po utworzonej przez Ciebie „wirtualnej” scenie.

Dwa popularne style strzelania polegają na obserwowaniu świata oczami bohatera (znanym również jako kamera z perspektywy pierwszej osoby) lub kierowaniu kamery na postać i utrzymywaniu ich w polu widzenia (znanym jako kamera z perspektywy trzeciej osoby).

Jest to podstawowe założenie kamery 3D: wirtualna kamera, której można używać do wędrowania po scenie 3D i renderowania materiału z określonego punktu widzenia.

Zrozumienie przestrzeni świata i przestrzeni widokowej

Aby zakodować tego rodzaju zachowanie, wyrenderujesz zawartość świata 3D z punktu widzenia kamery, a nie tylko z punktu widzenia układu współrzędnych świata lub z innego stałego punktu widzenia.

Mówiąc ogólnie, scena 3D zawiera zestaw modeli 3D. Modele są zdefiniowane jako zestaw wierzchołków i trójkątów, odniesionych do ich własnego układu współrzędnych. Przestrzeń, w której modele są zdefiniowane, nazywana jest przestrzenią modelu (lub lokalną).

Po umieszczeniu obiektów modelu w scenie 3D przekształcisz wierzchołki tych modeli za pomocą macierzy „transformacji świata”. Każdy obiekt ma swoją własną matrycę świata, która określa, gdzie obiekt znajduje się na świecie i jak jest zorientowany.

Ten nowy system odniesienia nazywa się „przestrzenią świata” (lub przestrzenią globalną). Prostym sposobem zarządzania nim jest powiązanie macierzy transformacji świata z każdym obiektem.

Aby zaimplementować zachowanie kamery 3D, musisz wykonać dodatkowe kroki. Będziesz odnosić się do świata - nie do jego pochodzenia - ale do systemu odniesienia samej kamery 3D.

Dobra strategia polega na traktowaniu kamery jako rzeczywistego obiektu 3D w świecie 3D. Jak każdy inny obiekt 3D, używasz macierzy „transformacji świata”, aby ustawić kamerę w żądanej pozycji i orientacji w świecie 3D. Ta matryca transformacji świata kamery przekształca obiekt kamery z oryginalnego obrotu w kierunku do przodu (wzdłuż osi Z) w rzeczywistą pozycję świata (xc, yc, zc) i obrót świata.

Poniższy rysunek pokazuje relacje między układem współrzędnych Świat (x, y, z) a układem współrzędnych Widok (kamera) (x ', y', z ').

wprowadź opis zdjęcia tutaj

Md Mahbubur Rahman
źródło
5
Tam są inne odpowiedzi. Nie musisz ich edytować we własnym.
Jesse Dorsey
1
@Noctrine, Thanks. Nie wiedziałem, jak utworzyć link między stronami.
Md Mahbubur Rahman,
„W następnej sekcji użyjesz tej formuły rzutowania perspektywicznego do ActionScript, którego możesz używać w swoich projektach Flash 3D.” Ponieważ w oryginalnym pytaniu nie ma wzmianki o projekcie Flash 3D, myślę, że skopiowałeś to z innego miejsca, co jest w porządku, jeśli powołujesz się na swoje źródła.
Gilles
@Gilles, przepraszam za mój błąd. Zredagowałem swoją odpowiedź. Przygotowałem odpowiedź studiując kilka źródeł. I wielkie dzięki dla ciebie, jak wskazałeś. :)
Md Mahbubur Rahman
Zauważ, że glMatrixMode()i kilka innych funkcji, o których mowa w: eng.utah.edu/~cs6360/Lectures/frustum.pdf i opengl.org/archives/resources/faq/technical/viewing.htm są przestarzałe. Jednak opis matematyczny pozostaje poprawny i pomocny.
patryk.beza
28

Odpowiedź Mahamubara R. Aamana jest całkiem poprawna, a linki, które podaje, dokładnie wyjaśniają matematykę, ale jeśli chcesz odpowiedzi mniej technicznej / matematycznej, spróbuję zastosować inne podejście.

Pozycje obiektów w świecie rzeczywistym i świecie gry są definiowane za pomocą pewnego układu współrzędnych. Układ współrzędnych nadaje znaczenie wartościom pozycji. Jeśli powiem ci, że jestem na „100,50”, to ci nie pomoże, chyba że wiesz, co oznaczają te liczby (czy to mile, kilometry, szerokość i długość geograficzna itp.). Jeśli są to współrzędne kartezjańskie („normalne” rodzaje współrzędnych), musisz także wiedzieć, do jakiego pochodzenia się odnoszą; jeśli tylko powiem „Jestem 100 stóp na wschód”, musisz wiedzieć „na wschód od czego ”, co nazywa się początkiem współrzędnych.

Można to łatwo wymyślić. Można powiedzieć komuś „stacja kolejowa znajduje się 3 kilometry na północ i 1,5 kilometra na wschód od południowo-zachodniego rogu miasta”. Możesz także powiedzieć komuś „stacja kolejowa znajduje się 1 milę bezpośrednio na północ od miejsca, w którym teraz jestem”. Obie współrzędne są poprawne i identyfikują lokalizację tego samego punktu orientacyjnego, ale są mierzone z innego źródła, a zatem mają różne wartości liczbowe.

W aplikacji 3D istnieje na ogół układ współrzędnych „świata”, który służy do reprezentowania położenia kamery i obiektów w grze, mierzonych za pomocą współrzędnych kartezjańskich o dowolnym pochodzeniu określonym przez projektanta (zazwyczaj środek dowolnego poziomu lub mapa, w którą grasz). W grze istnieją inne układy współrzędnych, takie jak kartezjański układ współrzędnych z kamerą na początku. W dowolnym momencie możesz zdefiniować dowolny nowy układ współrzędnych, a chcesz to zrobić bardzo często w symulacji 3D, aby ułatwić matematykę.

Algorytm, który faktycznie renderuje pojedynczy trójkąt na ekranie, działa w określony sposób, więc nie jest wygodna bezpośrednia praca ze współrzędnymi świata podczas renderowania. Matematyka tak naprawdę nie jest skonfigurowana do obsługi takich informacji, jak: „obiekt znajduje się 100 jednostek na prawo od centrum świata”. Zamiast tego matematyka chce pracować z „przedmiotem jest bezpośrednio przed kamerą i 20 jednostek dalej”. Dlatego do matematyki renderowania dodawany jest dodatkowy krok, aby zająć pozycje świata obiektów i przetłumaczyć je z układu współrzędnych kamery.

Oczywiście kamera ma również pozycję i orientację. Więc jeśli obiekt znajduje się w pozycji 20,100,50, a kamera jest w pozycji 10,200, -30, pozycja obiektu względem kamery wynosi 10 100,80 (pozycja obiektu minus pozycja kamery). Gdy kamera porusza się w grze, ta pozycja kamery we współrzędnych świata jest przesuwana dokładnie tak, jak można się spodziewać.

Zauważ, że obiekty nie są przenoszone; pozostają tam, gdzie byli wcześniej. Jednak ich pozycja jest teraz wyrażana w odniesieniu do innego początku współrzędnych. Współrzędne świata obiektu poruszają się tylko wtedy, gdy sam obiekt się porusza, ale jego współrzędne kamery również zmieniają się za każdym razem, gdy kamera się porusza, ponieważ są one względne względem położenia kamery.

Zauważ też, że cytowany przez ciebie opis samouczka jest uproszczonym wyjaśnieniem i niekoniecznie dokładnym opisem tego, co robi OpenGL. Nie sądzę, żeby autor tego artykułu tego nie zrozumiał; autor po prostu próbował zastosować uproszczoną analogię, która w tym przypadku spowodowała zamieszanie, zamiast go wyeliminować.

Jeśli pomoże ci to lepiej zrozumieć, dlaczego matematyka dba o współrzędne kamery, spróbuj tego ćwiczenia: unieś ręce dotykając kciuków i palców wskazujących razem, aby utworzyć prostokąt (nazwijmy to „rzutnią”) i rozejrzyj się po pokoju, w którym jesteś w. Znajdź obiekt i spójrz na niego, a następnie rozejrzyj się wokół niego, ale nie bezpośrednio na niego. Kiedy to zrobisz, zadaj sobie pytanie: „gdzie jest obiekt w mojej rzutni?” Ten obiekt ma określoną długość i szerokość geograficzną w świecie rzeczywistym, której można użyć do ustalenia jego położenia na Ziemi, ale to nic nie mówi o tym, co widzisz. Powiedzenie „obiekt znajduje się w lewym górnym rogu mojej rzutni i wygląda na około 2 metry dalej” mówi ci jednak sporo. Utworzyłeś układ współrzędnych względem głowy i kierunku, w którym „ ponownie szukam, który określa, gdzie obiekt jest zgodny z twoją wizją. Właśnie tego potrzebuje trójkątna część rasterizera OpenGL / Direct3D i to właśnie matematyka wymaga, aby pozycje obiektu i orientacja zostały przekształcone z ich dogodnych współrzędnych światowych na współrzędne kamery.

Sean Middleditch
źródło
Chociaż dla mnie matematyczne wyjaśnienie jest jasne i zrozumiałe, jest to również świetne wyjaśnienie! Wierzę, że pomogłeś wielu innym w tym samym pytaniu.
danijar
+1 za wyjaśnienie, czy kamera się porusza, czy świat jest tylko funkcją tego, o którym układzie współrzędnych mówisz.
David Moles,
11

Dodając tylko do dwóch pozostałych (doskonałych) odpowiedzi, dokonałem dalszego rozwinięcia kwestii, o której poruszał Mahbubur R. Aaman: „nie ma kamery”.

Jest to całkiem prawdą i reprezentuje błąd wspólnej analogii „kamery”, ponieważ „kamera” tak naprawdę nie istnieje. Ważne jest, aby zdać sobie sprawę, że analogia kamery jest dokładnie taka - analogia. Nie opisuje (ani nie udaje, że opisuje) sposób, w jaki rzeczy faktycznie działają za kulisami.

Więc postrzegaj (gra słów zamierzona) jako sposób na pomoc w obejściu tych rzeczy, jeśli jest to dla ciebie nowe, ale zawsze pamiętaj, że to tylko pomocnik, a nie jakikolwiek opis tego, jak rzeczy są naprawdę.

Teraz masz dwie klasy obiektów, które są tu istotne: punkt widzenia i wszystko na świecie. Chcesz przesunąć punkt widzenia bliżej niektórych obiektów, ale w przypadku tego ruchu efekt końcowy jest taki sam, niezależnie od tego, czy widok zbliża się do obiektów, czy też obiekty zbliżają się do widoku. Wszystko, co robisz, to zmienianie odległości między nimi; ponieważ bieżący dystans wynosi X, a chcesz, aby nowy dystans wynosił Y, nie ma znaczenia, który ruch przesuniesz, pod warunkiem, że po ruchu nowa odległość wynosi Y. Więc tak naprawdę wcale się nie poruszasz, ty po prostu zmieniam odległość. (Nie chciałem omijać całego Einsteina w tym ... szczerym!)

Ponieważ jednak aparat nie istnieje, jedyną rzeczą, którą możesz zmienić, to odległość od obiektów. Zmieniasz odległość obiektów i wychodzi ten sam rezultat. Ponieważ wszystkie obiekty przechodzą transformacje w każdym razie nie jest to mniej lub bardziej kosztowne.

Prostsze wyjaśnienie matematyczne może pomóc więcej. Udawajmy, że wszystkie współrzędne mają wartość 1D - punkt widzenia wynosi 0, twoje obiekty mają wartość 4, a chcesz, aby punkt widzenia miał wartość 3. Oznacza to, że odległość między nimi zmieni się z 4 (4 - 0) na 1 (4 - 3). Ale ponieważ kamera nie istnieje, nie można zmienić tego 0; zawsze będzie wynosić 0. Więc zamiast dodawać 3 do 0 (czego nie możesz zrobić), odejmujesz 3 od 4 (co możesz zrobić) - obiekty są teraz na 1, a wynik końcowy jest taki sam - odległość między punkt widzenia i obiekty to 1.

Maximus Minimus
źródło
Chociaż kamera nie istnieje jako taka, nadal możesz obliczyć jej położenie przed transformacją. Jednak w niektórych przypadkach (projekcja równoległa nieosiowa) uzyskasz więcej niż jedną ze zwykłych współrzędnych „w nieskończoności” (dodatnią lub ujemną), co jest mniej przydatne niż macierz transformacji.
Martin Sojka
7

Poruszanie aparatem lub poruszanie światem to dwa równie ważne wybory, które sprowadzają się do tego samego. Na koniec dnia zmieniasz jeden układ współrzędnych na drugi. Powyższe odpowiedzi są prawidłowe, ale w jaki sposób je wizualizujesz, to dwie strony tej samej monety. Transformacje mogą przebiegać w obie strony - są tylko odwrotnością względem siebie.

Część procesu renderowania przekształca się ze współrzędnych świata na współrzędne oka. Jednak łatwym sposobem modelowania tego jest użycie wirtualnej kamery w aplikacji. Kamera może reprezentować zarówno matrycę projekcji (która jest odpowiedzialna za efekt perspektywy), jak i matrycę widoku, która służy do konwersji z przestrzeni świata na przestrzeń oka.

Chociaż moduł cieniujący wierzchołki używa macierzy widoku do zmiany współrzędnych geometrii na przestrzeń oka, często łatwiej jest pomyśleć o obiekcie kamery poruszającym się po świecie wirtualnym, który podczas ruchu ponownie oblicza macierz widoku.

Więc w swojej aplikacji poruszasz kamerą w światowych światach, aktualizujesz matrycę kamer, przekazujesz nową macierz widoków do modułu cieniującego wierzchołek jako jednolitą część bloku, renderujesz scenę.

Sean Harmer
źródło
5

Zamiast tego uważałbym, że jest to błędna analogia. Mówiąc najprościej, „poruszanie kamerą” i „poruszanie światem” są dokładnie tą samą konstrukcją matematyczną - po prostu poruszanie światem jest nieco łatwiejsze do myślenia koncepcyjnego, szczególnie jeśli chodzi o transformacje hierarchiczne. Zasadniczo poruszasz światem wokół kamery tylko w ten sposób, że przekładasz wierzchołki świata na przestrzeń współrzędnych kamery - ale jest to odwracalna transformacja afiniczna.

Kiedy jednak zaczniesz wprowadzać determinację widoczności do miksu, OSTATNIE, co chcesz zrobić, to przetłumaczyć cały świat dookoła kamery. Zamiast tego, w większości przypadków (szczególnie w klasycznym przypadku stałych BSP lub podobnych) będziesz używał pozycji kamery na świecie, aby sprawdzać struktury widoczności w celu ustalenia, które rzeczy mogą być widoczne, a następnie tłumacz TYLKO rzeczy w przestrzeń współrzędnych aparatu.

puszysty
źródło
4

Nie sądzę, aby twierdzenie to było kategorycznie prawdziwe, ponieważ rzadko kiedy „porusza się” współrzędne świata w grze, ale w rzeczywistości zmienia współrzędne wirtualnej kamery.

Koncepcja kamery faktycznie polega na przekształceniu sferycznego widoku - czyli ściętej piramidy z 8 punktami narożnymi (lub zdefiniowanymi przez przecięcie 6 płaszczyzn) w sześcian jednostkowy, który reprezentuje przestrzeń klipu w końcowych etapach openGL rurociąg renderowania.

W tym sensie świat się nie porusza, lecz oblicza się tylko współrzędne świata w układzie współrzędnych przestrzeni klipu.

Aki Suihkonen
źródło
2

Poruszanie kamerą lub poruszanie światem to dwa równie ważne wybory (i oba są prawdziwe). Pod koniec dnia zmieniamy się z jednego układu współrzędnych na drugi. Transformacje mogą przebiegać w obie strony - są tylko odwrotnością względem siebie.

CoolProgrammer
źródło
2

Wiele dobrych odpowiedzi tutaj. Spróbuję nie powtarzać żadnego z nich. Czasami łatwiej jest myśleć o kamerze, na przykład o tym, jak robi to Direct3D (uwaga: nie grałem z dużą ilością postów 9.0c)

„Poruszanie światem” w sensie Futurama, że ​​ktoś tam cytowany to bardzo dobry sposób, aby na to spojrzeć („Silniki wcale nie poruszają statkiem. Statek pozostaje tam, gdzie jest, a silniki poruszają wszechświatem wokół to!"). Było to dość powszechne w grach 2D. Dosłownie miałeś rzutnię, którą trudno ci dostosować, a czasem była to twoja RAM wideo lub okno interfejsu użytkownika. Jeśli OpenGL robi to z takich powodów, trudno powiedzieć.

Z pewnością możesz myśleć o ruchu 2D również w kategoriach kamery, a właśnie taki proces myślenia może ułatwić znalezienie efektów.

Joe Plante
źródło
1
Spóźniona, ale też miła odpowiedź!
danijar
Dzięki! Zawsze uważałem, że dodanie do dyskusji na stronach znalezionych za pomocą wyszukiwarki okazuje się być bardzo doceniane, szczególnie jeśli informacje są przydatne lub interesujące
Joe Plante
2

Wydaje się, że istnieje wiele nieporozumień, poczynając od autorów dokumentów OpenGL ...

Pozwól mi szybko przywrócić ci zdrowie psychiczne: świat się nie porusza , pozostaje na miejscu. Ktokolwiek próbuje zaimplementować świat jako poruszanie się po odtwarzaczu, w trybie wieloosobowym szybko wpadnie w kłopoty. Nie wspominając już o tym, że aktualizacja pozycji milionów (lub miliardów) obiektów na świecie przy każdym ruchu gracza spowoduje dość powolną rozgrywkę ...

Co się tam naprawdę dzieje i co jest z cytatem?

Przede wszystkim musisz zrozumieć koncepcję układu współrzędnych. Ogólnie rzecz biorąc, wybierasz jeden punkt na świecie i deklarujesz, że jest to „początek”, czyli punkt o współrzędnych (0,0,0). Możesz także wybrać trzy „główne” kierunki, które nazywasz X, Y i Z. Oczywiście istnieje wiele sposobów przypisywania układu współrzędnych. Zwykle istnieje jeden „światowy układ współrzędnych”, w tym układzie świat jest nieruchomy (mniej więcej). W grze ten system wybierałby projektant poziomów.

Teraz wygodnie jest też rozważyć inny układ współrzędnych, związany z okiem gracza. W tym układzie współrzędnych gracz zawsze ma współrzędne (0,0,0), a świat porusza się i obraca wokół niego. Dlatego cytat jest poprawny, jeśli rozumiesz, że został napisany w układzie współrzędnych gracza .

Jednak świat nie działa we współrzędnych gracza, działa we współrzędnych świata. A gdy w grę wchodzą dwa układy współrzędnych, zawsze istnieje sposób na przekształcenie jednego rodzaju współrzędnych w drugi. W OpenGL odbywa się to za pomocą matrycy widoku 4x4.

Ostatecznie, gdy gracz się porusza, świat pozostaje nieruchomy, podczas gdy gracz jest poruszany. Jest to współrzędne świata, sposób przechowywania obiektów w grze. Gracz ma również powiązaną z nim kamerę widokową, która podobnie porusza się po całym świecie (pomimo tego, co mówią dokumenty OpenGL). Aby jednak pokazać świat na ekranie użytkownika, współrzędne wszystkich widocznych obiektów są tłumaczone na układ współrzędnych gracza za pomocą macierzy transformacji, a następnie stosuje się dodatkową projekcję w celu uzyskania efektu perspektywy. W układzie współrzędnych tego gracza świat wydaje się poruszać wokół gracza. Ale to po prostu wyjątkowo nieprzydatny i zagmatwany sposób myślenia o tym.

Basza
źródło
zaczynając od autorów dokumentów OpenGL ” Tak, ponieważ jestem pewien, że twórcy OpenGL są oczywiście zbyt głupi, aby zrozumieć różnicę między prezentacją świata (o którą troszczy się OpenGL) a konceptualną reprezentacją tego świata ( co nie jest tym, czym zajmuje się OpenGL).
Nicol Bolas
Ale to po prostu wyjątkowo nieprzydatny i mylący sposób myślenia o tym. ” To także prawda . A prawda jest zawsze bardziej pomocna niż kłamstwo. Ponieważ prędzej czy później to kłamstwo cię dopadnie i będziesz musiał zmierzyć się z prawdą.
Nicol Bolas