如何实现垂直平面检测(对于墙壁,i.e.)?
let configuration = ARWorldTrackingSessionConfiguration() configuration.planeDetection = .horizontal //TODO
据说苹果正在为新的 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
**编辑:**从 ARKit 1.5(iOS 11.3)开始支持该功能。只需使用.vertical即可。我出于历史目的保留了以前的帖子。
.vertical
垂直平面检测还不是 ARKit 中的功能。 .horizontal表示该功能可能正在开发中,将来可能会添加。如果它只是一个布尔值,则表明它是最终值。
.horizontal
我在 WWDC17 与苹果工程师的对话证实了这种怀疑。
您可能会争辩说,为此创建一个实现将很困难,因为垂直平面比水平平面有更多的方向,但是正如该死的所说,事实可能并非如此。
摘自罗丹的评论:最简单地说,一个平面被定义为三个共面点。一旦沿着曲面(垂直,水平或任意角度)检测到足够的共面特征,便有了曲面候选。只是水平法线将沿着 up/down 轴,而垂直法线将平行于地平面。面临的挑战是,未经装饰的石膏板往往几乎不会产生视觉特征,而平原墙经常可能无法被发现。我强烈怀疑这就是.vertical功能尚未发布的原因。
但是,对此有相反的论点。有关更多信息,请参见rickster的评论。
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
苹果已经发布了 iOS 11.3,其中将包含 ARKit 1.5 等 AR 的各种更新。在此更新中,ARKit 包括 ARKit 能够识别虚拟对象并将其放置在墙壁和门等垂直表面上的功能。
ARWorldTrackingConfiguration 现在支持垂直支持
let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal, .vertical] sceneView.session.run(configuration)
由于 iPhone X 具有前置深度摄像头,我怀疑下一个版本将采用后置摄像头,并且在此之前可能委派.vertical功能。
我是用 Unity 做到的,但是我需要做数学。
我使用随机样本共识从 ARkit 返回的点云中检测垂直平面。这就像有一个循环,随机选择 3 个点以创建一个平面并计算与之匹配的点,然后看看哪种尝试是最佳的。
工作正常但是,因为当墙壁为纯色时,ARkit 无法返回很多点。因此,它在许多情况下都不起作用。
在 ARKit 1.0 中,只有.horizontal枚举的情况用于检测桌子或地板等水平表面.在ARKit 1.5 及更高版本**中,PlaneDetection结构的.horizontal和.vertical类型属性符合OptionSet协议。
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来处理委托调用:
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)") } }
7 回答
据说苹果正在为新的 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
**编辑:**从 ARKit 1.5(iOS 11.3)开始支持该功能。只需使用
.vertical
即可。我出于历史目的保留了以前的帖子。TL; DR
垂直平面检测还不是 ARKit 中的功能。
.horizontal
表示该功能可能正在开发中,将来可能会添加。如果它只是一个布尔值,则表明它是最终值。确认书
我在 WWDC17 与苹果工程师的对话证实了这种怀疑。
说明
您可能会争辩说,为此创建一个实现将很困难,因为垂直平面比水平平面有更多的方向,但是正如该死的所说,事实可能并非如此。
摘自罗丹的评论:最简单地说,一个平面被定义为三个共面点。一旦沿着曲面(垂直,水平或任意角度)检测到足够的共面特征,便有了曲面候选。只是水平法线将沿着 up/down 轴,而垂直法线将平行于地平面。面临的挑战是,未经装饰的石膏板往往几乎不会产生视觉特征,而平原墙经常可能无法被发现。我强烈怀疑这就是
.vertical
功能尚未发布的原因。但是,对此有相反的论点。有关更多信息,请参见rickster的评论。
iOS 11.3 对此提供了支持:
会话将检测与重力平行的表面(与其他方向无关)。
https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection/2867271-vertical
苹果已经发布了 iOS 11.3,其中将包含 ARKit 1.5 等 AR 的各种更新。在此更新中,ARKit 包括 ARKit 能够识别虚拟对象并将其放置在墙壁和门等垂直表面上的功能。
ARWorldTrackingConfiguration 现在支持垂直支持
由于 iPhone X 具有前置深度摄像头,我怀疑下一个版本将采用后置摄像头,并且在此之前可能委派
.vertical
功能。我是用 Unity 做到的,但是我需要做数学。
我使用随机样本共识从 ARkit 返回的点云中检测垂直平面。这就像有一个循环,随机选择 3 个点以创建一个平面并计算与之匹配的点,然后看看哪种尝试是最佳的。
工作正常但是,因为当墙壁为纯色时,ARkit 无法返回很多点。因此,它在许多情况下都不起作用。
要在 ARKit 2.0 中实现“垂直平面检测”,请使用以下代码:
或者,您可以对两种类型的平面使用检测:
您也可以将扩展名添加到
ARSceneManager
来处理委托调用: