C++ OpenGL透视图

C++ OpenGL透视图,c++,opengl,glut,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

我使用以下显示代码为项目绘制裸体旋转木马的底座:

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();
现在,这或多或少是可行的。它产生了这一点,这正是我所期望的(不是扩展):


这里的问题是,它只是看起来奇怪和不现实。中心应该在…好的,中心,但相反,是明显的进一步“向下”产生的图像。旋转场景可以确认部分磁盘实际上大小相同,并且位于同一原点附近。是什么导致了这种情况?

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

glupperspective
中,第二个参数采用视口的外观。在某个地方,您可以调用
glViewport(x,y,width,height)
。您应该提供宽度和高度的比率,即

gluPerspective(45.0, (float)width/(float)height, 3.0, 7.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

小心投影中的“近/远”值-它们非常接近,可以轻松地剪裁出您不想要的内容。再一次,相隔10000多个数量级,你会遇到深度战斗的问题。

好吧,结果证明它非常简单。在看了KoKuToru的链接后,我意识到它实际上是向后的——也就是说,看起来更大的那半个圆圈在顶部,而它本应该在底部。通过一点实验,我发现罪魁祸首是这样的:

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

特别是第二个参数。这是积极的,这表明上升,而不是下降,这是我真正想要的。哦。

从什么时候开始,透视图中的圆心在中心?这里有一个很好的解释:我想我应该说“靠近中心的某个地方”。是的,透视图将其“向下”移动了一点,但这看起来是错误的。显然,我不允许编辑-查看该链接使我意识到生成的图像是反向的。较小的一半应该在“顶部”。实际上我没有任何调用glViewport的功能-我不完全确定它的用途是什么。至于纵横比,它被设置为1,但根据你告诉我的,这是正确的,因为我的视口实际上是500x500(我将图像的其余部分修剪掉)。@macamatic:视口告诉OpenGL NDC体积限制(即投影后)应映射到窗口的哪个矩形区域(以像素为单位)。默认值是OpenGL上下文第一次绑定到该窗口时窗口的完整大小。窗几何图形的所有后续更改不会自动反映在视口中。依赖默认行为不是很可靠,因此强烈建议您在显示例程开始时设置视口。我尝试过让它随时间旋转,它基本上看起来就像您从上图中期望的那样。它围绕四个部分磁盘的角旋转。拆下圆筒表明它没有遮盖任何东西。不管怎样,我尝试了你的添加,但是可惜,它们没有任何帮助。事实上,启用深度测试会导致部分磁盘由于某种莫名其妙的原因而错位。