ARKit浮动飞机

有时ARKit会在现有的平面上创build平面。 它不合并它们。 我正在封闭空间testingiPhone 7的ARKit 。 放在那架飞机上的物体似乎在空间中漂浮。 这种情况不会经常发生,我无法一直重现。 有人能告诉我如何防止重叠和浮动飞机出现? 或者如何将3D物体放置在底部平面上?

这里是绘制飞机的代码。

 func createPlaneNode(center: vector_float3, extent: vector_float3) -> SCNNode { let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z)) let planeMaterial = SCNMaterial() planeMaterial.diffuse.contents = UIColor.blue.withAlphaComponent(0.4) plane.materials = [planeMaterial] let planeNode = SCNNode(geometry: plane) planeNode.position = SCNVector3Make(center.x, 0, center.z) planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0) return planeNode } func createPlaneNode(center: vector_float3, extent: vector_float3) -> SCNNode { let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z)) let planeMaterial = SCNMaterial() planeMaterial.diffuse.contents = UIColor.blue.withAlphaComponent(0.4) plane.materials = [planeMaterial] let planeNode = SCNNode(geometry: plane) planeNode.position = SCNVector3Make(center.x, 0, center.z) planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0) return planeNode } func updatePlaneNode(_ node: SCNNode, center: vector_float3, extent: vector_float3) { let geometry = node.geometry as! SCNPlane geometry.width = CGFloat(extent.x) geometry.height = CGFloat(extent.z) node.position = SCNVector3Make(center.x, 0, center.z) } 

我不认为你可以防止ARKit产生重叠的飞机,因为那部分几乎是一个黑匣子。 但是,我觉得有两种可能性来处理这种情况。

1)find第一架飞机后停止跟踪,并将无限的飞机插入到您的场景中。 你也许可以使用一个SCNFloor来达到这个目的,或者只是一个有很大范围的普通飞机。 当然,只有在场景中需要一架飞机时才能使用。

2)每隔一段时间(也许在委托方法renderer(_: SCNSceneRenderer, didUpdate: SCNNode, for: ARAnchor)renderer(_: SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor) ),手动检查您的飞机通过将这些平面投影到xz平面上来重叠场景,进行2D碰撞testing,并且如果重叠部分高于某个阈值,则去除其中的一个。 您也可以检查它们之间的3D距离是否低于阈值来确定这一点。