SceneKit - 使用physicsWorld.updateCollisionPairs()进行即时联系检测

时间:2017-11-25 13:15:59

标签: ios swift collision-detection scenekit

我正在尝试确定旋转节点的路径中是否存在可能的联系。我的想法是进行增量旋转(对于90度i循环10次9度)并且每次都进行接触测试。我的问题是,即使我每次调用updateCollisionPairs(),即使路径中有对象,联系人也是空的。这是一张以某种方式(前向)说明它的图片:

我尝试将节点A旋转90度,但在我需要检查"路径是否清晰之前#34; - 在这种情况下,节点B阻碍了我预计会有一个或多个增量旋转命中。

节点A和节点B都是类型.kinematic,带有categoryBitMask 2

Normaly我正在更新physicsWorld模拟后在渲染循环(willRenderScene)中进行接触测试,这触发得很好,所以我知道我的物理实体& 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 !!!!")
        }

    }

1 个答案:

答案 0 :(得分:0)

看起来我只是错过了代码,上面的代码工作正常,如果它放在渲染器中(:willRenderScene) - 我初步尝试在gestureRecogniser触发的方法中直接执行它。相反,我现在只需设置标志并在下一帧渲染之前执行检查:

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