我有一个 ARSCNView,我正在跟踪场景中的特征点。如何从特征点的 3D 世界坐标中获取特征点的 2D 坐标(如屏幕中该点的坐标)?
(本质上与 sceneView.hitTest 相反)
最佳答案
将点从 3D 空间(通常是相机或世界空间)转换到 2D View (像素)空间称为该点投影。 (因为它涉及 projection transform 定义如何展平第三个维度。)
ARKit 和 SceneKit 都提供了投影点的方法(以及非投影点,即反向变换,需要额外的输入来推断第三维)。
由于您使用的是 ARSCNView
,因此您只需使用 projectPoint
方法。 (它继承自父类(super class) SCNView
并在 SCNSceneRenderer
协议(protocol)中定义,但仍然适用于 AR,因为 ARKit 世界空间与 SceneKit world/scene/rootNode 空间相同。)请注意,对于该方法,您需要在 float3
和 SCNVector3
之间来回转换。
另请注意,返回的“2D”点仍然是 3D 向量 - x
和 y
坐标是屏幕像素(好吧,“点”如 UIKit 布局单元中所示) ),第三个是相对深度值。只需从前两个坐标创建一个 CGPoint
即可与其他 UIKit API 一起使用。
顺便说一句,如果您在没有 SceneKit 的情况下使用 ARKit,还有一个 projectPoint
ARCamera
上的方法。
关于ios - 如何获取 ARKit 特征点的 UIKit 坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51330453/