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