SceneKit unproject Z文档说明?

时间:2017-10-20 16:59:17

标签: ios scenekit

我正在浏览一些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)剪裁平面上未被投影。

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

How to use iOS (Swift) SceneKit SCNSceneRenderer unprojectPoint properly

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

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

  

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

语句?

1 个答案:

答案 0 :(得分:4)

Perspective projection的任务是将用于建模场景的3D空间中的点转换为渲染场景的视图的2D像素空间。这是GPU做了数千次的事情渲染期间每帧。

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

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

因此,要将2D点投影到3D场景空间中,您需要2D点本身将光线定义到3D场景中,然后使用标准化深度值来确定您希望生成的3D点在光线上的距离。 (注意,由于perspective division,归一化深度与距离线性对应。)

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