2017-02-10 130 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