这个问题值得一个完整的教程。总之,每个物理体都有一个categoryBitMask和collisionBitMask。
categoryBitMask
这是代表主体的位。
collisionBitMask
这是表示哪些物体与其发生碰撞的位。
默认情况下(当分配一个物理体时)所有的物体都会发生碰撞,除了运动学体,它的作用是特殊的。物体不会与它发生碰撞。但不要混淆,手动移动(例如用手指拖动)时,它可能会与其他对象发生碰撞。
怎么处理!!!
分配你的身体,无论是静态的还是动态的。在那里分配类别和碰撞掩码。如果面罩匹配,它们就会发生碰撞。举个例子怎么样!
这些物体相互碰撞
bodyA.physicsBody.categoryBitMask = 4;
bodyB.physicsBody.categoryBitMask = 8;
bodyA.physicsBody.collisionBitMask = 8;
bodyB.physicsBody.collisionBitMask = 4;
这些不会碰撞
bodyA.physicsBody.categoryBitMask = 4;
bodyB.physicsBody.categoryBitMask = 8;
bodyA.physicsBody.collisionBitMask = 0;
bodyB.physicsBody.collisionBitMask = 0;
注意到我使用了二次幂的类别。这是因为contactDelegate 使用按位AND 进行比较。如果您不明白,请按位阅读。这真的会有所帮助。
这些物体在没有物理的情况下碰撞
例子:你有一个英雄穿过一个鬼魂,你想知道它是在没有任何一个被影响的情况下发生的。比如互相反弹。
bodyA.physicsBody.categoryBitMask = 4;
bodyB.physicsBody.categoryBitMask = 8;
bodyA.physicsBody.collisionBitMask = 0;
bodyB.physicsBody.collisionBitMask = 0;
所以下面的代码被设计成bodyA(你的英雄)贯穿bodyB(ghost)。
bodyB.physicsField.categoryBitMask = 4
注意到上面是一个physicsField.catagoryBitMask。它被分配了一个 4,以便它与 bodyA 匹配。
let collisionField = SCNPhysicsField.customFieldWithEvaluationBlock(){
(_, _, _, _, _) in
WHAT U WANT TO DO ON CONTACT
}
bodyB.physicsField = collisionField
不幸的是,physicsField 不是您的几何形状。如果将physicsField属性usesEllipsoidalExtent设置为“true/yes”,它的默认值是其边界框或球体/椭圆的形状
可以使用physicsFields halfExtent 属性更改效果区域,如下所示...
bodyB.physicsField.halfExtent = SCNVector3Make(.5, .5, .5)
以上将把 (2, 2, 2) 大小的框的字段扩展到 (2.5, 2.5, 2.5)。
编辑:如果它们仍然碰撞,请尝试从 bodyB 中删除物理体(这将从节点中删除所有物理模拟)。只要正确分配了类别和碰撞位掩码,我认为这不会成为问题。
这是我能找到的最好的方法。在 Apple 文档的支持下,所有编码都出自我的脑海,因此可能并不完全正确,但我希望这会有所帮助!