首页 > 解决方案 > 我试图给modelEntity一个physicsBodyComponet,它只是掉进了深处

问题描述

在现实工具包上,我尝试将物理体组件赋予模型实体。

但是当我把modelEntity放到现实世界中时,它就倒下了。

有没有什么办法解决这一问题?

标签: arkitrealitykit

解决方案


您需要使用以下内容创建地板网格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()
  })

最后,在我的项目中添加物理对我试图做的事情产生了太多意想不到的后果(只是防止模型重叠),比如模型相互推动,以及需要完全重做动作,......所以我没有不会比这更进一步,但至少这应该可以让您在模型中添加物理特性,而不会无限期地从重力下落。


推荐阅读