Die Projektionsmatrix transformiert alle Eckpunktdaten von den Augenkoordinaten in die Clipkoordinaten. Dann werden diese Clipkoordinaten ebenfalls in die normalisierten Gerätekoordinaten (NDC) transformiert, indem sie mit w
Komponenten der Clipkoordinaten dividiert werden. Die normalisierten Gerätekoordinaten liegen im Bereich (-1, -1, -1) bis (1, 1, 1).
Bei der orthographischen Projektion werden die Augenraumkoordinaten linear auf den NDC abgebildet.
Die orthographische Projektion kann von glOrtho
eingerichtet werden. Wenn Sie eine Projektion einrichten möchten, dass Sie in der Fenstergrößenskalen zeichnen können, dann haben Sie es wie dies zu tun:
int wndWidth = 800;
int wndHeight = 400;
glOrtho(0.0, (float)wndWidth, 0.0, (float)wndHeight, -1.0, 1.0);
Wenn das Ansichtsfenster rechteckig ist dies durch das Abbilden der Koordinaten considerd werden muss.
float aspect = (float)widht/height;
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
Sie legen eine geeignete Fenstergröße Projektionsmatrix, bevor Sie die Rechtecke zeichnen (drawRect
)
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 800, 0.0f, 400, 0.0f, 1.0f);
.....
drawRect(.....);
Aber Sie „klar“ die Projektionsmatrix und tun nicht Sorge um der Aspekt der Ansicht vor dem Zeichnen des Kreises (drawBall
).
Code ändern irgendwie wie folgt aus:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = 800.0f/400.0f;
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
drawBall();
By the way, während glPushMatrix
Push ein Element zu dem Matrix-Stack, ein Element aus dem Matrix-Stack glPopMatrix
Pop. In OpenGL gibt es einen Matrixstack für jeden Matrixmodus (siehe glMatrixMode
). Die Matrixmodi sind GL_MODELVIEW
, GL_PROJECTION
und GL_TEXTURE
und alle Matrixoperationen werden auf den Matrixstapel angewendet, den Sie durch glMatrixMode
festgelegt haben.
Das bedeutet, dass die beiden glPopMatrix
Anweisungen am Ende Ihres Code-Snippets nicht da sein sollten.
Dies ist im Wesentlichen ein Duplikat von https://stackoverflow.com/questions/9071814/opengl-stretched-shapes-aspect-ratio –
Mögliches Duplikat von [OpenGL gestreckte Formen - Seitenverhältnis] (https://stackoverflow.com/questions/9071814/opengl-gestreckte Formen-Seitenverhältnis) – BDL