【问题标题】:ARKit Plane detectionARKit 平面检测
【发布时间】:2017-08-07 11:06:15
【问题描述】:
我正在尝试使用 Apple 在 Demo ARKit 应用程序中提供的代码进行平面检测,但它无法始终如一地工作,在某些情况下它可以完美地检测到表面,但在某些情况下,它不会检测到平面。然后,我还注意到在 Demo ARKit 应用程序中,平面检测也会发生同样的事情。
当它检测到平面时,黄色方块会关闭,但并非每次都如此。有没有人遇到过同样的情况?如何让这个平面检测行为一致?
【问题讨论】:
标签:
xcode9-beta
arkit
swift4
【解决方案1】:
平面检测很大程度上取决于现实世界的条件。您需要良好的照明、具有大量可见细节的表面以及大量清晰的平面空间。例如,纯白色的桌子或黑色的桌布会使平面检测更慢/更不可靠。带有可见纹理的木桌效果要好得多,但如果上面堆满了键盘、鼠标、电缆和设备(当然,我们谁也不会有这样的桌子......)。
平面检测也涉及运动和视差三角测量。如果您将设备指向一个好的表面(如上所述),但仅通过旋转设备(例如,通过在转椅上旋转)来改变您在该表面上的视角,那么您提供的 ARKit 信息不会比如果你只是保持不动。另一方面,如果您将设备左右或上下移动至少几英寸,它在表面上的透视将获得一些视差,这将加速/改进平面检测。
更新:如果您正在开发依赖平面检测的应用程序,它有助于提示用户执行这些动作。他们在 WWDC17 的实验室中展示的第三方演示有一些很棒的特定于应用程序的方法来做到这一点:乐高有一个小游戏,可以引导一架玩具直升机着陆,行尸走肉告诉玩家在地板上搜索僵尸脚印;等等
【解决方案2】:
在房间里增加更多的光线。 ArKit 在光线充足的房间里效果更好。
您不能影响平面检测。等待 iOS 11 正式发布。
【解决方案3】:
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
}
}
}