Swift中如何为SceneKit的SCNNode设置全位collisionBitMask
如何将SCNNode的collisionBitMask设置为全位启用的默认值
问题背景
要把SCNNode的collisionBitMask设为官方默认的全位启用值,却遇到类型转换的精度问题:
collisionBitMask是Int类型,而官方提供的全量碰撞掩码SCNPhysicsCollisionCategory.all的rawValue为UInt类型- 直接将
UInt转Int会触发精度丢失错误
研究过程
- 官方文档明确:
collisionBitMask默认值为all,表示该物理体将与所有其他类别的物理体发生碰撞 SCNPhysicsCollisionCategory.all的定义:
static var all: SCNPhysicsCollisionCategory { get }
- 尝试直接转换赋值的代码:
toyUI.physicsBody?.collisionBitMask = Int(SCNPhysicsCollisionCategory.all.rawValue)
触发错误:
Swift/Integers.swift:3687: Fatal error: Not enough bits to represent the passed value
解决方案
直接给collisionBitMask赋值-1即可实现全位启用效果:
toyUI.physicsBody?.collisionBitMask = -1
原因:在二进制补码规则下,-1的所有位均为1,与SCNPhysicsCollisionCategory.all的全位掩码效果完全一致,且无需类型转换,避免了精度丢失问题。
内容的提问来源于stack exchange,提问作者OMGPOP
相关产品推荐
相关产品推荐

