为什么 SCNPhysicsContact.collisionImpulse 总是 0.0?

Why is SCNPhysicsContact.collisionImpulse always 0.0?

我试图找出 Scene Kit 物理引擎中的碰撞力。为了简单起见,我使用以下代码:

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

根据 contactBitmasks 和 collisionBitmasks 每次碰撞都会调用该函数,但每次我得到 contact.collisionImpulse=0.0

这是 Scene Kit 的错误吗?我做错了什么吗?

我放弃了尝试解决这个问题并改用以下方法:

    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)
}

如果您使用 "didEnd" 或 "didUpdate" 而不是 "didBegin",则 collisionImpulse 不为零:

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

我的猜测是在调用 didBegin 时尚未计算值。