在使用ARKit
的应用程序中,我使用ARSCNPlaneGeometry
类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
。
我也在使用ARSCNViewDelegate
的renderer(_:didUpdate:for:)
方法不断更新几何和物理形状,并且形状保持不变。
以前有人遇到过这个问题吗?
好吧,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]))
得到了"近似"的形状,虽然不是很精确。