2017-11-04 2 views
2

Meine OpenGL-Anwendung zeichnet den Kreis als ein Oval anstelle eines Kreises. Mein Code ist:OpenGL zeichnet Oval anstelle von Kreis

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 

glOrtho(0.0f, 800, 0.0f, 400, 0.0f, 1.0f); 
glMatrixMode (GL_MODELVIEW); 
glLoadIdentity(); 

glPushMatrix(); 

glColor3f(255.0, 255.0, 255.0); 
drawRect(racket_left_x, racket_left_y, racket_width, racket_height); 
drawRect(racket_right_x, racket_right_y, racket_width, 
racket_height); 
glPopMatrix(); 

// drawBall(); 
//drawBall2(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
drawBall(); 

glPopMatrix(); 
glPopMatrix(); 

glutSwapBuffers(); 

Wie ich dieses Problem beheben?

Ich habe versucht, die glMatrixModes zu ändern, aber das scheint nicht zu funktionieren. Vielen Dank.

+0

Dies ist im Wesentlichen ein Duplikat von https://stackoverflow.com/questions/9071814/opengl-stretched-shapes-aspect-ratio –

+0

Mögliches Duplikat von [OpenGL gestreckte Formen - Seitenverhältnis] (https://stackoverflow.com/questions/9071814/opengl-gestreckte Formen-Seitenverhältnis) – BDL

Antwort

0

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.

Verwandte Themen