无法解释 Arkit 测量 IOS 应用程序中的点云行为

Unable to interpret pointcloud behaviour in Arkit measuring IOS Applications

我是开发 IOS 应用程序的新手,我刚刚开始从 Github.

构建一些示例 Arkit 应用程序

一件事,我试过的是这个 link : https://github.com/ttaulli/MeasureAR

这基本上是测量两点之间的距离。当我在 IPhone 中启动此应用程序时,我可以看到点云(我想要测量的对象周围 3D 点的集合)。 想不通的是,为什么选的两个测量点不是点云的?

我还想知道以下内容:

1) 用于 arkit 测量应用的点云的确切目的是什么?

2)点云密度是否取决于物体的颜色(应用基本上运行在实时相机上)。是否有任何其他因素影响此点云?

我也很高兴,如果有人能提供任何其他示例 Arkit 测量应用程序,要求用户从点云中选择两个点。

提前致谢!

您所指的 pointCloud 实际上是 ARSCNDebugOptions 的一部分,它们是:

Options for drawing overlay content to aid debugging of AR tracking in a SceneKit view.

你可以这样设置:ARSCNDebugOptions.showFeaturePoints例如:

augmentedRealityView.debugOptions = ARSCNDebugOptions.showFeaturePoints 

A featurePoint 因此被 Apple 定义为:

A point automatically identified by ARKit as part of a continuous surface, but without a corresponding anchor.

这意味着ARKit 处理每个视频帧以提取环境特征,并且当您四处移动时,会检测到更多特征,因此设备可以更好地估计方向和位置等属性实物。

如您所见featurePointsARSCNView中显示为黄点,特征提取不佳通常由以下原因引起:

(a) 光线不足,

(b) 缺乏质感,

(c) 用户设备移动不稳定。

需要认识到的一件非常重要的事情是,featurePoints 不一致,因为它们是从会话的每一帧渲染的,因此经常随着光照条件、运动等而变化。

基本上 featurePoints 可以帮助您直观地了解放置物体的适合性,例如特征点越多,环境中的纹理或特征就越多。

你真的不需要看到它们本身,因为 ARKit 在后台使用它们,比如执行 ARSCNHitTest.

因此,在此基础上,featurePoints 可以与 ARSCNHitTest 结合使用,其中:

在捕获的相机图像中搜索与 SceneKit 视图中的某个点对应的真实世界对象或 AR 锚点。

此 hitTest 的结果可以让您放置虚拟内容,例如:

/// Performs An ARHitTest So We Can Place An SCNNode
    ///
    /// - Parameter gesture: UITapGestureRecognizer
    @objc func placeVideoNode(_ gesture: UITapGestureRecognizer){

        //1. Get The Current Location Of The Tap
        let currentTouchLocation = gesture.location(in: self.augmentedRealityView)

        //2. Perform An ARHitTest To Search For Any Feature Points
        guard  let hitTest = self.augmentedRealityView.hitTest(currentTouchLocation, types: .featurePoint ).first else { return }

        //3. If We Have Hit A Feature Point Get Its World Transform
        let hitTestTransform = hitTest.worldTransform.columns.3

        //4. Convert To SCNVector3
        let coordinatesToPlaceModel = SCNVector3(hitTestTransform.x, hitTestTransform.y, hitTestTransform.z)

        //5. Create An SCNNode & Add It At The Position Retrieved
        let sphereNode = SCNNode()
        let sphereGeometry = SCNSphere(radius: 0.1)
        sphereGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
        sphereNode.geometry = sphereGeometry
        sphereNode.position = coordinatesToPlaceModel

        self.augmentedRealityView.scene.rootNode.addChildNode(sphereNode)

    }

从技术上讲,您可以测量特征点之间的距离,但这实际上毫无意义,因为它们不断变化,而测量应用程序的目的是测量两个或多个固定点之间的距离。

网上有无数关于 ARKit 以及如何制作测量应用程序的教程。

希望这有助于您更好地理解。

更新:

有一个 ARPointCloud 是:

A collection of points in the world coordinate space of the AR session.

并且可以使用以下方式访问:

ARFrame rawFeaturePoints property to obtain a point cloud representing intermediate results of the scene analysis ARKit uses to perform world tracking.

但是,正如您所问,这基本上就是您在设置 debugOptions 时看到的内容。

如果你好奇并想获得特征点,你可以使用 ARSession 的 currentFrame 来实现,例如:

 func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

  //1. Check Our Frame Is Valid & That We Have Received Our Raw Feature Points
  guard let currentFrame = self.augmentedRealitySession.currentFrame,
     let featurePointsArray = currentFrame.rawFeaturePoints?.points else { return }

 }

可以在这里看到一个例子:Visualizing Raw Feature Points