我想知道gluLookAt
和glFrustum
是否会扭曲渲染图片。
这是渲染场景的方式:
这是渲染它的代码。
InitCamera
被称为一次,正如我现在所理解的那样,它应该设置一个矩阵,就好像我从上面的2个单位和原点前面的3个单位看朝向原点。此外,glFrustum
用于创建透视图。
void InitCamera() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (
0, 2 , 3,
0, 0 , 0,
0, 1 , - 0
);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum (- 1, 1,
- 1, 1,
1,1000.0);
glMatrixMode(GL_MODELVIEW);
}
然后TheScene
实际绘制了图片:
void TheScene() {
glClear(
GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT
);
glMatrixMode(GL_MODELVIEW);
// Draw red circle around origin and radius 2 units:
glColor3d(1,0,0);
glBegin(GL_LINE_LOOP);
for (double i = 0; i<=2 * M_PI; i+=M_PI / 20.0) {
glVertex3d(std::sin(i) * 2.0, 0, std::cos(i) * 2.0);
}
glEnd();
// draw green sphere at origin:
glColor3d(0,1,0);
glutSolidSphere(0.2,128, 128);
// draw pink sphere a bit away
glPushMatrix();
glColor3d(1,0,1);
glTranslated(8, 3, -10);
glutSolidSphere(0.8, 128, 128);
glPopMatrix();
SwapBuffers(hDC_opengl);
}
红色球应绘制在原点和周围红圈的中心。但看着它只是感觉很奇怪,并且让我觉得绿球根本不在中心。
此外,粉红色的球应该被绘制成一个完美的圆形,而不是椭圆形。
所以,我错了,图片绘制正确,还是我设置错了?
答案 0 :(得分:5)
你的期望完全错误
3d圆的透视投影(如果圆是完全可见的)是椭圆,但圆的中心的投影通常不是椭圆的中心。
球体透视投影的轮廓通常为conic section,即可以是圆形,椭圆形,抛物线形或双曲线形,具体取决于视点,投影平面和球体的位置。 3D。原因是球体的轮廓可以想象为从视点开始的锥形,并触及与投影平面相交的球体。
当然,如果您正在观察具有完全垂直相机的圆圈,则圆心将投影到圆形投影的中心。以同样的方式,如果你的相机精确指向一个球体,球体轮廓将是一个圆圈,但这些是特殊情况,而不是一般情况。
这些中心之间的差异在强视角(广角)相机中更为明显。用parallel projection代替这种明显的失真(即圆心的投影恰好是圆的投影的中心)。
答案 1 :(得分:1)
要在屏幕中央看到绿色球体周围有一个完美的圆圈,您需要更改相机位置,如下所示:
gluLookAt (
0, 3, 0,
0, 0, 0,
0, 0, 1
);
不确定是什么导致了紫色球体的扭曲。
答案 2 :(得分:1)
透视是正确的,它看起来很扭曲,因为这就是事情在这里聚集的方式。 尝试使用gluLookAt,然后玩一下。:
gluLookAt (
0, 2 , 10,
0, 0 , 0,
0, 1 , 0
);
我尝试的方式是使用一个设置,允许我用鼠标调整位置和查看方向,这样你就可以获得实时动作。当我四处走动时,你的场景看起来很好如果你愿意,我可以为你提供完整的代码,这样你也可以做到这一点,但这比我想要的答案要多得多。