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

时间:2017-08-03 13:06:41

标签: scenekit ios11 xcode9-beta arkit

我想测量水平平面,以确定它是否适合我要放置的物体。对于前者如果我打算使用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的新手。我需要知道这是否可行,如果是,如何实现它。

1 个答案:

答案 0 :(得分:1)

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

ARKit有平面估计,而不是场景重建。也就是说,它会告诉你(某点)的平面,表面可能延伸至少 (距离那个点。它并不确切地知道表面有多大(它甚至会随着时间的推移改进其估计值),并且它不会告诉您连续表面中断的位置,更不用说这种中断的大小和形状。

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

如果您尝试限制用户可以根据平面估计在虚拟对象中放置虚拟对象的位置,那么您可能会因为两种错误而让他们感到沮丧:您可能会向用户提供他们可以放置的区域但不允许的东西,你会有一些区域,看起来应该是允许放置东西的禁区。

相反,设计您的体验以让用户参与决定内容的合理位置。例如,请参阅this demo - ARKit检测楼层的级别(不是其边界),然后使用它来显示UI,指示要放置的对象的大小/形状。这取决于用户确保有足够的空间放置沙发等等。

关于你可能不应做的技术方法:ARPlaneAnchor.extent的文档说该向量的x和z坐标是估计平面的宽度和长度。 ARKit中的所有单位都是米。 (哪个是宽度,哪个是长度?这是透视问题。而且是锚点transform中编码的旋转。)