OpenGL透视望远镜头

时间:2014-03-07 09:57:18

标签: c++ opengl glut

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

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

现在,这或多或少都可以。它产生了这个,这是我所期待的(不按比例):

enter image description here

这里的问题是它看起来很奇怪而且不切实际。中心应该在...井,中心,但相反,显着进一步“下降”产生的图像。旋转场景确认部分磁盘实际上是相同的大小和大约相同的原点。可能导致这种情况的原因是什么?

3 个答案:

答案 0 :(得分:0)

我不确定这是否是您问题的真正原因,但我对此有了强烈的预感:您没有提供反映视口宽高比的宽高比。 < / p>

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

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

答案 1 :(得分:0)

如果您有相机控制或可以随时间旋转它,您可能会更好地了解发生了什么。

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

似乎不太可能,但深度测试或背面剔除可能会有进一步的问题?

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多个,你就会遇到深度战斗问题。

答案 2 :(得分:0)

嗯,事实证明这很简单。在看了KoKuToru的链接之后,我突然意识到它实际上是向后的 - 也就是说,看起来更大的圆圈的一半在应该在底部时位于顶部。通过一些实验,我发现罪魁祸首就在这一行:

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

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