如何获取 ARKit 特征点的 UIKit 坐标?

How do you get the UIKit coordinates of an ARKit feature point?

我有一个 ARSCNView,我正在跟踪场景中的特征点。如何从特征点的 3D 世界坐标中获取特征点的 2D 坐标(如屏幕中该点的坐标)?

(与sceneView.hitTest本质上相反)

将点从 3D space(通常是相机或世界 space)转换为 2D 视图(像素)space 称为 投影那一点。 (因为它涉及一个projection transform,它定义了如何展平第三个维度。)

ARKit 和 SceneKit 都提供投影点的方法(和非投影点,反向变换需要额外输入如何推断第三维)。

由于您正在使用 ARSCNView,您可以只使用 projectPoint 方法。 (这是从超类 SCNView 继承并在 SCNSceneRenderer 协议中定义的,但仍然适用于 AR,因为 ARKit world space 与 SceneKit world/scene/rootNode space .) 请注意,对于该方法,您需要在 float3SCNVector3 之间来回转换。

还要注意返回的“2D”点仍然是一个 3D 向量——xy 坐标是屏幕像素(好吧,"points" 作为 UIKit 布局单元),第三个是相对深度值。只需从前两个坐标制作一个 CGPoint 即可用于其他 UIKit API.

顺便说一句,如果你在不使用 SceneKit 的情况下使用 ARKit,那么 ARCamera 上还有一个 projectPoint 方法。