Scenekit-未检测到碰撞

时间:2019-02-22 14:28:31

标签: swift scenekit

我创建了一个球,希望它与另一个球体碰撞。 但这不起作用。

enum ColliderType: Int {
   case ball    = 1
   case food    = 2
}

创建一个球和一个食物对象

 let ballNode: SCNNode!

 override func viewDidLoad() {

    .......

    let ball = SCNSphere(radius: 1.0)
    ball.materials.first?.diffuse.contents = UIColor.red
    ballNode = SCNNode(geometry: ball)
    ballNode.name = "ball"
    ballNode.position = SCNVecter3(10, 1, 10)
    ballNode.physicsBody = SCNPhysicsBody(type: .kinematic, shape: 
    SCNPhysicsShape(geometry: SCNSphere(radius: 1.0), options: nil))
    ballNode.physicsBody?.categoryBitMask = ColliderType.ball.rawValue
    ballNode.physicsBody?.contactTestBitMask =  ColliderType.food.rawValue
    ballNode.physicsBody?.collisionBitMask = ColliderType.food.rawValue
    scnScene.rootNode.addChildNode(ballNode)                                      


    let food = SCNSphere(radius: 0.5)
    food.materials.first?.diffuse.contents = UIColor.green
    let foodNode = SCNNode(geometry: food)
    foodNode.position = SCNVector3(0, 0.5, 0)
    foodNode.name = "food"
    foodNode.physicsBody = SCNPhysicsBody(type: .static, shape: 
    SCNPhysicsShape(geometry: SCNSphere(radius: 0.5), options: nil))
    foodNode.physicsBody?.categoryBitMask = ColliderType.food.rawValue
    foodNode.physicsBody?.collisionBitMask = ColliderType.ball.rawValue
    foodNode.physicsBody?.contactTestBitMask = ColliderType.ball.rawValue
    scnScene.rootNode.addChildNode(foodNode)

}

这是碰撞代码:

func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {

    var contactNode: SCNNode!

    if contact.nodeA.name == "ball" {
        contactNode = contact.nodeB
    } else {
        contactNode = contact.nodeA
    }

    if contactNode.physicsBody?.categoryBitMask == ColliderType.food.rawValue {
        print("aaaa")
    }

如果我使用场景编辑器创建food对象,则可以正常工作。 我不知道我的代码有什么问题。

1 个答案:

答案 0 :(得分:0)

您将contactTestBitMask用于一个节点,将collisionBitMask用于另一个节点。 SCNPhysicsContactcontactTestBitMask约束。

此外,我看不到physicsBody是否已分配给球节点。