OpenGL: Verständnisproblem mit Seitenverhältnissen - Benötige Herleitung
-
Hi,
warum muss man den Top-Parameter und den Bottom-Parameter durch das Viewport-Seitenverhältnis teilen, wenn die Breite des Viewports bzw. des Fensters kleiner-gleich als die Viewport- bzw. Fenster-Höhe ist?
Und warum muss man den Left- und den Right-Paramteter mit dem Viewport-Seitenverhältnis multiplizieren, wenn die Breite größer als die Höhe ist?Die Antwort, dass die Verhältnisse dadurch beibehalten werden können, reicht mir nicht.
Ich möchte wissen wie man auf so etwas kommt.
Das wäre mein Ansatz:
1. Je größer die Höhe des Viewports, desto größer die Höhe des Betrachtungsvolumens (Top+abs(Bottom)).
=> Volumen-Höhe_NEU = KONSTANTE * Volumen-Höhe_ALT
=> Bottom_NEU = KONSTANTE * Bottom_ALT
=> Top_NEU = KONSTANTE * Top_ALT2. Je größer die Breite des Viewports, desto größer die Breite des Betrachtungsvolumens(abs(Left)+Right).
Analog zu 1.
Dabei nehme ich an, dass die Near-Ebene gleich dem Viewport ist. Wäre das auch bei einer perspektivischen Projektion so?
Aber die Formel im Code unten ist z.B.: TOP' = (HEIGHT / WIDTH) * TOP
Ich bin verwirrt… Wie kommt man auf so etwas überhaupt? Welcher Ansatz, welche Philosophie steckt dahinter?
void ChangeSize(GLsizei w, GLsizei h) { GLfloat aspectRatio; if(h == 0) h = 1; glViewport(0.0, 0.0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); aspectRatio = (GLfloat)w / (GLfloat)h; if(w<=h) glOrtho(-10.0, 10.0, (-10 / aspectRatio), (10.0 / aspectRatio), 1.0, -1.0); else glOrtho((-10.0 * aspectRatio), (10.0 * aspectRatio), -10, 10.0, 1.0, -1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
-
Das hat mir auch nicht wirklich weitergeholfen: http://stackoverflow.com/questions/15536333/keeping-a-square-clipping-volume-square-regardless-of-viewport-size-in-opengl
Die Seitenverhältnisse der Near-Ebene und des Viewports müssen gleich sein, damit keine Verzerrung stattfinden kann.
Tja, aber warum wird mit den Seitenverhältnissen rummultipliziert und rumdividiert
-
GL n00b schrieb:
Das hat mir auch nicht wirklich weitergeholfen: http://stackoverflow.com/questions/15536333/keeping-a-square-clipping-volume-square-regardless-of-viewport-size-in-opengl
Die Seitenverhältnisse der Near-Ebene und des Viewports müssen gleich sein, damit keine Verzerrung stattfinden kann.
Tja, aber warum wird mit den Seitenverhältnissen rummultipliziert und rumdividiert
Wie kommt man überhaupt darauf??
-
Man muss nicht. Es ist eine Moeglichkeit. Man versucht irgendwie den 3D Einheitswuerfel auf den Bildschirm abzubilden. Da hat man eben die Wahl einen passenden Ausschnitt daraus zu zeigen oder eben den ganzen Wuerfel und noch etwas seiner Umgebung.