使用 ARSCNPlaneGeometry 获得 SCNPhysicsShape 产生球体形状而不是平面

Using an ARSCNPlaneGeometry to obtain a SCNPhysicsShape produces a sphere shape and not a plane

在使用 ARKit 的应用程序中,我使用 ARSCNPlaneGeometry class update 方法从 ARPlaneGeometry 获取 SCNGeometry .我从该几何体中获得一个 SCNPhysicsShape 用作平面节点的 SCNPhysicsBody

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

    // Plane Geometry
    let planeGeometry = ARSCNPlaneGeometry(device: MTLCreateSystemDefaultDevice()!)
    planeGeometry?.update(from: planeAnchor.geometry)
    let planeNode = SCNNode(geometry: planeGeometry)

    // Plane Physics
    planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: planeGeometry!))

    // Add Node to Scene
    node.addChildNode(planeNode)
}

我遇到的问题是,即使显示的平面节点是平面,但生成的物理形状不是平面,而是粗糙的球体。我知道这一点是因为我正在使用场景视图调试选项 .showPhysicsShapes.

我也在使用 ARSCNViewDelegaterenderer(_:didUpdate:for:) 方法不断更新几何和物理形状,形状保持不变。

其他人运行以前遇到过这个问题吗?

好吧,似乎 SCNPhysicsShape class 从 ARSCNPlaneGeometry 计算出的形状抽象是完全不对的,除非你用一个选项帮助它一点点。如果不是:

planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: planeGeometry!))

您使用:

planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: planeGeometry!, options: [SCNPhysicsShape.Option.type: SCNPhysicsShape.ShapeType.boundingBox]))

"approximate",虽然不是很准确,但得到了形状。