线性深度、透视深度与正交深度的区别及viewZ差异解析
关于Three.js中投影深度与线性深度的疑问解答
为什么不同投影下viewZ对应的深度值不同?
这本质是由正交投影和透视投影的投影原理差异决定的:
- 正交投影属于平行投影,相机前方的物体无论距离远近,屏幕上的显示大小都一致,因此视图空间的
viewZ(Three.js中相机沿负Z轴看向前方,viewZ为物体在相机空间的Z坐标,值为负)到最终深度值的映射是线性关系——深度值随viewZ的变化均匀分布。 - 透视投影模拟人眼近大远小的视觉效果,为实现这种效果,投影过程会对深度做非线性压缩:近平面附近的
viewZ变化会带来更明显的深度值变化(深度精度更高),远平面附近的viewZ变化对应的深度值变化则会被大幅压缩(精度更低)。这种非线性特性导致透视投影下viewZ到深度值的映射是分式函数关系。
线性深度是不是正交深度的另一种称呼?
是的。正交投影下的深度映射本身就是线性的,所以正交深度本质就是线性深度——这也是Three.js没有单独提供viewZToLinearDepth函数的原因,viewZToOrthographicDepth的作用就是实现视图空间Z值到线性深度的转换。
结合代码的具体解释
给出的两个函数都是将视图空间的viewZ转换为[0,1]范围的深度值:
viewZToOrthographicDepth:公式为(viewZ + near) / (near - far),这是标准的一次线性函数,输入viewZ和输出深度值呈严格线性关系,对应线性深度(正交深度)。viewZToPerspectiveDepth:公式为(near + viewZ) * far / [(far - near) * viewZ],这是分式函数,体现了透视投影的非线性深度压缩特性,输入viewZ和输出深度值是非线性关系。
内容的提问来源于stack exchange,提问作者Pershing
相关产品推荐
相关产品推荐

