2009-03-31 9 views
13

Chciałbym określić współrzędne ekranu 2D (x, y) punktów w przestrzeni 3D (x, y, z).Projekcja perspektywy - pomoc Noobowi

Punkty, które chcę zaprojektować, to rzeczywiste punkty reprezentowane przez współrzędne GPS i wysokość nad poziomem morza.

Na przykład punkt (łac: 49,291882 Long: -123,131676, wysokość: 14 m)

Położenie kamery i wysokość może również być określony jako x, y, punkt z. Mam także nagłówek kamery (stopnie kompasu), jej stopień nachylenia (nad/pod horyzontem) i rzut (wokół osi Z).

Nie posiadam żadnego doświadczenia w programowaniu 3D, dlatego przeczytałem temat projekcji perspektywicznej i dowiedziałem się, że wymaga ona znajomości macierzy, transformacji itp. - z których wszystkie obecnie całkowicie mnie mylą.

Powiedziano mi, że OpenGL może być użyteczny do skonstruowania modelu 3D punktów świata rzeczywistego, skonfigurowania orientacji kamery i pobrania współrzędnych 2D punktów 3D.

Jednak nie jestem pewien, czy przy użyciu OpenGL jest najlepszym rozwiązaniem tego problemu, a nawet jeśli to nie mam pojęcia, jak tworzyć modele, ustanowiony kamer itp

Może ktoś sugerują, że najlepszą metodą rozwiązania mój problem? Jeśli OpenGL jest wykonalnym rozwiązaniem, będę musiał użyć OpenGL ES, jeśli to robi jakąkolwiek różnicę. Aha i jakiekolwiek rozwiązanie, które wybiorę, musi zostać szybko wykonane.

Dzięki za pomoc

+0

Czy ty w mrówka, aby narysować rzeczy, czy chcesz tylko obliczyć punkty? –

Odpowiedz

4

Ty rzeczywiście potrzebują perspective projection i matrix operations znacznie uprościć robić. Zakładam, że już wiesz, że twoje spherical coordinates musi zostać przekształcone na Cartesian coordinates dla tych obliczeń.

Korzystanie z prawdopodobnie zaoszczędziłoby Ci dużo pracy nad przetoczeniem własnego software rasterizer. Tak więc najpierw doradziłbym trying it. Możesz prototypować swój system na komputerze, ponieważ OpenGL ES nie jest zbyt różny, o ile tylko będzie prosty.

+0

Nie wiedziałem, że muszę przekształcić się na współrzędne kartezjańskie, więc dziękuję za to. Jeśli chodzi o OpenGL, myślę, że spróbuję i zaimplementuję rozwiązanie wykorzystujące go, ponieważ ma metody ustawiania pozycji kamery i, jak sądzę, mechanizm uzyskiwania projekcji 2D z modelu 3D. Czy znasz jakieś dobre samouczki? –

+0

Są to klasyczne samouczki przeniesione do kilku języków: http://nehe.gamedev.net/ –

2

Jeśli potrzebujesz tylko obliczyć współrzędne niektórych punktów, potrzebujesz tylko umiejętności algebry, a nie programowania 3D z OpenGL.

Ponadto openGL nie dotyczy Współrzędne geograficzne

Pierwszy dostać około WGS84 i geodezyjne współrzędne jakiś dokument, trzeba najpierw przekonwertować dane GPS do kartezjańskiej ramy (na przykład ziemię centric kartezjański ramki, w której jest definiowana elipsoida WGS84).

Wówczas obliczenia z macierzą mogą mieć miejsce. Łańcuch przemian jest w przybliżeniu: Współrzędne

  • WGS 84
  • ziemia zorientowane
  • pewne lokalnej ramki
  • ramkę kamery
  • rzutu 2D

W pierwszej konwersji patrz this Ostatnia obejmuje matrycę projekcji Pozostałe to tylko obrót współrzędnych i tłumaczenie. "Niektóre lokalne ramki" to lokalna ramka kartezjańska z punktem początkowym jako lokalizacja kamery styczna do elipsoidy.

2

Polecam "Matematyka do programowania gier 3D i grafiki komputerowej" Eric Lengyel. Obejmuje on matryce, transformacje, widok punktu ścięcia, rzut perspektywiczny i wiele innych.

Istnieje również dobry rozdział w Przewodniku programowania OpenGL (czerwona książka) na temat oglądania transformacji i konfigurowania kamery (w tym sposobu korzystania z gluLookAt).

Jeśli nie jesteś zainteresowany wyświetlaniem sceny 3D i są ograniczone do korzystania z OpenGL ES, może lepiej jest po prostu napisać swój własny kod, aby wykonać mapowanie z 3D na współrzędne okna 2D. Jako punkt wyjścia można pobrać Mesa 3D, open sourceową implementację OpenGL, aby zobaczyć, w jaki sposób implementują metodę gluPerspective (do ustawienia macierzy projekcji), gluLookAt (do ustawienia transformacji kamery) i gluProject (aby rzutować punkt 3D na dwuwymiarowe okna)).

12

Oto bardzo ogólna odpowiedź. Powiedzmy, że kamera jest w punkcie (Xc, Yc, Zc), a punktem, który chcesz wyświetlić, jest P = (X, Y, Z). Odległość od kamery do płaszczyzny 2D, na którą rzutujesz, to F (więc równanie płaszczyzny to Z-Zc = F). Współrzędne 2D P rzutowane na płaszczyznę to (X ', Y').

Następnie bardzo prosto:

X '= ((X - X c) * (M/Z)) + Xc

Y' = ((y - Yc) * (M/Z)) + Yc

Jeśli aparat jest pochodzenie, to upraszcza się do:

X '= X * (F/Z)

Y' = Y * (F/Z)

+0

Czy pierwsze dwa równania nie powinny brzmieć "X" = ((X-Xc) * (F/(Z-Zc))) + Xc' i 'Y '= ((Y - Yc) * (F/(Z-Zc))) + Yc'? –

+1

@rofrankel Co jeśli chcę projektować punkt z Z = 0? – 0x6B6F77616C74