我想测量水平面,以找出它是否适合我要放置的物体。例如,如果我打算使用 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-测量-应用-增强-现实-标尺-测量-磁带-ios(
我正在使用ARKit Scenekit来实现这一点,我是AR和Scenekit的新手。我需要知道这是否可行,如果是,如何实现它。
您可以通过检查其尺寸来估计检测到的平面的大小。但你不应该。
ARKit有平面估计,而不是场景重建。也就是说,它会告诉你在(某个点(有一个平坦的表面,并且该表面可能至少从该点延伸(一定距离(。它不知道表面到底有多大(它甚至随着时间的推移改进了它的估计(,它不会告诉你连续表面哪里有中断,更不用说这种中断的大小和形状了。
事实上,如果你看着地板并四处走动,你看到一块地板,然后是另一块地板,从第一块坚实的墙的另一侧,ARKit会很高兴地认识到这两个补丁是共面的,并将它们合并到同一个锚中。同时,两个检测到的补丁都无法覆盖其周围地板的整个范围。
如果你试图根据平面估计来限制用户可以在AR中放置虚拟对象的位置,你可能会用两种错误来挫败他们:在用户看来,它可以放置一些东西但不允许它的区域,并且你会有一些区域看起来应该是禁止放置东西的区域。
相反,设计您的体验,让用户参与决定内容的合理位置。例如,请参阅此演示 — ARKit 检测地板的水平(而不是其边界(,然后使用它来显示指示要放置的对象的大小/形状的 UI。由用户来确保有足够的空间容纳沙发等。
至于你可能不应该做什么的技术方法:ARPlaneAnchor.extent
的文档说该向量的x和z坐标是估计平面的宽度和长度。ARKit 中的所有单位都是米。(哪个是宽度,哪个是长度?这是一个视角问题。以及锚点transform
中编码的旋转。