50

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

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

7 回答 7

66

编辑:现在支持 ARKit 1.5 (iOS 11.3)。只需使用.vertical. 出于历史目的,我将之前的帖子保留在下面。


TL;博士

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

确认

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

解释

您可能会争辩说,为此创建一个实现会很困难,因为垂直平面而不是水平平面有无限多的方向,但正如rodamn所说,情况可能并非如此。

来自rodamn 的评论: 在最简单的情况下,一个平面被定义为三个共面点。一旦沿表面(垂直、水平或任意角度)检测到足够多的共面特征,您就有了一个表面候选。只是水平线的法线将沿着上/下轴,而垂直线的法线将平行于地平面。挑战在于,朴素的干墙往往会产生很少的视觉特征,而普通的墙壁可能经常不会被发现。我强烈怀疑这就是该.vertical功能尚未发布的原因。

然而,对此有一个反驳的论点。有关更多信息,请参阅rickster的评论。

于 2017-06-07T22:59:24.367 回答
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

于 2018-01-25T11:24:21.573 回答
5

Apple 已发布 iOS 11.3 将包含各种 AR 更新,包括 ARKit 1.5。在本次更新中,ARKit 包括让 ARKit 识别并将虚拟对象放置在垂直表面(如墙壁和门)上的能力。

现在在 ARWorldTrackingConfiguration 中支持垂直

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
于 2018-02-05T16:24:26.267 回答
2

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

于 2017-09-20T14:45:22.710 回答
1

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

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

它正在工作。但是因为当墙壁是纯色时,ARkit 不能返回很多点。所以它在很多情况下都不起作用。

于 2018-01-17T09:32:41.863 回答
1

在 ARKit 1.0 中,只有.horizontal enum用于检测水平表面,如桌子或地板。在ARKit 1.5 及更高版本.horizontal结构.vertical的类型属性符合协议PlaneDetection 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)")
    }
}
于 2018-08-24T22:55:31.620 回答
0

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

于 2017-07-19T08:19:42.723 回答