OpenGL绘制椭圆而不是圆形

时间:2017-11-04 02:30:56

标签: c++ opengl orthographic

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

#include  <stdio.h> 

int main(void)
{
  printf("This is for sure parent\n");
  fork();
  printf("This maybe child or parent\n");
  return 0;
}

我该如何解决这个问题?

我尝试过改变glMatrixModes,但这似乎不起作用。感谢。

1 个答案:

答案 0 :(得分: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 );

如果视口是矩形,则必须通过映射坐标来考虑。

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


但你明白了#34;在绘制圆圈(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_MODELVIEWGL_PROJECTIONGL_TEXTURE,所有矩阵运算都应用于glMatrixMode指定的矩阵堆栈。
这意味着代码段末尾的两条glPopMatrix说明都不应该存在。