有时ARKit
会在现有的平面上创建平面。它不合并它们。我正在封闭空间中使用iPhone 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)
}
答案 0 :(得分:3)
我认为你不能阻止ARKit生成重叠的平面,因为那部分几乎是一个黑盒子。但是,我想到了处理这种情况的两种可能性。
1)找到第一个平面后停止跟踪并向场景插入无限平面。您可以使用SCNFloor
来实现此目的,或者只使用具有巨大范围的常规平面。当然,只有在场景中需要一个平面时才能使用它。
2)每隔一段时间(可能在委托方法renderer(_: SCNSceneRenderer, didUpdate: SCNNode, for: ARAnchor)
或renderer(_: SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor)
内),通过在xz平面上投影这些平面,手动检查场景中的平面是否重叠,制作2D如果重叠部分高于某个阈值,则碰撞测试并移除其中任何一个。您还可以检查它们之间的距离是否低于阈值以确定这一点。