在动态物体上施加力时,即使将脉冲设置为false
,似乎该力也不会持久。
我有一个带有physicsBody的sphereNode:动态,质量= 1和阻尼= 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,但是与非脉冲applyforce的唯一区别是60倍。我认为这不是预期的行为。
最佳答案
我认为这应该是这样。
当您想立即改变身体的动量时,可以使用冲量。例如,您可能使用冲量从大炮发射球。就像一门大炮一样,它是“开枪而忘了”。您调用该方法,球会飞起来直到撞到某物。
若要产生连续效果,请使用力(impulse:NO
)。也就是说,它不会产生连续的效果(否则就必须有API来枚举和消除每个物体上的各个连续力),但是当您要在每个帧上执行某项操作时,它会为您提供一个使用的工具。创建一个连续的效果。
例如,如果您想让太空飞船在按下按钮时加速,并一直加速直到释放它,则要用力。按住该按钮时,每次运行applyForce
方法时只需调用update
。impulse
切换键在两种情况下有两件事:
如您所见,它会更改大小单位以适合每种情况。
使用impulse:NO
时,它将评估延迟到当前帧周期结束。因此,您可以在一个update
期间施加几种不同的力,当SceneKit在下一帧模拟物理时,它将施加力的总和(除非您先调用clearAllForces
)。