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

ли это сцена 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) 

функция Helper для 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

Смежные вопросы