2017-02-10 4 views
1

私はシーンキットの物理エンジンの衝突の力を調べようとしています。なぜSCNPhysicsContact.collisionImpulseは常に0.0ですか?

は機能がcontactBitmasksとcollisionBitmasksが、私が取得するたびに応じて、各衝突のために呼び出され
extension MyScene: SCNPhysicsContactDelegate { 
    func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { 
     print("collisionImpulse=\(contact.collisionImpulse)") 
    } 

contact.collisionImpulse = 0.0

このシーンキットです:私は、次のコードを使用していますシンプルなものを維持するために、バグ?私は何か間違っているのですか?

私はこれを解決し、以下の代わりに使用しようとあきらめた:SCNVector3減算用

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) 

ヘルパー機能:

/// 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

をあなたは "didEnd" または "を使用している場合collisionImpulseがnilではありません"didBegin"の代わりに "didUpdate"を使用してください:

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

私の推測では、値はまだ計算されていませんt didBegin呼び出しの時刻。

+0

ありがとう!これは私の問題を解決しますが、私の場合、didIpdate()内のcollisionImpulseはゼロではありませんでした。 – eisental

関連する問題