2009-03-31 6 views
13

Ich möchte die 2D-Bildschirmkoordinaten (x, y) von Punkten im 3D-Raum (x, y, z) zu bestimmen.Perspektive Projektion - Hilfe ein Noob

Die Punkte, die ich projizieren möchte, sind reale Punkte, die durch GPS-Koordinaten und Höhen über dem Meeresspiegel dargestellt werden.

Zum Beispiel: Point (Lat: 49,291882, Long: -123,131676, Höhe: 14 m)

die Kameraposition und die Höhe können auch als ein x, y, z Punkt bestimmt werden. Ich habe auch die Richtung der Kamera (Kompass Grad), den Grad der Neigung (über/unter Horizont) und die Rolle (um die z-Achse).

Ich habe keine Erfahrung mit 3D-Programmierung, daher habe ich das Thema perspektivische Projektion gelesen und gelernt, dass es Kenntnisse über Matrizen, Transformationen usw. erfordert - all das verwirrt mich derzeit völlig.

Mir wurde gesagt, dass OpenGL nützlich sein könnte, um ein 3D-Modell der realen Punkte zu konstruieren, die Kameraausrichtung einzurichten und die 2D-Koordinaten der 3D-Punkte abzurufen.

Ich bin aber nicht sicher, ob OpenGL ist die beste Lösung für dieses Problem und auch wenn es ich habe, ist keine Ahnung, wie Modelle erstellen, einrichten Kameras etc

Könnte jemand vorschlagen, die beste Methode zu lösen mein Problem? Wenn OpenGL eine praktikable Lösung ist, müsste ich OpenGL ES verwenden, wenn das einen Unterschied macht. Oh und welche Lösung ich auch wählen mag, sie muss schnell ausgeführt werden.

Danke für Ihre Hilfe

+0

Würdest du Ameise, um Dinge zu zeichnen, oder willst du nur ein paar Punkte berechnen? –

Antwort

4

Sie brauchen in der Tat ein perspective projection und matrix operations damit erheblich vereinfachen. Ich nehme an, Sie wissen bereits, dass Ihre spherical coordinates für diese Berechnungen in Cartesian coordinates umgewandelt werden muss.

Mit OpenGL würde wahrscheinlich sparen Sie eine Menge Arbeit über das Rollen Ihrer eigenen software rasterizer. Also würde ich zuerst empfehlen. Sie können Ihr System auf einem PC entwickeln, da OpenGL ES nicht zu unterschiedlich ist, solange Sie es einfach halten.

+0

Ich wusste nicht, dass ich in kartesische Koordinaten umwandeln musste, also danke dafür. In Bezug auf OpenGL, ich denke, ich werde versuchen, eine Lösung zu implementieren, da es Methoden zum Einrichten der Kameraposition und, glaube ich, einen Mechanismus verwendet, um die 2D-Projektion aus dem 3D-Modell zu erhalten. Kennen Sie gute Tutorials? –

+0

Dies sind klassische Tutorials, die auf mehrere Sprachen portiert sind: http://nehe.gamedev.net/ –

2

Wenn Sie nur die Koordinaten einiger Punkte berechnen müssen, sollten Sie nur einige Algebra Fähigkeiten, nicht 3D-Programmierung mit OpenGL benötigen.

Außerdem openGL nicht mit Geographic beschäftigen koordiniert

zunächst einige doc über WGS84 und geodätischen Koordinaten erhalten, müssen Sie zuerst Ihre GPS-Daten in einem kartesischen Rahmen konvertieren (zum Beispiel die Erde zentrierte kartesischer Rahmen, in dem ist das WGS84-Ellipsoid definiert).

Dann können die Berechnungen mit Matrix stattfinden. Die Kette von Transformationen ist in etwa:

  • WGS84
  • Erde zentrierte Koordinaten
  • einige lokale Frame
  • Kamerarahmen
  • 2D-Projektions

Für die erste Umwandlung siehe this Die letzte beinhaltet eine Projektionsmatrix Die anderen sind nur Koordinaten Rotationen und Übersetzungen. Der "einige lokale Rahmen" ist der lokale kartesische Rahmen mit Ursprung als Ihre Kamera Position Tangente an das Ellipsoid.

2

Ich würde "Mathematik für 3D-Spiele-Programmierung und Computergrafik" von Eric Lengyel empfehlen. Es umfasst Matrizen, Transformationen, den View-Frustum, die perspektivische Projektion und mehr.

Es gibt auch ein gutes Kapitel im OpenGL Programming Guide (red book) zum Anzeigen von Transformationen und zum Einrichten einer Kamera (einschließlich der Verwendung von gluLookAt).

Wenn Sie nicht daran interessiert sind, die 3D-Szene anzuzeigen und auf OpenGL ES beschränkt sind, dann ist es vielleicht besser, nur Ihren eigenen Code zu schreiben, um das Mapping von 3D- zu 2D-Fensterkoordinaten durchzuführen. Als Ausgangspunkt können Sie Mesa 3D, eine Open Source-Implementierung von OpenGL, herunterladen, um zu sehen, wie sie gluPerspective (um eine Projektionsmatrix zu setzen), gluLookAt (um eine Kameratransformation einzustellen) und gluProject (um einen 3D-Punkt auf 2D-Fensterkoordinaten zu projizieren) implementieren).

12

Hier ist eine sehr allgemeine Antwort. Sagen Sie, die Kamera ist bei (Xc, Yc, Zc) und der Punkt, den Sie projizieren möchten, ist P = (X, Y, Z). Die Entfernung von der Kamera zu der 2D-Ebene, auf die Sie projizieren, ist F (also ist die Gleichung der Ebene Z-Zc = F). Die 2D-Koordinaten von P, projiziert auf die Ebene, sind (X ', Y').

dann sehr einfach:

X '= ((X - Xc) * (F/Z)) + Xc

Y' = ((Y - Yc) * (F/Z)) + Yc

Wenn Ihre Kamera der Ursprung ist, dann erleichtert dies:

X '= X * (F/Z)

Y' = Y * (F/Z)

+0

Sollten die ersten beiden Gleichungen nicht 'X' = ((X - Xc) * (F/(Z-Zc))) + Xc' und 'Y '= ((Y - Yc) * (F/(Z-Zc))) + Yc'? –

+1

@rofrankel Was ist, wenn ich Punkt mit Z = 0 projizieren möchte? – 0x6B6F77616C74