0

在使用 的应用程序中ARKit,我使用ARSCNPlaneGeometryupdate方法SCNGeometryARPlaneGeometry. 我SCNPhysicsShape从该几何中获得 a 以用作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

我还在使用 的renderer(_:didUpdate:for:)方法不断更新几何和物理形状,ARSCNViewDelegate并且形状保持不变。

以前有人遇到过这个问题吗?

4

1 回答 1

0

好吧,似乎 SCNPhysicsShape 类从 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]))

获得了“近似”的形状,虽然不是很精确。

于 2019-01-19T00:49:53.560 回答