这个问题与3年前提出的this question非常相似。基本上,我想重新创建一个基本的第一人称图形引擎作为学习体验。
例如,比方说,我们在z
代表深度 - x
和y
映射到x
的3D空间中2D空间的y
坐标。如果此坐标系的原点是相机,则(0, 0, 1)
处的点将直接位于相机前方,(0, 0, -1)
处的点将直接位于相机后方。
为此投影添加深度只需要我们将x
和y
分量除以depth
(在本例中为z
)。在实践中,这对我来说是有道理的,它似乎有效。
......深度变为负面。如果深度为负值,并且您将x
和y
除以深度,x
和y
的符号将会改变。但从逻辑上讲,我们知道情况并非如此。
到目前为止,我已尝试过一些事情:
depth
的绝对值 - 这不是理想的。假设有一个点(1, 1, 4)
和(1, 1, -4)
。然后,理论上这些点将投射到同一位置。那么,你如何处理透视投影中的负深度?
我对图形非常陌生,所以如果我省略了回答这个问题所需的任何信息,请随时提问。我想保持这种实现不可知,因为我觉得这个问题更倾向于透视投影的理论方面。
这video确定了我试图解决的问题。这是一个很棒的视频,也是启动这个小项目的灵感来源 - 但我只是想知道是否有一个普遍的同意的'处理这种特殊情况的方法。
答案 0 :(得分:1)
您正在进行点投影,这意味着您在2D中的投影点正好是3D对象和3D相机之间的线将穿过画布的点。对于正深度,该交点在物体和相机之间。对于负深度,交叉点超出相机。但它仍然是同一条线,因此交换符号是完全合理的。
当然,实际上绘制负深度的东西并没有多大意义,因为通常你不会看到相机背后的东西。如果你这样做,那么你有一些非常广角镜头,所以假设画布作为空间中的平面不再准确,你必须切换到更复杂的投影来模拟鱼眼镜头等。
然而,您可能想要绘制三角形或其他几何图元,并且只有一个角具有负深度,而其他角是正的。在这种情况下通常的做法是将对象剪切到截头体,更具体地说,将其与截头体的近平面相交,从而消除所有具有负深度的点。通常你的图形管道可以处理这种剪辑。