簡體   English   中英

SceneKit-使用physicsWorld.updateCollisionPairs()進行即時接觸檢測

[英]SceneKit - Instant contact detection using physicsWorld.updateCollisionPairs()

我試圖確定在旋轉節點的路徑中是否存在可能的接觸。 我的想法是做一個增量旋轉(對於90度,i循環10次,每次9度),並每次執行接觸測試。 我的問題是,即使每次我都調用updateCollisionPairs()時,即使路徑中有對象,聯系人也是空的。 這是一張以某種方式說明它的圖片(正面):

我正在嘗試將節點A旋轉90度,但是在我需要檢查“路徑是否清晰”之前-在這種情況下,節點B處於這種方式,因此我希望獲得一個或多個增量旋轉。

節點A和節點B均為.kinematic類型,類別為BitMask 2

通常,更新PhysicsWorld模擬后,我會在渲染循環(willRenderScene)中進行接觸測試,並且觸發得很好,所以我知道我的PhysicalBodies和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 !!!!")
        }

    }

看起來我只是放錯了代碼,如果將上面的代碼放在renderer(:willRenderScene)中,則上面的代碼可以正常工作-我最初嘗試直接在gestureRecogniser觸發的方法中執行該代碼。 相反,我現在只設置標志並在渲染下一幀之前執行檢查:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM