2017-11-25 88 views
0

我試圖確定在旋轉節點的路徑中是否存在可能的接觸。我的想法是做一個遞增的旋轉(對於90度環10次9度)並且每次都進行接觸測試。我的問題是,即使我每次都調用updateCollisionPairs(),即使路徑中存在對象,聯繫人也是空的。下面是說明它在某種程度上圖片(面朝前):SceneKit - 使用physicsWorld.updateCollisionPairs()的即時接觸檢測

我想通過旋轉90度節點A,但在此之前我需要檢查「路徑是明確的」 - 在這個情況下節點B是這樣的,所以我期待着一個或多個增量旋轉命中。

節點A和節點B都類型.kinematic,與categoryBitMask 2

Normaly我做在physicsWorld模擬後呈現循環(willRenderScene)接觸測試被更新,並且這觸發細,所以我知道我的physicsBody & contactBitmasks設置正確,但在這種特定情況下,我不能等待另一個循環執行接觸檢測,原因很明顯。

代碼,我試過至今:

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

    } 

回答

0

看起來,如果它放在渲染器內像我剛纔missplaced的代碼,上面的代碼工作正常(:willRenderScene) - 我initialy試圖直接在執行它方法由gestureRecogniser觸發。相反,我現在只需設置標誌並在下一幀顯示前執行檢查:

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