我目前正在编写从模型空间到剪辑空间的转换,以便在 OpenGL 中使用。据我所知,程序员通常使用传统的矩形截头体来定义模型空间中的裁剪边界。我个人想到了一个像截锥体的形状,除了近平面和远平面是以截锥体(相机)顶点为中心的球体。所以看起来像这样:
黄色区域对应于 OpenGL 的裁剪空间,两个球体(在此横截面图像中描绘为圆圈)对应于 OpenGL 的 z=-1
(内球体)和 z=1
(外球体)。
这是一种更现实的投影建模方式,还是在设计投影矩阵时我应该坚持使用传统的矩形截头体?
最佳答案
不。我不确定你说的完全诚实是什么意思,但无论如何都不是。
好吧,在许多(全部?,大多数?)与剪切平面相交的大多边形中,实际上被分解成较小的三角形,否则,外部有一个顶点的单个大多边形将被简单地忽略。这就是剪辑实际涉及的内容。
还记得当你玩旧游戏并走进物体时,如果你离得太近,它们就会消失吗?如果当多边形的角刚好在 View 之外时,洞的东西就消失了,这不是很糟糕吗?见 this为了澄清。
投影到球体而不是平面上。
屏幕是平坦的,因此 3d 场景中的对象被投影到平坦的表面上,相当于跟踪从对象到相机的光线并找到它与显示器相交的位置。奇怪的“不切实际”的 3d 外观是由于观看者的眼睛 a) 不是点相机和 b) 很少在正确的视场距离处。
关于opengl - 使用 "spherical frustum"进行 3D 投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20740829/