在现实世界中,我曾试着给modelEntity一个physicsBodyComponent。
但是当我把modelEntity放到现实世界中时,它就掉下来了。
有什么办法可以解决这个问题吗?
你需要用一个 PhysicsBodyComponent
:
let floor = ModelEntity(mesh: .generateBox(size: [1000, 0, 1000]), materials: [SimpleMaterial()])
floor.generateCollisionShapes(recursive: true)
if let collisionComponent = floor.components[CollisionComponent] as? CollisionComponent {
floor.components[PhysicsBodyComponent] = PhysicsBodyComponent(shapes: collisionComponent.shapes, mass: 0, material: nil, mode: .static)
floor.components[ModelComponent] = nil // make the floor invisible
}
scene?.addChild(floor)
然后,当你加载你的实体时,你也给他们一个 PhysicsBodyComponent
(他们需要一个非零的 mass
否则他们无论如何都会失败,这也是我很久以来无法理解的)。)
var loadModelCancellable: AnyCancellable? = nil
loadModelCancellable = Entity.loadModelAsync(named: modelUri)
.sink(receiveCompletion: { _ in
loadModelCancellable?.cancel()
}, receiveValue: { entity in
entity.generateCollisionShapes(recursive: true)
if let collisionComponent = entity.components[CollisionComponent] as? CollisionComponent {
entity.components[PhysicsBodyComponent] = PhysicsBodyComponent(shapes: collisionComponent.shapes, mass: 1, material: nil, mode: .dynamic)
}
scene.addChild(entity)
loadModelCancellable?.cancel()
})
最后,在我的项目中添加物理学对于我想做的事情(只是防止模型重叠)有太多意想不到的后果,比如模型互相推挤,动作需要完全重做,......。所以我没能更进一步,但至少这应该能让你为你的模型添加物理,而不会因为重力而无限期地掉下去。