Обнаружение столкновений SceneKit не обнаруживается
Я не могу понять, почему мои столкновения не обнаруживаются. Я надеюсь, что вы можете понять, почему, потому что это вызывает у меня много проблем, и мне нужно научиться делать это правильно. Swift, SceneKit.
Хорошо, так как всегда я начинаю с этим утверждением:
override func viewDidLoad() {
super.viewDidLoad()
createScene()
scene.physicsWorld.contactDelegate = self
// This Statement.^
motionManager = CMMotionManager()
motionManager.startAccelerometerUpdates()
}
Я хочу, чтобы произошло столкновение между мячом и узлом коробки. Мой узел box - это mainBox, а мой шарик -... ball.
ball.position = SCNVector3Make(0, 1.75, 3)
ball.geometry = ballGeometry
ballMaterial.diffuse.contents = UIColor.greenColor()
ballGeometry.materials = [ballMaterial]
scene.rootNode.addChildNode(ball)
ball.physicsBody = SCNPhysicsBody(type: .Dynamic, shape: SCNPhysicsShape(geometry: ballGeometry, options: nil))
ball.physicsBody?.angularVelocityFactor = SCNVector3Make(0, 0, 0)
ball.physicsBody?.angularVelocity = SCNVector4Make(0, 0, 0, 0)
ball.name = "sphere"
ball.physicsBody?.categoryBitMask = bodyNames.Person
ball.physicsBody?.contactTestBitMask = bodyNames.Floor
ball.physicsBody?.collisionBitMask = bodyNames.Floor
ball.physicsBody?.affectedByGravity = true
ball.addChildNode(cameraNode)
mainBox.position = SCNVector3Make(0, -0.75, 2)
mainBox.geometry = mainBoxGeometry
mainBoxMaterial.diffuse.contents = UIColor.whiteColor()
mainBox.physicsBody?.categoryBitMask = bodyNames.Floor
mainBox.physicsBody?.contactTestBitMask = bodyNames.Person
mainBox.physicsBody?.collisionBitMask = bodyNames.Person
mainBox.physicsBody = SCNPhysicsBody.staticBody()
mainBoxGeometry.materials = [mainBoxMaterial]
mainBox.name = "floor"
scene.rootNode.addChildNode(mainBox)
И теперь, где происходит волшебство, но также и где волшебство не происходит...
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
let nodeA = contact.nodeA
let nodeB = contact.nodeB
if nodeA.physicsBody?.categoryBitMask == bodyNames.Person && nodeB.physicsBody?.categoryBitMask == bodyNames.Floor || nodeA.physicsBody?.categoryBitMask == bodyNames.Floor && nodeB.physicsBody?.categoryBitMask == bodyNames.Person {
print("I collided with the damn box.")
}
}
Ох, и вот откуда родом bodyNames.
struct bodyNames {
static let Person = 0x1 << 1
static let Floor = 0x1 << 2
}
Дайте мне знать, если мне нужно добавить больше кода, чтобы ответить, я был бы рад сделать это.
1 ответ
Ты проверил ли didBeginContact
посетил или нет?
если посетил, проверьте условие if
nodeA.physicsBody?.categoryBitMask == bodyNames.Person && nodeB.physicsBody?.categoryBitMask == bodyNames.Floor || nodeA.physicsBody?.categoryBitMask == bodyNames.Floor && nodeB.physicsBody?.categoryBitMask == bodyNames.Person
если не посещали вообще, нужно проверить, physicsBody
мира, коробка и шар конфиг правильно