SceneKit unproject Z 文档解释?

zum*_*zum 3 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

陈述?

ric*_*ter 7

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

但这并不完全是 3D 到 2D 的转换。在渲染过程中找出哪些对象离相机更近或更远很重要(因此它们可以正确地相互遮挡),因此透视投影还输出归一化的深度分量,其中较低的值表示离相机更近的点(反之亦然) )。(值被标准化,因为此时需要的只是相对深度。和/或由于传统 3D 图形数学历史和 GPU 设计的原因。)这些信息在渲染过程中被使用,但在之后被有效地丢弃——你看到的只是 2D 视图.

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

因此,要将 2D 点取消投影到 3D 场景空间中,您需要 2D 点本身定义进入 3D 场景的光线,然后使用归一化的深度值来决定您希望生成的 3D 点沿着光线的距离。(请注意,由于透视划分,归一化深度与距离不线性对应。)

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