我目前正在编写从模型空间到剪辑空间的转换,以便在OpenGL中使用。从我所看到的,程序员通常使用传统的矩形平截头体来定义模型空间中的剪裁边界。我个人考虑过像平截头体的形状,除了近平面和远平面是以平截头体(相机)的顶点为中心的球体。所以看起来像这样:
黄色区域对应于OpenGL的剪辑空间,两个球体(在此横截面图像中描绘为圆圈)对应于OpenGL的z=-1
(内部球体)和z=1
(外部球体)。
这是一种更逼真的投影模型,还是在设计投影矩阵时我应该坚持使用传统的矩形平截头体?
答案 0 :(得分:1)
没有。我不确定你的意思是完全诚实,但无论如何都没有。
很多(全部?,大多数?)与剪裁平面相交的大多边形实际上被分成了没有的小三角形 - 否则只有一个顶点外面的大多边形会被忽略。这就是裁剪实际涉及的内容。
还记得当你玩旧游戏并走进物体时,如果距离太远,只会让它们消失吗?如果当多边形的角落在视图之外时,那个洞的东西就消失了,难道不是很糟糕吗?请参阅this以获得澄清。
屏幕是平坦的,因此3d场景中的对象被投影到平面上,相当于将一条光线从物体描绘到相机并找到它与显示器相交的位置。奇怪的“不切实际”的3D外观是观众眼睛的一个结果,a)不是点式相机,b)很少,如果在视野的正确距离。
答案 1 :(得分:0)
用这种方法定义的区域似乎比平截头圆锥体更具逻辑性,原因如下:在广角投影(例如90-120度)中,靠近远平面的物体可能消失并在出现后突然重新出现只是旋转相机。如果从眼睛到物体的距离(欧几里得)在从眼睛到平的视锥的远端平面的中心距离与它的角之间的距离,就会发生这种情况。
球形部分应消除此问题。但是,出现了一个新的变化:在屏幕表面投影后,由于深度计算的变化,平面多边形可能会变形。尽管我不确定那会是什么样子。