我正在尝试使用Apple的SpriteKit游戏引擎来创建游戏。
[虽然在游戏中执行了一些基于物理学的计算,但我注意到计算的结果不同于物体发生的有效变化。
[示例:通过projectile motion的方程式计算物体的轨迹会使物体实际上比所计算的物体更快/更快地掉落。
在计算与重力有关的东西时,如何使物理引擎与现实世界的物理定律匹配?
Edit-我创建了一个示例项目,以演示带或不带乘法器的计算路径。
https://github.com/emilioschepis/spritekit-gravity-sample
TL; DR-在SpriteKit中计算与重力相关的事物时,将场景的重力乘以151即可获得准确的结果。
[尝试解决此问题时,我首先开始阅读与重力有关的SpriteKit文档:
https://developer.apple.com/documentation/spritekit/skphysicsworld/1449623-gravity
文档说:
此属性的组件以米/秒为单位进行度量。默认值为(0.0,-9.8),代表地球的重力。
但是,重力是在m/s^2
中计算的,而不是在m/s
中计算的。
认为这是在SpriteKit中实现重力的一个错误,我开始认为也许无法在场景中应用基于现实世界的物理定律。
但是,我确实遇到了另一个有关线性重力场的文档页面,该页面正确地报告了在SpriteKit的m/s^2
中测量了重力。
https://developer.apple.com/documentation/spritekit/skfieldnode/1520145-lineargravityfield
然后,我建立了一个简单的自由落体场景,在该场景中,我对物理物体施加了初始速度,然后计算了预期的轨迹,同时将其与实际轨迹进行了比较。
x轴的计算从一开始就很准确,这表明唯一的问题在于重力值。
然后我尝试手动修改场景中的重力,直到实际轨迹与预测的轨迹匹配。
[我发现是在游戏中使用物理世界的重力属性时,必须将〜151的“魔术”值考虑在内。
例如修改轨迹的y轴计算
let dy = velocity.dy * time + 0.5 * gravity * pow(time, 2)
to
let dy = velocity.dy * time + 0.5 * 151 * gravity * pow(time, 2)
导致准确的计算。
我希望这对以后可能遇到相同问题的任何人都是有用的。