如何处理三维透视投影中的负深度

时间:2015-02-24 00:20:39

标签: math graphics 3d

背景

这个问题与3年前提出的this question非常相似。基本上,我想重新创建一个基本的第一人称图形引擎作为学习体验。

例如,比方说,我们在z代表深度 - xy映射到x的3D空间中2D空间的y坐标。如果此坐标系的原点是相机,则(0, 0, 1)处的点将直接位于相机前方,(0, 0, -1)处的点将直接位于相机后方。

为此投影添加深度只需要我们将xy分量除以depth(在本例中为z)。在实践中,这对我来说是有道理的,它似乎有效。

直到...

......深度变为负面。如果深度为负值,并且您将xy除以深度,xy的符号将会改变。但从逻辑上讲,我们知道情况并非如此。

到目前为止,我已尝试过一些事情:

  • 使用depth的绝对值 - 这不是理想的。假设有一个点(1, 1, 4)(1, 1, -4)。然后,理论上这些点将投射到同一位置。
  • 尝试将负值近似为小数。因此,如果我们有一个负深度,我们尝试绘制正十进制数(在0和1之间),允许我们的x和y坐标伸展到无穷大。负数越大,代表正小数越接近于零,我们计算。我觉得这可能是一个潜在的解决方案,但我仍然在努力解决这个问题。

那么,你如何处理透视投影中的负深度?

我对图形非常陌生,所以如果我省略了回答这个问题所需的任何信息,请随时提问。我想保持这种实现不可知,因为我觉得这个问题更倾向于透视投影的理论方面。

修改

video确定了我试图解决的问题。这是一个很棒的视频,也是启动这个小项目的灵感来源 - 但我只是想知道是否有一个普遍的同意的'处理这种特殊情况的方法。

1 个答案:

答案 0 :(得分:1)

您正在进行点投影,这意味着您在2D中的投影点正好是3D对象和3D相机之间的线将穿过画布的点。对于正深度,该交点在物体和相机之间。对于负深度,交叉点超出相机。但它仍然是同一条线,因此交换符号是完全合理的。

当然,实际上绘制负深度的东西并没有多大意义,因为通常你不会看到相机背后的东西。如果你这样做,那么你有一些非常广角镜头,所以假设画布作为空间中的平面不再准确,你必须切换到更复杂的投影来模拟鱼眼镜头等。

然而,您可能想要绘制三角形或其他几何图元,并且只有一个角具有负深度,而其他角是正的。在这种情况下通常的做法是将对象剪切到截头体,更具体地说,将其与截头体的近平面相交,从而消除所有具有负深度的点。通常你的图形管道可以处理这种剪辑。