ARKit平面检测

时间:2017-08-07 11:06:15

标签: xcode9-beta arkit swift4

我正在尝试使用Demo ARKit应用程序中的苹果提供的代码进行平面检测,但它不能始终如一地工作,因为在某些情况下它会完美地检测到表面,但在某些情况下,它不会检测到平面。然后,我也注意到在Demo ARKit app中,平面检测也会发生同样的事情。 当它检测到平面时,黄色方块会关闭,但每次都不是这样。有没有人面对同样的?如何使这种平面检测行为保持一致?

3 个答案:

答案 0 :(得分:10)

平面检测很大程度上取决于现实世界的条件。你需要良好的照明,一个具有相当数量的可见细节的表面,以及相当数量的清晰平坦空间。例如,普通白色桌子或黑色桌布使平面检测更慢/更不可靠。带有可见颗粒的木桌工作得更好,但如果它被键盘和鼠标以及电缆和设备混乱(不是说我们当中任何人都会有这样的桌子,当然......)。

平面检测也涉及运动和视差三角测量。如果您将设备指向一个良好的表面(如上所述),但只是通过旋转设备(例如,通过在转椅中旋转)改变您对该表面的视角,您就不会为ARKit提供更多有用的信息比如果你只是静止不动另一方面,如果您将设备左右移动或上下移动至少几英寸,它在表面上的视角将获得一些视差,这将加速/改善平面检测。

更新:如果您正在开发依赖于平面检测的应用,则有助于提示用户执行这些动作。他们在WWDC17的实验室中展示的第三方演示有一些很棒的特定于应用程序的方法:Lego有一个小小的迷你游戏,引导玩具直升机进入着陆, The Walking Dead 告诉玩家在地板上寻找僵尸足迹;等

答案 1 :(得分:0)

在房间里添加更多光线。 ArKit在光线充足的房间里工作得更好。 您不会影响平面检测。等待官方iOS 11发布。

答案 2 :(得分:0)

class ViewController: UIViewController {
    @IBOutlet var sceneView: ARSCNView!
    let configuration = ARWorldTrackingConfiguration()

    override func viewDidLoad() {
     self.sceneView.debugOptions = [SCNDebugOptions.showFeaturePoints, SCNDebugOptions.showWorldOrigin]
     self.configuration.planeDetection = .horizontal
     self.sceneView.session.run(configuration)
     self.sceneView.delegate = self
     super.viewDidLoad()
    }
}
//MARK: - ARSEN delegate -
  extension ViewController: ARSCNViewDelegate {
      func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeDetection = anchor as? ARPlaneAnchor else {
        return
    }
    print("Plane anchor detect")
}

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
    guard let planeDetecttion = anchor as? ARPlaneAnchor else {
        return
    }
}

func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) {
    guard anchor is ARPlaneAnchor else{
        return
    }
 }
}