我正在创建一个基于软件的3D渲染器来学习概念和数学。这很有趣,我有一个很好的旋转立方体在一个网格顶部作为一种地板。网格/楼层使用线段进行渲染。我有一个使用简单的查看转换定位和定位的虚拟相机。观察平面任意设置在与“眼睛”相距n的位置,或者在z = -n
处。我应该如何处理剪切到观看平面的3D点的投影?
除了一件事以外,一切正常(从对象到世界到相机空间,剔除,项目,剪辑,渲染)。渲染网格时,线段端点可能会跨越虚拟相机的查看平面。我想渲染可见的部分,以便剪切到查看平面。剪辑的端点投影到查看平面。投影如下:
p'(x) = -n * p(x)/p(z)
p'(y) = -n * p(y)/p(z)
所有可能显示的点将有p(z) ≤ -n
。被剪切到观看平面的点有p(z) = -n
。因此,我有效:
p'(x) = p(x)
p'(y) = p(y)
对于这样一个点;一个正交投影。
这里的值可以很容易地位于查看平面上的窗口之外,这会导致视口转换将这些点发送出OS窗口的界限。其效果是我看到杂乱的线条周期性地飞来飞去。这太糟糕了。
简直就像说OpenGL那样做(我只是使用OpenGL!),我错过了什么?
谢谢(如果你做到了这一点!)。
下面是显示异常的截图。网格的右上角不在视野内。朝向网格左侧角落的线段位于相机后面,因此被裁剪。终点经历了(错误的)正投影,并在左场结束。
我没有做任何视锥体剔除(还)。也许我应该?
我遵循你的逻辑,但对我来说,你似乎不应该有一个直线正投影这些点! – 2011-12-16 06:32:06
这个问题混合了一些问题1)你混合了在窗口之外和观点之后的话题。 2)你提到了正射投影,但这看起来是一个与透视投影有关的问题。 – ideasman42 2016-12-28 04:41:38