我正在写一个太空探索应用程序。我决定以光年为单位,并准确地模拟了恒星之间的距离。经过修补和大量艰苦的工作(主要是学习绳索),我已经让相机从穿越宇宙的星际飞船的角度正常工作。
最初我没有注意 gluPerspective () 的 zNear 参数,直到我研究行星物体。由于我的比例尺是光年单位,我很快意识到由于 zNear 为 1.0f,我将无法看到这样的物体。经过实验,我得出了这些数字:
#define POV 45
#define zNear 0.0000001f
#define zFar 100000000.0f
gluPerspective (POV, WinWidth/WinHeight, zNear ,zFar);
这非常有效,因为我能够巡航我的太阳系(位置 0,0,0)并靠近行星,这些行星看起来光线充足且纹理贴图。然而,其他系统(不在位置 0,0,0)更难通过,因为物体以不寻常的方式远离相机。
然而,我注意到在宇宙中巡航时开始出现奇怪的视觉故障。我身后的物体会“环绕”并显示在前方,如果我在 Y 方向旋转 180 度,它们也会出现在原来的位置。因此,当在太空中翘曲时,大多数恒星都正确地视差,但有些则出现并朝相反的方向行进(至少可以说令人不安)。
通过将 zNear 更改为 0.1f 可以立即纠正所有这些故障(但也不会解决太阳系物体)。所以我被困住了。我也尝试过使用 glFrustum 并产生完全相同的结果。
我使用以下内容来查看世界:
glTranslatef(pos_x, pos_y, pos_z);
根据需要使用相关的相机代码进行定位。即使禁用相机功能也不会改变任何东西。我什至尝试过 gluLookAt() 并再次产生相同的结果。
使用极端 zNear / zFar 值时 gluPerspective() 是否有限制?我试图缩小范围,但无济于事。我什至通过放大所有内容并使用更大的 zNear 值将我的世界单位从光年更改为公里 - 没有。帮助!