Вам нужно создать этаж меня sh с 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
(и им нужен не -zero 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()
})
В конце концов, добавление физики в мой проект имело слишком много непредвиденных последствий для того, что я пытался сделать (просто предотвращая перекрытие моделей), например, модели, толкающие друг друга, и движения, которые нужно было полностью переделать, ... Так что я не пошел дальше этого, но, по крайней мере, это должно позволить вам добавить физику в свой модели без их неограниченного падения под действием силы тяжести.