在 RealityKit 中对 USDZ 模型应用物理学

Applying Physics on USDZ model in RealityKit

我正在尝试从 USDZ 文件加载实体,然后将物理应用于其 ModelEntity

我使用的是 Apple 图库中的 toy_robot_vintage 模型。它包含一个我想使用的动画,因此我正在加载 Entity。我想通了,我不能向 Entity 添加物理,因为它不符合 HasPhysicsBody,所以我得到 vintage_robot_animRig_model_body 并在其上应用 PhysicsBodyComponent。但是,它不起作用。我应该将物理学应用于哪个 ModelEntity 以及如何将物理学应用于层次结构中的不同 ModelEntity 应该反映在我的模型上?

我也尝试添加一个符合协议的自定义Entity子类,但是在我创建一个对象后,我没有看到它符合它。

这是我目前拥有的:

let modelEntity = robotEntity.findEntity(named: "vintage_robot_animRig_model_body")
let physics = PhysicsBodyComponent(massProperties: .default, material: .default, mode: .dynamic)   
modelEntity?.components.set(physics)

使用generateCollisionShapes()实例方法激活物理和运行碰撞检测:

func makeUIView(context: Context) -> ARView {
    
    let arView = ARView(frame: .zero)
    
    let robot = try! Entity.loadAnchor(named: "robot")
    robot.scale = [0.03, 0.03, 0.03]
    let headEntity = robot.findEntity(named: "vintage_robot_animRig_model_head")
    
    robot.generateCollisionShapes(recursive: true)
    
    let physics = PhysicsBodyComponent(massProperties: .default, 
                                             material: .default, 
                                                 mode: .dynamic)
    headEntity?.components.set(physics)
    arView.scene.anchors.append(robot)
    
    return arView
}