gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:57:55 28 4
gpt4 key购买 nike

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

我正在尝试将节点 A 旋转 90 度,但在我需要检查“路径是否畅通”之前 - 在这种情况下,节点 B 挡住了路,所以我希望能成功或更多增量旋转。

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

通常我在更新 physicsWorld 模拟后在渲染循环 (willRenderScene) 中进行接触测试,这触发很好,所以我知道我的 physicsBodies 和 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)中,它就可以正常工作 - 我最初尝试直接在 gestureRecogniser 触发的方法中执行它。相反,我现在只是设置标志并在渲染下一帧之前执行检查:

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

关于ios - SceneKit - 使用 physicsWorld.updateCollisionPairs() 进行即时接触检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com