2017-11-04 286 views
2

我的openGL应用程序将圆形绘制成椭圆形而不是圆形。我的代码是:OpenGL绘制椭圆而不是圆形

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(); 

我该如何解决这个问题?

我试过改变glMatrixModes,但似乎并不奏效。谢谢。

+0

这实质上是一个重复https://stackoverflow.com/questions/9071814/opengl-stretched-shapes-aspect-ratio –

+0

可能重复的[OpenGL拉伸形状 - 纵横比](https://stackoverflow.com /问题/ 9071814/OpenGL的拉伸形纵横比) – BDL

回答

0

投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标。 然后,这些剪辑坐标也可以通过用剪辑坐标的w分量来转换为标准化设备坐标(NDC)。 标准化的设备坐标范围为(-1,-1,-1)至(1,1,1)。

通过正投影,眼睛空间坐标线性映射到NDC。

正投影可以设置glOrtho。如果你想建立一个投影,让您在窗口大小尺度绘制,那么你必须做这样的:

int wndWidth = 800; 
int wndHeight = 400; 
glOrtho(0.0, (float)wndWidth, 0.0, (float)wndHeight, -1.0, 1.0); 

如果视口的矩形这必须通过映射坐标considerd。

float aspect = (float)widht/height; 
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f); 


您设置正确的窗口大小的投影矩阵绘制的矩形(drawRect

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

..... 

drawRect(.....); 


但你“清除”的投影矩阵之前,做关心在绘制圆之前的视图方面(drawBall)。

某种程度上改变你这样的代码:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

float aspect = 800.0f/400.0f; 
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f); 

drawBall(); 


顺便说一句,而glPushMatrix推一个元素矩阵堆栈,glPopMatrix从矩阵栈中弹出一个元素。在OpenGL中,每个矩阵模式都有一个矩阵堆栈(请参阅glMatrixMode)。矩阵模式为GL_MODELVIEW,GL_PROJECTIONGL_TEXTURE,并且所有矩阵运算都应用于您通过glMatrixMode指定的矩阵堆栈。
这意味着代码段末尾的glPopMatrix指令都不应该在那里。