因此,在我的 RealityKit 场景中,我有一个在点击时打开的安全实体,以及位于保险箱内的关键实体。两个实体的碰撞形状都是通过
generateCollisionShapes(recursive: true)
生成的。
我点击打开保险箱后,它的碰撞盒仍然覆盖了其中一把钥匙,阻止后者接收
gesture
事件。
我想知道是否有一种方法可以“优先考虑”关键实体的碰撞,以便即使其碰撞盒被另一个实体的碰撞盒阻挡,它也会响应交互?
我尝试更改加载实体和创建碰撞形状的顺序,但事情保持不变。
在适用于 iOS、visionOS 和 macOS 的 RealityKit 中,开发人员使用 CollisionGroup 和 CollisionFilter 的组合来防止特定模型与不需要的对象发生碰撞。 CollisionGroups 不直接分配给实体,因此 CollisionFilters 定义实体的碰撞属性。定义每个碰撞组的值时,请使用 按位移位 (
<<
)。
let group01 = CollisionGroup(rawValue: 1 << 0) // 2^0 = 1
let group02 = CollisionGroup(rawValue: 1 << 1) // 2^1 = 2
let group03 = CollisionGroup(rawValue: 1 << 2) // 2^2 = 4
Swift 的 按位运算符 应该应用于位移位,以便为每个组创建唯一的索引,其中每个后续索引都比前两个索引的总和大 1。 碰撞位掩码在SceneKit中也广泛使用。
let wizardMask = CollisionGroup.all.subtracting(group01)
let specialFilter = CollisionFilter(group: group01, mask: wizardMask)
myModel.collision?.filter = specialFilter
如果由于某种原因第一个解决方案不适合您,请使用第二个解决方案。为此,创建一个自定义碰撞形状,它根本不会允许发生不需要的碰撞。