【问题标题】:Scenekit - collision not being detectedScenekit - 未检测到碰撞
【发布时间】:2019-07-16 16:13:23
【问题描述】:

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

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")
    }

如果我使用场景编辑器创建食物对象,它就可以工作。 我不知道我的代码有什么问题。

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

    您将 contactTestBitMask 用于一个节点,collisionBitMask 用于另一个节点。 SCNPhysicsContactcontactTestBitMask 管理。

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

    【讨论】:

    • 我修改了代码,还是不行。如果我创建食物对象使用场景编辑器,它就可以工作。我不知道有什么不同。
    • 最好贴出场景及其节点的完整代码。否则不清楚错误可能出在哪里。
    猜你喜欢
    • 2017-01-07
    • 2018-02-15
    • 1970-01-01
    • 2023-04-09
    • 2021-02-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多