首页 文章

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

提问于
浏览
2

我想测量水平平面,以确定它是否适合我要放置的物体 . 对于前者如果我要使用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 回答

  • 1

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

    ARKit具有平面估计,而不是场景重建 . 也就是说,它在(某一点)处是平坦表面,并且表面 probably 从该点延伸 at least (一定距离) . 它甚至不会随着时间的推移改进其估计值,并且它不会告诉你连续表面中断的位置,更不用说这种中断的大小和形状 .

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

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

    相反,设计您的体验,让用户参与决定内容的合理位置 . 例如,请参阅this demo - ARKit检测楼层的高度(而不是其边界),然后使用它来显示UI,指示要放置的对象的大小/形状 . 它's up to the user to make sure there'足够的空间可用于沙发等 .


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

相关问题