SceneKit collisionBitMask的行为不符合预期

时间:2015-01-12 16:36:51

标签: swift ios8 scenekit

SCNPhysicsBody的SceneKit的collisionBitMask属性的文档声明如下:

  

当两个物理实体相互接触时,可能会发生碰撞。   SceneKit将身体的碰撞面罩与其他身体的碰撞面罩进行比较   通过执行按位AND运算来进行类别掩码。如果结果是   一个非零值,然后身体受到碰撞的影响。 每个人   独立选择是否想要受到另一方的影响   体。

最后一行表示如果我有两个物体,我可以将它设置为当它们发生碰撞时,只有其中一个应该受到碰撞的影响。

let CollisionCategoryPlane = 1 << 0
let CollisionCategorySphere1 = 1 << 1
let CollisionCategorySphere2 = 1 << 2

let plane = SCNNode(geometry: SCNPlane(width: 10, height: 10))
plane.position = SCNVector3(x: 0, y: -10, z: 0)
plane.eulerAngles = SCNVector3(x: Float(-M_PI/2), y: 0, z: 0)
plane.physicsBody = SCNPhysicsBody.staticBody()
plane.physicsBody?.categoryBitMask = CollisionCategoryPlane
plane.physicsBody?.collisionBitMask = CollisionCategorySphere1 | CollisionCategorySphere2 
// the plane should be affected by collisions with both spheres (but the plane is static so it doesn't matter)
scene.rootNode.addChildNode(plane)

let sphere1 = SCNNode(geometry: SCNSphere(radius: 1))
sphere1.physicsBody = SCNPhysicsBody.dynamicBody()
sphere1.physicsBody?.categoryBitMask = CollisionCategorySphere1
sphere1.physicsBody?.collisionBitMask = CollisionCategoryPlane 
// sphere1 should only be affected by collisions with the plane, not with sphere2
scene.rootNode.addChildNode(sphere1)

let sphere2 = SCNNode(geometry: SCNSphere(radius: 1))
sphere2.position = SCNVector3(x: 1, y: 10, z: 0)
sphere2.physicsBody = SCNPhysicsBody.dynamicBody()
sphere2.physicsBody?.categoryBitMask = CollisionCategorySphere2
sphere2.physicsBody?.collisionBitMask = CollisionCategoryPlane | CollisionCategorySphere1 
// sphere2 should be affected by collisions with the plane and sphere1
scene.rootNode.addChildNode(sphere2)

Sphere1应该落在平面上,然后sphere2应该落在sphere1上并反弹,而sphere1应该不受与sphere2碰撞的影响。然而,观察到的行为是球体落在平面上并彼此静止 - 两个球体之间没有碰撞事件。

这里发生了什么?


在相关说明中,当我对上述代码进行一些小修改时,会发现一些更奇怪的行为。

如果删除定义平面collsionBitMask的行,将其保留为默认SCNPhysicsCollisionCategoryAll,则sphere1不再与平面发生碰撞。

如果我将定义对象物理实体,categoryBitMasks和collisionBiMasks的线移动到将对象添加到场景之后,则所有对象将与每个其他对象发生碰撞。即使我将每个collisionBitMask设置为零。

0 个答案:

没有答案