gpt4 book ai didi

c++ - OpenGL 绘制椭圆而不是圆形

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:25 25 4
gpt4 key购买 nike

我的 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) 范围内。

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

正射投影可以通过glOrtho设置.如果你想设置一个允许你绘制窗口大小比例的投影,那么你必须这样做:

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

如果视口(viewport)是矩形的,则必须通过映射坐标来考虑这一点。

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) 之前,您“清除”了投影矩阵并且关心 View 的外观。

像这样改变你的代码:

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 指令不应存在。

关于c++ - OpenGL 绘制椭圆而不是圆形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47106796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com