SceneKit unproject Z文档说明?

我正在浏览一些SceneKit概念,我想在我脑海中凝固的是unprojectPoint。

我知道该函数将在2D中获取一个点并返回3D中的一个点(因此具有正确的Z值)。

当我阅读文档时,我读到了这个:

/*! @method unprojectPoint @abstract Unprojects a screenspace 2D point with depth info using the receiver's current point of view and viewport. @param point The screenspace position to be unprojected. @discussion A point whose z component is 0 (resp. 1) is unprojected on the near (resp. far) clip plane. */ public func unprojectPoint(_ point: SCNVector3) -> SCNVector3 

我不太清楚的是它在讨论Z时使用的值0和1 ….

z分量为0(分别为1)的点在近(resp.far)剪裁平面上未被投影。

当我在网上阅读时,我发现了这个问题:

如何正确使用iOS(Swift)SceneKit SCNSceneRenderer unprojectPoint

当我处理SceneKit视图时,Z = 0总是近平面,Z = 1远平面? 如果是这样,为什么? 并且,Z = 0和Z = 1只是标准化值?

那么,有人可以帮助我理解为什么在这种情况下将值0和1用于Z? 最终帮助我理解:

z分量为0(分别为1)的点在近(resp.far)剪裁平面上未被投影。

声明?

透视投影的任务是将用于建模场景的3D空间中的点转换为渲染场景的视图的2D像素空间。这是GPU在渲染过程中每帧执行数千次的事情。

但它并不完全是3D到2D的转换。 在渲染过程中,重要的是要弄清楚哪些物体离摄像机更近或更远(因此它们会相互模糊),因此透视投影也会输出标准化的深度分量,其中较低的值表示距离摄像机较近的点(反之亦然) )。 (值是标准化的,因为此时所需要的只是相对深度。和/或出于传统3D图形数学历史和GPU设计的原因。)此信息在渲染过程中使用但后来被有效丢弃 – 所有你看到的是2D视图。

“取消投影”一个点反过来做同样的事情:给定2D屏幕空间中的一个点,你想要一个3D场景空间中的一个点。 但是屏幕空间中的2D点对应于3D空间中的线:视图中的每个像素沿着光线观察到3D场景,并且您在该像素中看到的内容来自光线相交的第一个3D对象。

因此,要将2D点取消投影到3D场景空间,您需要2D点本身将光线定义到3D场景中,然后使用标准化深度值来确定您想要得到的3D点的光线的距离。 (注意,由于透视分割 ,归一化深度与距离线性不对应。)

如果您不知道您要寻找的点的深度,有两件事需要考虑……

  • 你真的在寻找特定像素“背后”的场景内容(几何)吗? 如果是这样,命中测试更有可能是您需要的。
  • 您想要从与其他点相关的非投影获得的3D点,是否可以导出Z值? 此处还有一些其他问答: 如何使用iOS(Swift)SceneKit SCNSceneRenderer unprojectPoint正确 , 如何使用SceneKit的unprojectPoint将2D点转换为3D而没有深度值?