2016-08-31 7 views
0

충돌이 감지되지 않는 이유를 알 수 없습니다. 이유가 무엇인지 파악할 수 있기를 바랍니다. 문제가 많아서 올바르게 수행하는 방법을 배워야하기 때문입니다. 신속한 장면 킷.SceneKit 충돌 감지가 감지되지 않습니다.

좋아, 그래서 항상 나는이 문장으로 시작으로 :

override func viewDidLoad() { 
    super.viewDidLoad() 


    createScene() 



    scene.physicsWorld.contactDelegate = self 

    // This Statement.^ 

    motionManager = CMMotionManager() 
    motionManager.startAccelerometerUpdates() 


} 

내가 충돌이 공 및 상자 노드 사이에 발생합니다. 내 상자 노드는 mainBox이고 내 공은 공입니다. bodyNames의 출처

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

    } 

} 

아, 그리고이 일이다.

struct bodyNames { 

static let Person = 0x1 << 1 
static let Floor = 0x1 << 2 

} 

응답해야 할 코드를 더 추가해야하는지 알려 주시면 기꺼이 알려 드리겠습니다.

+2

physicsBody 여부를 확인해야 mainBox' physicsBody를 사용하기 전에 physicsBody 자체를 설정하십시오. –

+0

매우 간단한 수정이지만 현재 제대로 작동합니다. 감사. @JamesP –

답변

0

didBeginContact이 (가) 방문했는지 여부를 확인 했습니까?

방문 할 때, 확인하는 경우 조건

nodeA.physicsBody?.categoryBitMask == bodyNames.Person && nodeB.physicsBody?.categoryBitMask == bodyNames.Floor || nodeA.physicsBody?.categoryBitMask == bodyNames.Floor && nodeB.physicsBody?.categoryBitMask == bodyNames.Person 

전혀 방문하지 않을 경우, u는 당신이 '의 모든 비트 마스크를 설정하는 세계, 상자와 제대로 볼 설정

+0

didBeginContact가 어떤 이유로 호출되지 않습니다. –

관련 문제