ios-如何在ARKit中检测垂直平面?

如何实现垂直平面检测(即对于墙壁)?

let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
Jan F. asked 2020-02-13T07:07:49Z
7个解决方案
66 votes

编辑:自ARKit 1.5(iOS 11.3)起,现在支持。 只需使用.vertical。出于历史目的,我将上一篇文章保留在下面。


TL; DR

垂直平面检测还不是ARKit中的功能。 .vertical建议可以使用此功能,以后可能会添加。 如果它只是一个布尔值,则表明它是最终值。

确认书

我在WWDC17与苹果工程师的一次交谈证实了这种怀疑。

说明

您可能会争辩说,为此创建实现将很困难,因为垂直平面比水平平面有更多的方向,但是正如Rodamn所说,情况可能并非如此。

来自Rodamn的评论:简单地说,一个平面被定义为三个共面点。 一旦沿着曲面(垂直,水平或任意角度)检测到足够的共面特征,便有了曲面候选。 只是水平法线将沿着上/下轴,而垂直法线将平行于地平面。 面临的挑战是,未经修饰的石膏板往往几乎不会产生视觉特征,而平原墙经常可能无法被检测到。 我强烈怀疑这就是为什么.vertical功能尚未发布的原因。

但是,对此有相反的论点。 有关更多信息,请参见rickster的评论。

Zack answered 2020-02-13T07:08:44Z
6 votes

支持此功能的是iOS 11.3:

static var vertical: ARWorldTrackingConfiguration.PlaneDetection

该会话将检测与重力平行的表面(与其他方向无关)。

[https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection][https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection/2867271-vertical]

janpio answered 2020-02-13T07:09:17Z
5 votes

苹果已经发布了iOS 11.3,它将针对AR进行各种更新,包括ARKit 1.5。 在此更新中,ARKit包括ARKit能够识别虚拟对象并将其放置在墙壁和门等垂直表面上的功能。

ARWorldTrackingConfiguration现在支持垂直支持

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
shri answered 2020-02-13T07:09:43Z
2 votes

由于iPhone X配备了前置深度摄像头,因此我怀疑下一个版本将采用后置摄像头,并且在那时之前可能会授权.vertical

Mike M answered 2020-02-13T07:10:03Z
1 votes

我是用Unity做到的,但是我需要做数学。

我使用“随机样本共识”从ARkit返回的点云中检测垂直平面。 这就像有一个循环,随机选择3个点以创建一个平面并计算与之匹配的点,然后查看哪种尝试是最佳的。

工作正常 但是,因为当墙壁为纯色时,ARkit无法返回很多点。 因此,它在许多情况下都不起作用。

Sunny Chow answered 2020-02-13T07:10:33Z
0 votes

据说苹果正在为新iPhone开发额外的AR功能,即相机的额外传感器。 当这些设备功能已知时,这可能就是一项功能。 这里有些猜测。 [http://uk.businessinsider.com/apple-iphone-8-rumors-3d-laser-camera-augmented-reality-2017-7]和另一个来源[https://www.fastcompany.com/40440342/apple 是一个在iPhone 8后向3D激光工作的自动对焦源[]

Alex McPherson answered 2020-02-13T07:10:53Z
0 votes

在ARKit 1.0中,只有ARSceneManager枚举用于检测桌子或地板等水平表面。 在ARKit 1.5及更高版本中,符合OptionSet协议的PlaneDetection结构的类型属性为.horizontal.vertical

要在ARKit 2.0中实现垂直平面检测,请使用以下代码:

configuration.planeDetection = ARWorldTrackingConfiguration.PlaneDetection.vertical

或者,您可以对两种类型的平面使用检测:

private func configureSceneView(_ sceneView: ARSCNView) {

    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal, .vertical]    //BOTH TYPES
    configuration.isLightEstimationEnabled = true
    sceneView.session.run(configuration)
}

您也可以在ARSceneManager上添加一个扩展名以处理委托调用:

extension ARSceneManager: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { 
            return 
        }
        print("Found plane: \(planeAnchor)")
    }
}
ARGeo answered 2020-02-13T07:11:27Z
translate from https://stackoverflow.com:/questions/44422118/how-to-detect-vertical-planes-in-arkit