如何实现垂直平面检测(即墙壁)?
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
答案 0 :(得分:66)
编辑:现在支持ARKit 1.5(iOS 11.3)。只需使用.vertical
即可。出于历史目的,我将上一篇文章保留在下面。
垂直平面检测不是(现在)ARKit中存在的特征。 .horizontal
表示此功能可能正在处理中,并可能在将来添加。如果它只是一个布尔值,这表明它是最终的。
我在WWDC17与Apple工程师的一次对话证实了这种怀疑。
你可能会争辩说为这个创建一个实现会很困难,因为对于垂直平面而不是水平平面有更多的方向,但正如 rodamn 所说,这可能不是这种情况
来自 rodamn的评论:
最简单的是,一个平面被定义为三个共面点。一旦沿表面检测到足够的检测到的共面特征(垂直,水平或任意角度),就有一个表面候选者。只是水平线的法线将沿着上/下轴,而垂直法线将平行于地平面。挑战在于,朴素的干墙往往产生很少的视觉特征,而平坦的墙壁往往不会被发现。我强烈怀疑这就是.vertical
功能尚未发布的原因。
然而,这个有一个反驳论据。有关详情,请参阅 rickster 的评论。
答案 1 :(得分: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
答案 2 :(得分:5)
Apple已发布iOS 11.3将针对AR提供各种更新,包括ARKit 1.5。在此更新中,ARKit包含ARKit识别虚拟对象并将其放置在墙壁和门等垂直表面上的功能。
现在ARWorldTrackingConfiguration
支持垂直支持let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
答案 3 :(得分:2)
由于iPhone X采用了前置式深度摄像头,我怀疑是朝后的版本将出现在下一版本中,并且可能会授权.vertical
功能。
答案 4 :(得分:1)
我用Unity做过,但我需要做数学。
我使用Random Sample Consensus从ARkit返回的点云中检测垂直平面。这就像有一个循环随机选取3个点来创建一个平面并计算与之匹配的点,并看看哪个尝试是最好的。
它在工作。但是因为当墙壁是纯色时,ARkit不能返回许多点。所以它在很多情况下都不起作用。
答案 5 :(得分:0)
答案 6 :(得分:0)
在ARKit 1.0中,只有
.horizontal
枚举用于检测桌子或地板等水平表面。在 ARKit 1.5和更高版本中,符合.horizontal
的{{1}} 结构的.vertical
和PlaneDetection
类型属性协议。
要在ARKit 2.0中实现垂直平面检测,请使用以下代码:
OptionSet
或者您可以对两种类型的平面使用检测:
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