Grundlegendes zur perspektivischen Projektionsmatrix in OpenGL

7

Das Festlegen der Perspektivprojektionsmatrix in Open GL (einschließlich OpenGL ES 2.0) hat das folgende allgemeine Format:

glm::mat4 perspective(float fovy, float aspect, float zNear, float zFar);

Beachten Sie die letzten beiden Parameter . Zunächst wird die zNear- Ebene angegeben, die näher an der Kamera liegt. Die zweite gibt die zFar- Ebene an, die weit von der Kamera entfernt ist.

Es ist allgemein bekannt, dass in OpenGL Dinge, die weiter entfernt sind, mit anderen Worten "tiefer im Bildschirm", eine negative Z-Achse haben . Warum sehen dann alle OpenGL-Beispiele, die eine perspektivische Projektionsmatrix (aus zuverlässigen Quellen wie OpenGL SuperBible und simmilar) festlegen, so aus, als würden die beiden oben genannten Parameter (zNear, zFar) der perspektivischen Projektionsfunktion vertauscht?

Dieses Beispiel stammt aus der GLM-Website (OpenGL Math) :

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); 

Sie können sehen, dass der zNear-Parameter tatsächlich weiter von der Kamera entfernt ist als der zFar-Parameter, der 100 Punkte näher an der Kamera / dem Betrachter liegt.

Können Sie uns bitte leicht verständliche Erklärungen geben ? I es sind nicht nur eines, sondern alle Beispiele, die zFar als höheren positiven Wert als zNear übergeben. Vielen Dank.


Mein Beispiel:

Wenn ich in meinem Code Folgendes einstelle:

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 1000.0f, -500.0f); 

Ich gehe davon aus, dass mein Kegelstumpf in z-positiver Richtung 1000 Punkte und in z-negativer Richtung 500 Punkte lang ist .

Wenn ich solche Dinge einstelle, kann ich zumindest einige Objekte sehen, obwohl die Dinge nicht perfekt sind: Aus bestimmten Gründen sehe ich nur Objekte, die auf negativen z-Koordinaten positioniert sind.

Dies könnte mit meinem falschen Verständnis der perspektivischen Projektionsfunktion zusammenhängen.

Bunkai.Satori
quelle
1
weil zNear und zFar die Entfernung der Flugzeuge von der Kamera angeben, nicht ihre Position ... oder verstehe ich Ihre Frage falsch?
Jeffythedragonslayer
@da Code Affe: +1, nein, Sie verstehen das überhaupt nicht falsch. Sie sagen also, die beiden oben genannten Parameter enthalten keine Koordinaten der physikalischen Ebene, sondern repräsentieren Versatzwerte von der Kamera. Wenn die Kamera bewegt wird, folgt der Kegelstumpf. Dies sollte in OpenGL-Büchern betont worden sein.
Bunkai.Satori
Es ist in den meisten dieser Bücher ziemlich explizit geschrieben; Haben Sie spezielle Beispiele für Passagen, die darauf hinweisen, dass die Werte absolut sind?
Auch nicht, dass es einfach durch Konvention ist, dass Dinge "tiefer" eine "negativere" Tiefe haben. Sie können es arrangieren, wie Sie möchten.
@da code monkey: Wenn Sie wisth, geben Sie Ihre Antwort als reguläre Antwort in diesen Thread ein. Dann kann ich es als akzeptierte Antwort markieren . Vielen Dank für Ihre Hilfe, ich hatte viel Kopfschmerzen.
Bunkai.Satori

Antworten:

5

Die fragliche Methode ( glm::perspective) und ihre Art sind im Wesentlichen Wrapper oder Neuimplementierungen von gluPerspective . Wie Sie der Dokumentation dieser Funktion entnehmen können, sind die Nah- / Fernwerte Entfernungen von der Ansichtsebene und immer positiv.

michael.bartnett
quelle
+1 für hilfreiche Antwort. Hallo Josh, und danke für die Klarstellung. Es war meine Fehlinterpretation des Textes. Dieses Wissen war übrigens der Schlüssel zur Lösung des unvorhersehbaren Verhaltens meiner OpenGL-Grafiken. Da nichts mehr hinzuzufügen ist, möchte ich dies als akzeptierte Antwort markieren .
Bunkai.Satori