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_ALT

    2. 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.


Log in to reply