Jul*_*avo 6 augmented-reality swift arkit realitykit reality-composer
我正在尝试使用 RealityKit 创建 AR 体验,但我发现默认情况下,实体在通过用户交互移动时会相互移动并重叠。
我想防止对象重叠并相互进入,这样当用户移动它们时,它们只是撞击/反弹而不会重叠。
我从 RealityComposer 文件中加载实体并将它们添加到场景中(在 catch 块中以及此简化版本中未显示的其他块中):
let entity = try Experience.loadBallSort()
anchorEntity.addChild(entity)
// anchorEntity is an AnchorEntity that is already attached to the scene
Run Code Online (Sandbox Code Playgroud)
我使用像这样的默认手势来启用用户交互,这就是导致对象重叠的方式,因为它们一旦触摸就不会停止:
arView.installGestures([.rotation, .translation], for: entity)
Run Code Online (Sandbox Code Playgroud)
在 Reality Composer 中,我启用了具有静态运动类型的物理功能,以及每个对象的默认物理材质/碰撞形状。我也尝试过generateCollisionShapes这样使用,但它不会改变碰撞的行为:
entity.generateCollisionShapes(recursive: true)
Run Code Online (Sandbox Code Playgroud)
如何防止 RealityKit 中的实体重叠?
为了实现这样的场景,我们需要 2 个对象 - 一个是dynamic\xe2\x80\x93 ,另一个是 \xe2\x80\x93 kinematic。
物理主体模式.dynamic
\n物理BodyMode.kinematic
\n代码:
\nvar arView = ARView(frame: .zero)\narView.frame = self.view.frame\nself.view.addSubview(arView)\n\nlet scene = try! Experience.loadModels()\n\n// Kinematic\nlet red = scene.redBox!.children[0] as! (Entity & \n HasCollision & \n HasPhysicsBody)\nred.physicsBody = .init()\nred.physicsBody?.massProperties.mass = 5\nred.physicsBody?.mode = .kinematic\nred.generateCollisionShapes(recursive: true)\narView.installGestures([.translation], for: red)\n\n// Dynamic \nlet green = scene.greenCube!.children[0] as! (Entity & \n HasCollision & \n HasPhysicsBody)\ngreen.physicsBody = .init()\ngreen.physicsBody?.massProperties.mass = 5\ngreen.physicsBody?.mode = .dynamic\ngreen.generateCollisionShapes(recursive: true)\nRun Code Online (Sandbox Code Playgroud)\n聚苯乙烯
\n不要在 Reality Composer 中应用物理,而是在 RealityKit 中以编程方式应用它。
\n