Reasons for CollisionEvent not firing in RealityKit scene?

Viewed 113

Event subscription has been added to a sceneof an ARView in RealityKit:

arView.scene.subscribe(to: CollisionEvents.Began.self) { event in
    print("Some collision occured")
}

Entities are visually colliding in the scene but the CollisionEvent is not being fired. Here are 2 example hierarchies of objects which are clearly colliding:

▿ 'backboard' : __RKPhysics, children: 1
...⟐ PhysicsMotionComponent
...⟐ Transform
...⟐ CollisionComponent
...⟐ SynchronizationComponent
...⟐ PhysicsBodyComponent
...▿ 'simpBld_root' : ModelEntity
......⟐ Transform
......⟐ ModelComponent
......⟐ SynchronizationComponent

With CollisionComponent:

CollisionComponent(shapes: [RealityKit.ShapeResource], mode: RealityKit.CollisionComponent.Mode.default, filter: RealityKit.CollisionFilter(group: RealityKit.CollisionGroup(rawValue: 1), mask: RealityKit.CollisionGroup(rawValue: 1)))

▿ 'ball' : ModelEntity ...⟐ Transform
...⟐ CollisionComponent
...⟐ ModelComponent
...⟐ SynchronizationComponent
...⟐ PhysicsBodyComponent

With CollisionComponent:

CollisionComponent(shapes: [RealityKit.ShapeResource], mode: RealityKit.CollisionComponent.Mode.default, filter: RealityKit.CollisionFilter(group: RealityKit.CollisionGroup(rawValue: 1), mask: RealityKit.CollisionGroup(rawValue: 4294967295)))

Named Entitieshave been added to the seen as part of an AnchorEntity:

let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(backboardEntity)
anchorEntity.addChild(ballEntity)
arView.scene.anchors.append(anchorEntity)

Why are no CollisionEvents not fired?

1 Answers

This code is self-explanatory:

import RealityKit
import Combine

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    var subscriptions: [Cancellable] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()            
        let modelOne = ModelEntity(mesh: .generateSphere(radius: 0.04)) 
                               as (Entity & HasCollision & HasPhysicsBody)
        let modelTwo = ModelEntity(mesh: .generateSphere(radius: 0.04)) 
                               as (Entity & HasCollision & HasPhysicsBody)
        
        modelOne.position.y = 0.75
        modelOne.physicsBody = .init()
        modelOne.physicsBody?.mode = .dynamic
        modelOne.generateCollisionShapes(recursive: false)            
        modelTwo.physicsBody = .init()
        modelTwo.physicsBody?.mode = .static
        modelTwo.generateCollisionShapes(recursive: false)
        
        let sub = arView.scene.subscribe(to: CollisionEvents.Began.self, 
                                on: modelOne) { _ in print("OCCURED!") }
        subscriptions.append(sub)
        
        let anchor = AnchorEntity()
        anchor.addChild(modelOne)
        anchor.addChild(modelTwo)
        arView.scene.anchors.append(anchor)
    }
}
Related