【发布时间】:2018-07-14 03:13:24
【问题描述】:
我有一个 ARSCNView,我正在跟踪场景中的特征点。如何从特征点的 3D 世界坐标中获取特征点的 2D 坐标(如屏幕中该点的坐标)?
(本质上与sceneView.hitTest相反)
【问题讨论】:
我有一个 ARSCNView,我正在跟踪场景中的特征点。如何从特征点的 3D 世界坐标中获取特征点的 2D 坐标(如屏幕中该点的坐标)?
(本质上与sceneView.hitTest相反)
【问题讨论】:
将一个点从 3D 空间(通常是相机或世界空间)转换为 2D 视图(像素)空间称为投影该点。 (因为它涉及到一个projection transform,它定义了如何展平第三维。)
ARKit 和 SceneKit 都提供了投影点的方法(以及非投影点,即需要额外输入来推断第三维的反向变换)。
由于您使用的是ARSCNView,因此您可以只使用projectPoint 方法。 (这继承自超类SCNView 并在SCNSceneRenderer 协议中定义,但仍然适用于AR,因为ARKit 世界空间与SceneKit 世界/场景/根节点空间相同。)请注意,您需要来回转换该方法在float3 和SCNVector3 之间。
还要注意返回的“2D”点仍然是一个 3D 向量——x 和 y 坐标是屏幕像素(嗯,在 UIKit 布局单元中是“点”),第三个是相对深度值.只需从前两个坐标中创建一个CGPoint,即可用于其他 UIKit API。
顺便说一句,如果您在没有 SceneKit 的情况下使用 ARKit,那么在 ARCamera 上还有一个 projectPoint 方法。
【讨论】: