ARKit浮动飞机

时间:2017-12-26 15:36:01

标签: ios swift arkit

有时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)
}

1 个答案:

答案 0 :(得分:3)

我认为你不能阻止ARKit生成重叠的平面,因为那部分几乎是一个黑盒子。但是,我想到了处理这种情况的两种可能性。

1)找到第一个平面后停止跟踪并向场景插入无限平面。您可以使用SCNFloor来实现此目的,或者只使用具有巨大范围的常规平面。当然,只有在场景中需要一个平面时才能使用它。

2)每隔一段时间(可能在委托方法renderer(_: SCNSceneRenderer, didUpdate: SCNNode, for: ARAnchor)renderer(_: SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor)内),通过在xz平面上投影这些平面,手动检查场景中的平面是否重叠,制作2D如果重叠部分高于某个阈值,则碰撞测试并移除其中任何一个。您还可以检查它们之间的距离是否低于阈值以确定这一点。