我的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,但这似乎不起作用。感谢。
答案 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_MODELVIEW
,GL_PROJECTION
和GL_TEXTURE
,所有矩阵运算都应用于glMatrixMode
指定的矩阵堆栈。
这意味着代码段末尾的两条glPopMatrix
说明都不应该存在。