首页 文章

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

提问于
浏览
49

如何实现垂直平面检测(对于墙壁,i.e.)?

let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO

7 回答

  • 0

    据说苹果正在为新的 iPhone i.e 相机的额外传感器开发额外的 AR 功能。当这些设备功能已知时,这可能就是一项功能。这里有些猜测。 http://uk.businessinsider.com/apple-iphone-8-rumors-3d-laser-camera-augmented-reality-2017-7和另一个来源https://www.fastcompany.com/40440342/apple-is-working-hard-on-an-iphone-8-rear-facing-3d-laser-for-ar-and-autofocus-source

  • 66

    **编辑:**从 ARKit 1.5(iOS 11.3)开始支持该功能。只需使用.vertical即可。我出于历史目的保留了以前的帖子。


    TL; DR

    垂直平面检测还不是 ARKit 中的功能。 .horizontal表示该功能可能正在开发中,将来可能会添加。如果它只是一个布尔值,则表明它是最终值。

    确认书

    我在 WWDC17 与苹果工程师的对话证实了这种怀疑。

    说明

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

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

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

  • 6

    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

  • 5

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

    ARWorldTrackingConfiguration 现在支持垂直支持

    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal, .vertical]
    sceneView.session.run(configuration)
    
  • 2

    由于 iPhone X 具有前置深度摄像头,我怀疑下一个版本将采用后置摄像头,并且在此之前可能委派.vertical功能。

  • 1

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

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

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

  • 0

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

    要在 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)")
        }
    }
    

相关问题