OpenGL 绘制椭圆而不是圆形
OpenGL draws oval instead of circle
我的 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,但这似乎不起作用。谢谢
投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标。
然后,通过除以剪辑坐标的 w
分量,这些剪辑坐标也被转换为归一化设备坐标 (NDC)。
归一化设备坐标在 (-1, -1, -1) 到 (1, 1, 1) 范围内。
使用正交投影,眼睛 space 坐标线性映射到 NDC。
可以通过glOrtho
设置正投影。如果你想设置一个允许你绘制 window 大小比例的投影,那么你必须这样做:
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
)
之前设置一个适当的 window 大小的投影矩阵
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 800, 0.0f, 400, 0.0f, 1.0f);
.....
drawRect( ..... );
但是你 "clear" 投影矩阵并且 不 在画圆之前关心视图的方面 (drawBall
)。
像这样更改您的代码:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = 800.0f/400.0f;
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
drawBall();
顺便说一下,虽然 glPushMatrix
push an element to the matrix stack, glPopMatrix
pop an element from the matrix stack. In OpenGL there is one matrix stack for each matrix mode (See glMatrixMode
). The matrix modes are GL_MODELVIEW
, GL_PROJECTION
, and GL_TEXTURE
and all matrix operations, are applied to the matrix stack you have specified by glMatrixMode
.
这意味着代码段末尾的两条 glPopMatrix
指令不应存在。
我的 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,但这似乎不起作用。谢谢
投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标。
然后,通过除以剪辑坐标的 w
分量,这些剪辑坐标也被转换为归一化设备坐标 (NDC)。
归一化设备坐标在 (-1, -1, -1) 到 (1, 1, 1) 范围内。
使用正交投影,眼睛 space 坐标线性映射到 NDC。
可以通过glOrtho
设置正投影。如果你想设置一个允许你绘制 window 大小比例的投影,那么你必须这样做:
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( ..... );
但是你 "clear" 投影矩阵并且 不 在画圆之前关心视图的方面 (drawBall
)。
像这样更改您的代码:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = 800.0f/400.0f;
glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
drawBall();
顺便说一下,虽然 glPushMatrix
push an element to the matrix stack, glPopMatrix
pop an element from the matrix stack. In OpenGL there is one matrix stack for each matrix mode (See glMatrixMode
). The matrix modes are GL_MODELVIEW
, GL_PROJECTION
, and GL_TEXTURE
and all matrix operations, are applied to the matrix stack you have specified by glMatrixMode
.
这意味着代码段末尾的两条 glPopMatrix
指令不应存在。