Ios SceneKit-使用physicsWorld.updateCollisionPairs()进行即时接触检测

Ios SceneKit-使用physicsWorld.updateCollisionPairs()进行即时接触检测,ios,swift,collision-detection,scenekit,Ios,Swift,Collision Detection,Scenekit,我试图确定旋转节点的路径中是否存在可能的接触。我的想法是做一个递增的旋转(90度i循环10次9度),每次执行接触测试。我的问题是,即使每次调用updateCollisionPairs(),即使路径中有对象,联系人也是空的。这里有一张图片以某种方式说明了这一点(正面): 我试图将节点A旋转90度,但在我需要检查“路径是否清晰”之前-在这种情况下,节点B挡住了方向,因此我希望通过一个或多个增量旋转获得成功 节点A和节点B都是type.Kinetic,带有categoryBitMask 2 通常,在

我试图确定旋转节点的路径中是否存在可能的接触。我的想法是做一个递增的旋转(90度i循环10次9度),每次执行接触测试。我的问题是,即使每次调用updateCollisionPairs(),即使路径中有对象,联系人也是空的。这里有一张图片以某种方式说明了这一点(正面):

我试图将节点A旋转90度,但在我需要检查“路径是否清晰”之前-在这种情况下,节点B挡住了方向,因此我希望通过一个或多个增量旋转获得成功

节点A和节点B都是type.Kinetic,带有categoryBitMask 2

通常,在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 !!!!")
        }

    }

看起来我刚刚错误地放置了代码,如果将上面的代码放置在渲染器(:willRenderScene)中,则可以正常工作-我最初尝试直接在由GestureRecograiser触发的方法中执行它。相反,我现在只设置标志,并在渲染下一帧之前执行检查:

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

看起来我刚刚错误地放置了代码,如果将上面的代码放置在渲染器(:willRenderScene)中,则可以正常工作-我最初尝试直接在由GestureRecograiser触发的方法中执行它。相反,我现在只设置标志,并在渲染下一帧之前执行检查:

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