2017-11-25 1 views
0

ノードを回転させるパスに接触があるかどうかを調べようとしています。私の考えは、増分回転(90°iループ10回9度)を行い、毎回接触テストを行うことです。私の問題は、たとえ毎回updateCollisionPairs()が呼び出されても、パスにオブジェクトがある場合でも連絡先が空であることです。ここで(前向き)何とかそれを説明する画像です:SceneKit - physicsWorld.updateCollisionPairs()を使用したインスタント接触検出

私は90度でノードAを回転させるようにしようとしているが、私は「パスが明確である」かどうかを確認する必要がある前に - これでノードBが途中にあるので、1つ以上のインクリメンタルローテーションでヒットすることを期待しています。

ノードAとノードBはcategoryBitMask 2で、両方のタイプの.kinematicあるNormaly私が更新されphysicsWorldシミュレーション後のレンダリングループ(willRenderScene)における接触検査をしています、これは罰金トリガー、ので、私は知っている

私のphysicsBodies & contactBitmasksは正しく設定されていますが、この特定のケースでは明らかな理由で別のループが接触検出を実行するのを待つことができません。

コードは、私がこれまで試した:それはレンダラ内に置かれています場合、私はちょうどコード、上記のコードは正常に動作しmissplacedよう

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

が見える(:willRenderScene) - 私はで初期状態内で直接それを実行しようとしましたgestureRecogniserによってトリガされるメソッド。代わりに、今度はフラグを設定し、次のフレームがレンダリングされる前にチェックを実行するだけです:

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