2017-11-25 1 views
0

Ich versuche zu bestimmen, ob es einen möglichen Kontakt im Pfad der Rotation eines Knotens gibt. Meine Idee ist, eine inkrementierte Rotation (für 90 Grad i Schleife 10 mal 9 Grad) zu machen und jedesmal einen Kontakttest durchzuführen. Mein Problem ist, dass selbst wenn ich updateCollisionPairs() jedes Mal anrufe, die Kontakte leer sind, selbst wenn ein Objekt im Pfad ist. Hier ist ein Bild, das es irgendwie illustrieren (vorne raus):SceneKit - Sofortige Kontakt Erkennung mit physicsWorld.updateCollisionPairs()

Ich versuche Knoten A um 90 Grad zu drehen, aber bevor ich muß prüfen, ob der „Weg frei ist“ - in diesem Falls der Knoten B im Weg ist, erwarte ich einen Treffer mit einer oder mehreren der inkrementellen Rotationen.

Knoten A und B sind beide Typ .kinematic, mit categoryBitMask 2

Normaly ich tue Kontakttests in der Schleife machen (willRenderScene) nach dem Physics World Simulation aktualisiert wird, und dies löst fein, so weiß ich, meine physikKörper & contactBitmasks sind richtig eingestellt, aber in diesem speziellen Fall kann ich nicht aus anderen Gründen auf eine andere Schleife warten, um die Kontakterkennung durchzuführen.

-Code i bisher versucht:

for i in 1...10 { 
     nodeA.transform = SCNMatrix4Mult(nodeA.transform, SCNMatrix4MakeRotation(GameHelper.deg2rad(deg:90)/10, 0, 0, 1)) 
     nodeA.physicsBody.resetTransform() 
     self.scnScene.physicsWorld.updateCollisionPairs() 
     let contacts = self.scnScene.physicsWorld.contactTest(with: (nodeA.physicsBody)!, options: [SCNPhysicsWorld.TestOption.collisionBitMask:2]) 

     print(contacts) 
     if contacts.count > 0 { 
      print("CONTACT !!!!") 
     } 

    } 

Antwort

0

sieht aus wie ich missplaced nur den Code, der obige Code funktioniert gut, wenn es innerhalb des Renderers gesetzt wird (: willRenderScene) - Ich habe versucht, initialy es innerhalb der direkt ausführen Methode ausgelöst durch GestenRecogniser. Stattdessen setze ich jetzt die Flagge und führe die Prüfung aus, bevor das nächste Bild gerendert wird:

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) { 
    ... check for flag and perform contact test 
}