2017-02-10 97 views
1

我試圖找出Scene Kit的物理引擎中碰撞的力量。爲了簡單起見,我用下面的代碼:爲什麼SCNPhysicsContact.collisionImpulse總是0.0?

extension MyScene: SCNPhysicsContactDelegate { 
    func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { 
     print("collisionImpulse=\(contact.collisionImpulse)") 
    } 

的功能是根據contactBitmasks和collisionBitmasks但每次我得到的呼籲每個碰撞contact.collisionImpulse = 0.0

這是一個場景套件錯誤?難道我做錯了什麼?

我放棄了試圖解決這個問題,並改用以下內容:

let factor: Float = 1.2 
    let relativeVelocity = contact.nodeA.physicsBody!.velocity - contact.nodeB.physicsBody!.velocity 
    let velMagnitude = relativeVelocity.length() 
    let force = min(velMagnitude*factor, 1.0) 

爲SCNVector3減法助手功能:

/// Vector subtract 
func - (l: SCNVector3, r: SCNVector3) -> SCNVector3 { 
    return SCNVector3(l.x-r.x, l.y-r.y, l.z-r.z) 
} 
+0

我有同樣的問題,你有沒有發現什麼是錯的? –

+1

我沒有。我使用上面提到的解決方法,但它不是真正解決問題的方法。 – eisental

+0

終於找出原因,查看下面的答案。 –

回答

0

的collisionImpulse不是零,如果您使用「didEnd」或「 didUpdate「而不是」didBegin「:

func physicsWorld(_ world: SCNPhysicsWorld, didEnd contact: SCNPhysicsContact) { 
     print("collisionImpulse=\(contact.collisionImpulse)") 
} 

我的猜測是這些值還沒有被計算出來t didBegin調用的時間。

+0

謝謝!這解決了我的問題,但在我的情況下,collisionImpulse只在didUpdate()內部非零。 – eisental