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

时间:2018-07-13 17:51:28

标签: ios swift scenekit arkit

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

(基本上是sceneView.hitTest的反面)

1 个答案:

答案 0 :(得分:3)

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

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

由于您正在使用ARSCNView,因此只能使用projectPoint方法。 (这是从超类SCNView继承并在SCNSceneRenderer协议中定义的,但仍然适用于AR,因为ARKit世界空间与SceneKit世界/场景/ rootNode空间相同。)注意,您需要为此方法在float3SCNVector3之间来回转换。

还要注意,返回的“ 2D”点仍然是3D矢量-xy坐标是屏幕像素(好吧,是UIKit布局单位中的“点”),第三个是相对深度值。只需从前两个坐标中生成一个CGPoint,即可与其他UIKit API配合使用。

顺便说一句,如果您使用的是不带SceneKit的ARKit,则ARCamera上还有一个projectPoint方法。