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

时间:2018-05-18 10:23:47

标签: ios swift arkit point-clouds

我是开发IOS应用程序的新手,我刚刚开始从Github构建一些示例Arkit应用程序。

我试过的一件事是来自这个链接:https://github.com/ttaulli/MeasureAR

这主要测量两点之间的距离。当我在我的iPhone中启动这个应用程序时,我可以看到点云(对象的3D点集合,我想测量它)。 我无法理解的是,为什么选择的两个测量点不是来自点云?

我还想知道以下事项:

1)针对arkit测量应用程序的点云的确切目的是什么?

2)点云密度是否取决于对象的颜色(应用程序基本上在实时摄像机上运行)。是否还有其他因素影响这一点云?

我也很高兴,如果有人可以提供任何其他样品Arkit测量应用程序,它要求用户从pointcloud中选择两个点。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

  

绘制叠加内容的选项,以帮助调试AR跟踪   一个SceneKit视图。

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

augmentedRealityView.debugOptions = ARSCNDebugOptions.showFeaturePoints 

因此,featurePoint被Apple定义为:

  

由ARKit自动识别为连续点的一部分   表面,但没有相应的锚。

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

正如您将看到featurePoints中的ARSCNView显示为黄点,并且通常由以下原因导致功能提取不良:

(a)光线不足,

(b)缺乏质感,

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

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

基本上featurePoints可以帮助您想象放置物体的适用性,例如featurePoints越多,环境中的纹理或特征就越多。

你并不需要真正看到它们,因为ARKit会使用这些内容,例如执行ARSCNHitTest

因此,featurePoints可以在此基础上与ARSCNHitTest一起使用,其中:{/ 1}:

在捕获的摄像机图像中搜索与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)

    }

你可以在技术上测量featurePoints之间的距离,但这实际上是没有意义的,因为它们在不断变化,测量应用程序的目的是测量两个或多个固定点之间的距离。

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

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

<强>更新

有一个ARPointCloud:

  

AR的世界坐标空间中的点集合   会话。

可以使用以下方式访问:

  

ARFrame rawFeaturePoints属性,用于获取表示的点云   ARKit用于执行世界的场景分析的中间结果   跟踪。

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

如果您很好奇并希望获得featurePoints,可以使用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