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

Ios 如何在ARKit中检测垂直平面?,ios,swift,ios11,arkit,ios12,Ios,Swift,Ios11,Arkit,Ios12,如何实现垂直面检测(即针对墙壁) 编辑:现在从ARKit 1.5(iOS 11.3)开始支持该功能。只需使用.vertical。出于历史原因,我保留了下面的前一篇文章 TL;博士 垂直面检测还不是ARKit中存在的特征。.horizontal表明此功能可能正在开发中,将来可能会添加。如果它只是一个布尔值,这将表明它是最终的 确认书 我在WWDC17与一位苹果工程师的对话证实了这一怀疑 解释 您可能会争辩说,为这一点创建一个实现是困难的,因为垂直平面的方向比水平平面的方向多得多,但正如rodam

如何实现垂直面检测(即针对墙壁)


编辑:现在从ARKit 1.5(iOS 11.3)开始支持该功能。只需使用
.vertical
。出于历史原因,我保留了下面的前一篇文章


TL;博士 垂直面检测还不是ARKit中存在的特征。
.horizontal
表明此功能可能正在开发中,将来可能会添加。如果它只是一个布尔值,这将表明它是最终的

确认书 我在WWDC17与一位苹果工程师的对话证实了这一怀疑

解释 您可能会争辩说,为这一点创建一个实现是困难的,因为垂直平面的方向比水平平面的方向多得多,但正如rodamn所说,情况可能并非如此

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


然而,有一个相反的论点。有关更多信息,请参见rickster的评论。

据说苹果正在为新iPhone开发额外的AR功能,即摄像头的额外传感器。当这些设备功能已知时,这可能会成为一项功能。这里有一些猜测。另一个来源

由于iPhoneX配备了一个前向深度摄像头,我怀疑下一个版本中会有一个后向深度摄像头,也许垂直功能将被授予,直到那时。

我是用Unity完成的,但我需要计算一下

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


它起作用了。但是因为当墙是素色时,它不能返回很多点。因此,它在很多情况下都不起作用。

iOS 11.3提供了对此的支持:

静态变量垂直:ARWorldTrackingConfiguration.PlaneDetection

该任务检测平行于重力的曲面(无论其他方向如何)


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

ARWorldTrackingConfiguration现在支持垂直

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
在ARKit 1.0中,只有
.horizontal
enum用于检测水平表面,如桌子或地板。在ARKit 1.5及更高版本中,存在符合
OptiStart
协议的
平面检测
结构的
水平
垂直
类型属性

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

嘿@Zack,那个工程师有没有告诉你什么时候可以添加这个功能?希望他们不会拖延到iOS 12。不@T.Steele,我没有得到任何暗示,但我不认为他们会拖延那么久。毕竟,它似乎很难实现。我想你的意思是“看起来不会那么难”,但你写的可能更接近正确。水平面只能有一个可能的方向,但平面“垂直”的方式有无限多个……是的,这就是我的意思,尽管我确实明白你现在说的,@rickster。这并不难。在最简单的情况下,平面定义为三个共面点。一旦沿曲面(垂直、水平或任意角度)检测到足够多的共面特征,就有了候选曲面。只是水平面的法线将沿着上/下轴,而垂直面的法线将平行于地平面。挑战在于,未经修饰的干墙往往产生很少的视觉特征,而普通墙往往无法被发现。我强烈怀疑这就是为什么垂直特征还没有被释放。传感器最终被用于前摄相机,并且有太多的限制(1米范围,IR被洗席可以在阳光下冲掉),这对AR. Will来说是有用的。苹果确实宣布iPhone8和iPhoneX都将拥有A11仿生芯片。据说这对于AR应用程序来说非常强大和有用,所以并没有绝对的进展。
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)")
    }
}