Java Verständnsifrage zur orthographischer/perspektivischer Projektion

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo Leute,

ich habe im Netz diesen tollen Code entdeckt, der einen 3D Würfel "zeichnen" kann.

Allerdings benötige ich ein wenig Hilfe beim Verständnis des Kernquelltexts. Ich frage mich, was "azimuth" bzw. "theta" ("azimuth" in RAD) und "elevation" bzw. "phi" bedeuten und was bei der orthographischen/perspektivischen Projektion genau passiert. Ich habe bereits bei Wikipedia geschaut aber keine passenden "Formeln" dort gefunden. Wird das denn nirgendwo erklärt?

Code:
// compute coefficients for the projection
      double theta = Math.PI * azimuth / 180.0;
      double phi = Math.PI * elevation / 180.0;
      float cosT = (float)Math.cos( theta ), sinT = (float)Math.sin( theta );
      float cosP = (float)Math.cos( phi ), sinP = (float)Math.sin( phi );
      float cosTcosP = cosT*cosP, cosTsinP = cosT*sinP, sinTcosP = sinT*cosP, sinTsinP = sinT*sinP;

...
      for ( j = 0; j < vertices.length; ++j ) {
         int x0 = vertices[j].x;
         int y0 = vertices[j].y;
         int z0 = vertices[j].z;

         // compute an orthographic projection
         float x1 = cosT*x0 + sinT*z0;
         float y1 = -sinTsinP*x0 + cosP*y0 + cosTsinP*z0;

         // now adjust things to get a perspective projection
         float z1 = cosTcosP*z0 - sinTcosP*x0 - sinP*y0;
         x1 = x1*near/(z1+near+nearToObj);
         y1 = y1*near/(z1+near+nearToObj);

Viele Grüße,
CPU
 
Ohne die Formeln im einzelnen Nachzuvollziehen:
Du hast in der Computergraphik eine Kamera, die eine Position (x,y,z) im Raum bzw. Weltkoordinatensystem und eine Ausrichtung (wo ist vorne wo ist oben) im Weltkoordinatensystem besitzt. Die Ausrichtung selbst kann man auf verschiedene Art und Weise repräsentieren: Rotationsmatrizen (verwendet man am häufigsten unter anderem in DirectX und OpenGL), Eulerwinkel, oder Quaternionen. Zweite hier der Kerl hier verwendet. Alle diese Repräsentationen sind jedoch Gleichwertig; man kann alle Repräsentation ineinander überführen.

Zusätzlich definiert man einen Kameraraum bzw. Kamera-Koordinatensystem. Dies ist so ausgerichtet, dass eine Achse senkrecht in den Bildschirm schaut, eine nach links und eine nach oben. Zum Zeichnen benötigt man in einer ortogonalen Projektion die Vertexe im Prinzip im diesem Kamera-Koordinatensystem, gegeben sind die Vertexe jedoch immer im Weltkoordinatensystem. Deshalb definiert man sich eine Abbildung. um die Vertexe vom Weltkoordinatensystem ins Kamerakoordinatensystem zu transformieren. Dies scheinen diese beiden Zeilen zu machen:

Code:
 float x1 = cosT*x0 + sinT*z0;
float y1 = -sinTsinP*x0 + cosP*y0 + cosTsinP*z0;

Eine Perspektivische Projektion unterscheidet sich von einer Orthogonalen Projektion nur dadurch, dass die Dinge in der mit der Entfernung kleiner werden. Dadurch verknüpft man die orthogonale Projektion mit einer weiteren Abbildung, welche für das kleiner werden zuständig ist. Dafür sind folgende Codezeilen zuständig:

Code:
 // now adjust things to get a perspective projection
float z1 = cosTcosP*z0 - sinTcosP*x0 - sinP*y0;
x1 = x1*near/(z1+near+nearToObj);
y1 = y1*near/(z1+near+nearToObj);
 
Zuletzt bearbeitet:
Wie e-Funktion schon richtig sagte, geht es um Kugelkoordinaten. Der Azimuthwinkel wird im Wiki-Link bereits korrekt beschrieben, der Elevationswinkel entspricht dann dem dort Polarwinkel genannten Winkel.

Zum Thema perspektivische vs. orthographische Projektion siehe:

http://de.wikipedia.org/wiki/Zentralprojektion

besonders das Bild mit den Häusern.
 
Das sind keine "Kugelkoordinaten", denn diese beschreiben einen Punkt im 3-dimensionalen Raum, während Eulerwinkel eine Ausrichtung beschreiben. Teilweise besitzen beide aber die selben Bezeichnungen für die "ähnlichen" Winkel und beide sind auch von den Grundgedanken recht ähnlich.
 
Hallo,

Nai schrieb:
Ohne die Formeln im einzelnen Nachzuvollziehen:
Du hast in der Computergraphik eine Kamera, die eine Position (x,y,z) im Raum bzw. Weltkoordinatensystem und eine Ausrichtung (wo ist vorne wo ist oben) im Weltkoordinatensystem besitzt.

okay, das kenne ich schon.

Nai schrieb:
Die Ausrichtung selbst kann man auf verschiedene Art und Weise repräsentieren: Rotationsmatrizen (verwendet man am häufigsten unter anderem in DirectX und OpenGL), Eulerwinkel, oder Quaternionen. Zweite hier der Kerl hier verwendet. Alle diese Repräsentationen sind jedoch Gleichwertig; man kann alle Repräsentation ineinander überführen.

Das ist neu ... Quaternionen. Ich habe bereits versucht das in den Google-Übersetzer einzugeben (also "Azimuth", weil ich das nicht identifizieren konnte) aber ohne Erfolg.

Allerdings glaube ich, dass diese Beschreibung für meinen Zweck besser geeignet ist (ein bisschen herumbasteln und etwas über Java2D ausgeben).

Kennt Ihr noch ein gutes Tutorial, dass man nicht so direkt findet?

Vielen Dank,
CPU
 
CPU schrieb:
Hallo,
Ich habe bereits versucht das in den Google-Übersetzer einzugeben (also "Azimuth", weil ich das nicht identifizieren konnte) aber ohne Erfolg.

Das heißt im Deutschen genauso, nur ohne h :D Stell dir vor du stehst auf einer Fläche und kannst dich um 360° um dich selbst drehen. Willst du jetzt beschreiben in welche Himmelsrichtung du guckst, sagst du zB 60° von Norden aus, das ist dann dein Azimut. Die Elongation ist dann der Winkel in dem du nach oben oder unten guckst, eine Elongation von 90° entspricht dann dem Zenit, also dem Punkt direkt über dir. Bei einer Elongation von 180° schaust du dann quasi wieder hinter dich :D
 

Ähnliche Themen

Zurück
Oben