如何在放置物体之前使用 ARKit-Scenekit 测量水平面(在相机中可见)?

How to measure horizontal plane surface(visible in camera) using ARKit-Scenekit before placing objects?

我想测量水平面是否适合我要放置的物体。对于前。如果我要使用 iOS 11 ARKit 在房间内放置婴儿床 3D 模型(固定尺寸),

首先我想通过测量表面积(宽度和高度等)来检测房间表面是否足以放置我的 3D 模型

其次,如果用户试图在没有足够空间的情况下放置它,我不应该允许他放置婴儿床并向他显示错误消息。

我按照 https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip 创建了一个示例 POC,使用它我能够检测水平面并放置婴儿床。但问题是无论表面如何,用户都可以实时放置不应被允许的婴儿床。

我看到几个演示,其中他们说我们可以测量房间或水平面的大小(https://www.curbed.com/2017/6/29/15894556/ar-measure-app-augmented-reality-ruler-measuring-tape-ios)

我正在使用 ARKit Scenekit 来实现这一点,我是 AR 和 Scenekit 的新手。我需要知道这是否可行,如果可行,如何实现。

可以通过检查其尺寸来估计检测到的平面的大小。但你不应该。

ARKit 有平面估计,没有场景重建。也就是说,它会告诉您在 (某点) 处有一个平面,并且该表面 可能 至少延伸 (距离) 从那个点。它不知道表面到底有多大(它甚至会随着时间的推移改进其估计),并且它不会告诉您在该连续表面中哪里存在中断,更不用说此类中断的大小和形状了。

事实上,如果你看着地板并四处走动,你看到了一块地板,然后又看到了第一块实心墙另一侧的另一块地板,ARKit 会很高兴地认识到这一点这两个补丁是共面的,并将它们合并到同一个锚点中。同时,检测到的补丁都不能覆盖它周围的整个地板范围。

如果您尝试根据平面估计限制用户在 AR 中放置虚拟对象的位置,您可能会因两种错误而使他们受挫:您将拥有用户看起来像他们的区域可以放置东西但不允许放置东西,并且您将拥有看起来应该禁止放置东西的区域。

相反,设计您的体验让用户参与决定内容的合理位置。参见 this demo 示例 — ARKit 检测到地板的 level(不是它的边界),然后使用它来显示 UI 指示 size/shape要放置的对象。由用户确定是否有足够的空间放置沙发等。


至于关于您可能不应该做的事情的技术指导:ARPlaneAnchor.extent 的文档说该向量的 x 和 z 坐标是估计的平面。 ARKit 中的所有单位都是米。 (哪个是宽度,哪个是长度?这是一个视角问题。以及锚点 transform 中编码的旋转问题。)