我正在经历一些 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)的点未投影到近(或远)剪裁平面上。
当我在网上阅读时,我发现了这个问题:
如何正确使用iOS (Swift) SceneKit SCNSceneRenderer unprojectPoint https://stackoverflow.com/questions/25150737/how-to-use-ios-swift-scenekit-scnscenerenderer-unprojectpoint-properly
当我处理 SceneKit 视图时,Z = 0 总是近平面,Z = 1 总是远平面吗?如果是这样,为什么?而且,Z = 0 和 Z = 1 只是标准化值吗?
那么,有人可以帮助我理解为什么在这种情况下 Z 使用值 0 和 1 吗?最终帮助我理解:
z 分量为 0(或 1)的点未投影到近(或远)剪裁平面上。
陈述?
透视投影 https://en.wikipedia.org/wiki/3D_projection是将用于场景建模的 3D 空间中的点转换为渲染场景的视图的 2D 像素空间的任务。GPU 在渲染过程中每帧都会执行数千次此操作。
但这并不完全是 3D 到 2D 的转换。在渲染过程中,区分哪些对象离相机较近或较远(以便它们正确地相互遮挡)非常重要,因此透视投影还输出归一化的深度分量,其中较低的值表示离相机较近的点(反之亦然) )。 (值被标准化,因为此时需要的只是相对深度。和/或出于传统 3D 图形数学历史和 GPU 设计的原因。)此信息在渲染过程中使用,但随后被有效丢弃 - 您看到的只是 2D 视图。
“取消投影”一个点正在做相反的事情:给定 2D 屏幕空间中的一个点,您需要 3D 场景空间中的一个点。但屏幕空间中的 2D 点对应于 3D 空间中的一条线:视图中的每个像素都沿着光线进入 3D 场景,而您在该像素中看到的内容来自光线相交的第一个 3D 对象。
因此,要将 2D 点取消投影到 3D 场景空间中,您需要 2D 点本身将光线定义到 3D 场景中,然后使用标准化深度值来决定您希望生成的 3D 点沿光线的距离。 (请注意,归一化深度并不与距离线性对应,因为透视划分 https://en.wikipedia.org/wiki/Perspective_divide.)
如果您不知道要寻找的点的深度,则需要考虑两件事......
- 您实际上是在寻找特定像素“背后”的场景内容(几何图形)吗?如果是这样,您更有可能需要命中测试。
- 您想要从反投影中获得的 3D 点是否与另一个点相关,以便您能够导出 Z 值?这里还有一些其他的问答:如何正确使用iOS (Swift) SceneKit SCNSceneRenderer unprojectPoint https://stackoverflow.com/a/25154025/957768, 如何使用 SceneKit 的 unprojectPoint 在没有深度值的情况下将 2D 点转换为 3D? https://stackoverflow.com/a/24375188/957768
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)