斜视锥体不扭曲场景

时间:2013-05-27 12:02:17

标签: c++ algorithm opengl 3d frustum

我试图根据用户的位置实现场景的3D透视。我读到了非对称平截头体方法,当用户没有从轴上看时,可以实现失真。

我以前用于离轴投影的代码是:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
    glFrustum(frustumLeft, frustumRight, frustumBottom, frustumTop, frustumNear, frustumFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, headZ);
drawWalls();

当用户正在查看轴时,场景将被绘制为: enter image description here

当截头锥体偏离轴线时,场景将被绘制为: enter image description here

然而,我期望在下面的图像中有所改变(通过使用gluLookAt和assymetric frustum实现)。 http://i40.tinypic.com/9uteh3.png

对于上面的程序,我使用assymetric frustum来指定观看体积和更改参数(第2张图片)只使场景看起来像一个小翻译(没有失真)。我想知道这是否是正确的行为,或者我是否错过了某些内容并且没有得到应该存在的场景中的失真(如第3张图像)。不应该单独扭曲视锥体给我扭曲的场景输出吗?

1 个答案:

答案 0 :(得分:1)

除了透视图始终是对称的事实之外,视锥体与透视图类似 如果你使截锥体不对称,它将显示与图像2中相同的效果。 现在第二张图像发生的情况是,与右侧相比,它的左侧视图体积更大,因此如果图像位于中间,它将向右移动。 示例如此处所示image-frustum右侧的视图体积与左侧相比更多,因此看起来对象被推向左侧,因为右侧体积现在占据更多空间。

如果我们改变相机位置或它看到的位置,那么我们对象的对称性会发生变化。 就像你在x轴上向左或向右移动你的头一样,你的计算机屏幕的对称性会发生变化。感觉就像有点倾斜。