有时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/

10-11 06:53