【问题标题】:OpenGL Perspective Looks OffOpenGL 透视图关闭
【发布时间】:2014-03-07 09:57:18
【问题描述】:

我正在使用以下显示代码为一个项目绘制一个简单的旋转木马的底部:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 1.0, 3.0, 7.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 4.0, 3.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0);

GLUquadricObj *obj = gluNewQuadric();
glTranslatef(0, 0, -0.05);
glColor3f(0, 0, 0);
gluCylinder(obj, radius, radius, 0.1, 100, 1);
glColor3f(0, 1, 0);
gluPartialDisk(obj, 0, radius, 100, 1, 0, 90);
glColor3f(1, 1, 0);
gluPartialDisk(obj, 0, radius, 100, 1, 90, 90);
glColor3f(1, 0, 0);
gluPartialDisk(obj, 0, radius, 100, 1, 180, 90);
glColor3f(0, 0, 1);
gluPartialDisk(obj, 0, radius, 100, 1, 270, 90);

glutSwapBuffers();

现在,这或多或少可以正常工作。它产生了这个,这是我所期望的(不是扩展):

这里的问题是它看起来很奇怪和不切实际。中心应该在......好吧,中心,但明显更“向下”产生的图像。旋转场景可以确认部分磁盘实际上大小相同且原点相同。这可能是什么原因造成的?

【问题讨论】:

  • 从什么时候开始透视圆心,在中心?这是一个很好的解释:illustrationfixation.blogspot.co.at/2011/05/…
  • 我想我应该说“中心附近的某个地方”。是的,透视将它“向下”移动了一点,但这看起来是错误的。
  • 显然我不允许编辑 - 看着那个链接让我意识到生成的图像是向后的。较小的一半应该在“顶部”。

标签: c++ opengl glut


【解决方案1】:

我不确定这是否真的是您的问题的原因,但我对此有一种强烈的预感:您没有提供反映视口纵横比的纵横比。

gluPerspective 中,第二个参数采用视口的方面。在某个地方你有一个电话glViewport(x,y,width,height)。您应该为gluPerspective 提供宽度和高度的比率,即

gluPerspective(45.0, (float)width/(float)height, 3.0, 7.0);

【讨论】:

  • 我实际上没有调用 glViewport - 我不完全确定它的目的是什么。至于纵横比,它设置为 1,但根据您告诉我的内容,这是正确的,因为我的视口实际上是 500x500(我从图像中剪掉了其余部分)。
  • @macamatic:视口告诉 OpenGL 窗口的哪个矩形区域(以像素为单位)应映射到 NDC 体积的限制(即投影后)。默认值是窗口的完整大小此时OpenGL 上下文第一次绑定到该窗口。窗口几何图形的所有后续更改不会自动反映在视口上。依赖该默认行为不是很可靠,因此强烈建议您在显示例程开始时设置视口。
【解决方案2】:

如果您有相机控件或可以随时间旋转它,您可能会更好地了解正在发生的事情。

看起来有点像圆柱体部分遮住了圆盘的红色和黄色部分。

这似乎不太可能,但深度测试或背面剔除可能还有其他问题?

glEnable(GL_DEPTH_TEST); //not enabled by default on all OSes
glDisable(GL_CULL_FACE); //just to be sure
glDisable(GL_BLEND); //for good measure

小心投影中的近/远值 - 它们非常接近,可以轻松剪掉您不想要的东西。再说一次,如果相距超过 10,000,你就会遇到深度战斗问题。

【讨论】:

  • 我试过让它随着时间的推移而旋转,它基本上看起来像你从上图中所期望的那样。它围绕四个部分圆盘的角旋转。卸下圆柱体表明它没有覆盖任何东西。无论如何,我尝试了您的添加,但唉,它们没有帮助。事实上,启用深度测试会导致部分磁盘因某些深不可测的原因不合适。
【解决方案3】:

嗯,结果很简单。看了 KoKuToru 的链接后,我突然意识到它实际上是向后的——也就是说,看起来更大的那一半圆在上面,而它应该在下面。通过一点实验,我发现罪魁祸首在这一行:

gluLookAt(0.0, 4.0, 3.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0);

具体来说,第二个参数。这是积极的,这表明向上,而不是向下,这是我真正想要的。哦。

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多