我正在浏览一些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)剪裁平面上未被投影。
语句?
答案 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,归一化深度与距离线性对应。)
如果你不知道你所寻找的点的深度,有两件事需要考虑......