2017-10-20 33 views
1

我正在经历一些SceneKit概念,并且我试图巩固在我的脑海中的是unprojectPoint。SceneKit unproject Z文档说明?

我知道这个函数在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 

什么我不是太清楚是值0和当谈到绕Z轴采用1 ....

一其z分量为0(或1)的点在近(相对于远)剪辑平面上未被投影。

当我在网上阅读周围我随后发现这样一个问题:

How to use iOS (Swift) SceneKit SCNSceneRenderer unprojectPoint properly

当我对付SceneKit看来,Z = 0总是近平面和Z = 1的远飞机吗?如果是这样,为什么?而且,Z = 0和Z = 1只是标准化值?

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

其z分量为0(或1)的点在近(相对于远)剪辑平面上未投影。

声明?

回答

1

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

但它并不完全是3D到2D的转换。在渲染过程中,重要的是找出哪些物体离摄像机更近或更远(因此它们会相互混淆),因此透视投影也会输出归一化的深度分量,其中较低的值表示靠近摄像机的点(反之亦然)。 (数值被归一化,因为在这一点上所有需要的都是相对深度和/或由于传统3D图形数学历史和GPU设计的原因)。这些信息在渲染过程中被使用,但随后被有效丢弃 - 所有您看到的都是2D视图。

“Unprojecting”点正在做相反的事情:给定2D屏幕空间中的点,您需要3D场景空间中的点。但屏幕空间中的2D点对应于3D空间中的一条线:视图中的每个像素都沿着一条光线进入3D场景,您看到的像素来自与光线相交的第一个3D对象。因此,要将二维点投影到三维场景空间中,需要二维点本身将光线定义到三维场景中,然后使用归一化深度值来决定沿着您想要得到的三维点的光线多远是。 (请注意,由于perspective division,标准化深度不会线性对应于距离。)

如果您不知道要查找的点的深度,有两点需要考虑......

+0

人,在这里一些好东西来消化。谢谢。因此,以简单的术语,我可以说Z = 0,是近平面的归一化Z值,Z = 1是远平面的Z值(由于您概述的相对深度概念)。正确? – zumzum