有时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)
}
最佳答案
我认为您不能阻止ARKit生成重叠平面,因为该部分几乎是一个黑匣子。但是,我想到了两种可能性来处理这种情况。
1)找到第一个平面后停止跟踪,然后将无限平面插入场景。为此,您可以使用 SCNFloor
,也可以使用范围广泛的常规飞机。当然,这仅在场景中需要一架飞机时才可用。
2)偶尔(可能在委托方法renderer(_: SCNSceneRenderer, didUpdate: SCNNode, for: ARAnchor)
或renderer(_: SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor)
中)通过将这些平面投影到xz平面上来手动检查场景中的平面是否重叠,进行2D碰撞测试,如果重叠则删除其中任何一个部分高于某个阈值。您也可以检查3D中它们之间的距离是否小于阈值来确定。
关于ios - ARKit float 飞机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47980670/