如何使用ARKit跟踪的水平和垂直平面将对象隐藏在墙后面/真实对象后面?当前,当您离开房间和/或在应该位于其后的对象之前时,可以通过墙壁看到添加了3D的对象。因此,是否有可能使用ARKit给我的数据提供更自然的AR体验,而不会使物体穿过墙出现?
您在这里有两个问题。
(而且您甚至都没有使用正则表达式!)
如果将SceneKit材质的colorBufferWriteMask值设置为空值([]在Swift中),则使用该材质的任何对象都不会出现在视图中,但是它们在渲染期间仍会写入z缓冲区,这会影响其他对象的渲染。实际上,您将获得一个形状类似于您的对象的“孔”,通过该孔可以显示背景(对于,ARSCNView则为照相机馈送),但仍然可以遮盖其他SceneKit对象。
colorBufferWriteMask
[]
ARSCNView
您还需要确保被遮挡的渲染在它应该遮盖的任何其他节点之前进行。您可以使用节点层次结构进行此操作(我不记得是父节点是先于子节点还是以其他方式进行渲染,但是测试起来很容易)。在层次结构中作为对等节点的节点没有确定的顺序,但是无论该renderingOrder属性的层次结构如何,您都可以强制执行该顺序。该属性默认为零,因此将其设置为-1将先于所有内容呈现。(或为了更好地控制,将renderingOrder多个节点的s 设置为一系列值。)
renderingOrder
在iOS 11.3和更高版本(也称为“ ARKit 1.5”)中,您可以打开vertical平面检测。(请注意,当您从那里获得vertical平面锚点时,它们会自动旋转。因此,如果将模型附加到锚点上,它们的本地“向上”方向将垂直于该平面。)iOS 11.3中的新增功能是,您可以不管其方向如何,每个检测到的平面的更详细的形状估计(请参阅ARSCNPlaneGeometry)。
vertical
但是,即使您具有水平和垂直方向,平面的外部界限也只是随时间变化的估计值。也就是说,ARKit可以快速检测出墙的一部分在哪里,但是如果用户不花一些时间挥动设备来绘制空间,它就不会知道墙的边缘在哪里。即使这样,映射的边缘也可能无法与真实墙的边缘精确对齐。
因此…如果您使用检测到的垂直平面来遮挡虚拟几何体,则可能会发现应该隐藏的虚拟对象通过透明的边缘隐藏的地方,或者通过某些地方可见的地方ARKit尚未绘制整个真实墙的位置。(您可以通过假设范围比ARKit大得多来解决后一个问题。)