Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 基于透视投影的曲面去除深度插值_Math_3d_Interpolation_Perspective - Fatal编程技术网

Math 基于透视投影的曲面去除深度插值

Math 基于透视投影的曲面去除深度插值,math,3d,interpolation,perspective,Math,3d,Interpolation,Perspective,这似乎是一个应该在网络或书籍上找到答案的问题,但到目前为止,我对答案的追求只会让我走上死胡同 我正在尝试通过去除隐藏表面来实时绘制三维线,这些线是实体对象的边 所以我有两个3D点,它们通过透视投影投影到2D点。对于每个点,我都计算了点的深度。现在我想画一条连接两个点的线段,为了去除隐藏面,我必须计算,对于投影产生的2D线上的每个中间2D点,对应3D点的深度,投影在该中间2D点上的3D点 我的问题是,因为在进行透视投影时深度函数不是线性的,所以我不能插值两个原始3D点的深度来计算中间点的深度 那么

这似乎是一个应该在网络或书籍上找到答案的问题,但到目前为止,我对答案的追求只会让我走上死胡同

我正在尝试通过去除隐藏表面来实时绘制三维线,这些线是实体对象的边

所以我有两个3D点,它们通过透视投影投影到2D点。对于每个点,我都计算了点的深度。现在我想画一条连接两个点的线段,为了去除隐藏面,我必须计算,对于投影产生的2D线上的每个中间2D点,对应3D点的深度,投影在该中间2D点上的3D点

我的问题是,因为在进行透视投影时深度函数不是线性的,所以我不能插值两个原始3D点的深度来计算中间点的深度

那么,如何使用与实时渲染约束兼容的方法来计算直线上每个点的深度呢


提前感谢您的帮助。

使用齐次坐标,它可以在屏幕空间中线性插值:

答案的可能副本很容易获得-这是5小时前在这里提出的…仍然没有得到答案:我知道的唯一深度定义是坐标平方和的平方根,如果中心或投影位于原点。根据这个定义,我看不出这个深度函数或它的逆1/深度如何是线性的,因此它与原点的距离是可插入的。计算机图形学术语中的深度是Z。1/Z是线性插值的。好吧,但是当使用透视投影时,要去除隐藏面,不需要距离投影中心的距离吗?当我在光线跟踪的上下文中执行隐藏曲面移除时,我使用的是距离投影中心的距离,它工作得很好。对于大多数情况,1/Z近似值足够好吗?不,1/Z对于光栅化是精确的。看见在透视投影中,按Z或-1/Z对像素排序就足够了。尝试绘制一个视锥,并将光线从眼睛向外绘制到空间中。只要视角小于180度,Z沿任何光线提供正确的顺序。现在,如果你想比较不同光线之间的距离,也就是说,不同像素之间的距离,你也需要考虑X和Y。谢谢你给我指出Chris Hecker的这篇伟大的文章。这是非常有用的,虽然它没有包含一个证据,证明使用Z相对于从投影中心的实际距离来移除隐藏曲面是足够的,正如我认为你一开始暗示的那样。虽然这在直觉上是有道理的,但我希望我有一个数学证明。