当在动态身体上施加力时,即使冲动设定在false
,似乎该力也不会持久。
我有一个带有physicsBody的sphereNode:dynamic,mass = 1和damping = 0。世界引力设定为(0,0,0)。
如果我在手势识别器中应用力:
func Detected(sender: UILongPressGestureRecognizer) {
if sender.state == UIGestureRecognizerState.Began {
sphereNode.physicsBody!.applyForce(SCNVector3Make(1, 0, 0), impulse: false)
}
if sender.state == UIGestureRecognizerState.Ended {
sphereNode.physicsBody!.clearAllForces()
}
}
然后速度变为0.0166
,好像力只在一帧中施加并保持不变,除非我再次触发手势。
使其成为真正恒定力量的唯一方法是在渲染器循环中调用applyforce,但是与非冲动应用程序的唯一区别是60倍。我不认为这是预期的行为。
我认为这是应该如何工作的。
当你想瞬间改变身体的动量时,你会使用冲动。例如,你可以用冲动从大炮射出一个球。就像一门大炮,它是“火与忘记”;你打电话给方法,球飞了,直到它击中了什么。
当你想要产生连续效果时,你可以使用力(impulse:NO
)。也就是说,它不会产生连续的效果(否则必须有枚举和取消每个身体上的单独连续力的API),但它为你提供了一个工具,当你想在每一帧上做某事时创造持续的效果。
例如,如果您希望在按下按钮时加速飞船加速,并使用加速直到释放它,就会使用力。按住按钮时,每次运行applyForce
方法时都要调用update
。
impulse
切换为这两种情况做了两件事:
impulse:NO
时,它会延迟评估,直到当前帧周期结束。所以你可以在一个update
中应用几种不同的力,当SceneKit为下一帧模拟物理时,它将应用力的总和(除非你先调用clearAllForces
)。