ARKit隐藏墙后的物体

Ste*_*eve 27 augmented-reality ios scenekit swift arkit

如何使用ARKit跟踪的水平和垂直平面隐藏墙后/真实物体后面的物体?目前,当你离开房间和/或它们应该在后面的物体前面时,可以通过墙看到3D添加的物体.那么有可能使用ARKit让我提供更自然的AR体验而不会通过墙壁出现这些对象吗?

ric*_*ter 28

你有两个问题.

(你甚至没有使用正则表达式!)

如何为ARKit/SceneKit创建遮挡几何?

如果将SceneKit材质设置为colorBufferWriteMask空值([]在Swift中),则使用该材质的任何对象都不会出现在视图中,但它们仍会在渲染过程中写入z缓冲区,这会影响其他对象的渲染.实际上,你会得到一个形状像你的物体的"洞",背景显示(相机输入,在这种情况下ARSCNView),但仍然可以遮挡其他SceneKit对象.

您还需要确保在其应该隐藏的任何其他节点之前进行遮挡渲染.你可以使用节点层次结构来做到这一点(我无法记得父节点是否在他们的子节点之前呈现或反过来,但它很容易测试).作为层次结构中对等方的节点没有确定性顺序,但您可以强制执行顺序,而不管renderingOrder属性的层次结构如何.该属性默认为零,因此将其设置为-1将在所有内容之前呈现.(或者为了更精细的控制,将renderingOrder多个节点的s 设置为一系列值.)

如何检测墙/等,以便知道遮挡几何的位置?

在iOS 11.3及更高版本(又名"ARKit 1.5")中,您可以打开vertical平面检测.(请注意,当你从那里得到vertical平面锚点时,它们会自动旋转.所以如果你将模型附加到锚点,它们的局部"向上"方向与飞机垂直.)在iOS 11.3中也是新的,你可以得到一个每个检测到的平面的更详细的形状估计(参见ARSCNPlaneGeometry),无论其方向如何.

但是,即使您具有水平和垂直,平面的外部界限也只是随时间变化的估计值.也就是说,ARKit可以快速检测墙壁的哪个部分,但是如果没有用户花费一些时间挥动设备来绘制空间,它就不知道墙壁的边缘.即使这样,映射的边缘也可能与真实墙壁的边缘不精确对齐.

因此......如果您使用检测到的垂直平面遮挡虚拟几何体,您可能会发现应该隐藏的虚拟对象显示的位置,或者通过不是完全隐藏在墙的边缘,或者通过位置可见其中ARKit没有映射整个真实墙.(后一个问题你可以通过假设比ARKit更大的范围来解决.)