首页 文章

ARKit 浮动飞机

提问于
浏览
1

有时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 回答

  • 3

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

    1. 找到第一个平面后停止跟踪,然后将无限平面插入场景。为此,您可以使用地板,也可以使用范围广泛的常规飞机。当然,这仅在场景中需要单个平面时才可用。

    2. 每隔一段时间(可能在委托方法renderer(_: SCNSceneRenderer, didUpdate: SCNNode, for: ARAnchor)renderer(_: SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor)内),通过将场景中的平面投影到 xz-plane 上来手动检查场景中的平面是否重叠,进行 2D 碰撞测试,如果重叠部分大于 3D,请移除其中一个平面一定的门槛。您也可以检查 3D 中它们之间的距离是否小于阈值来确定。

相关问题