我有一个使用 Pygame 构建的简单弹丸运动模拟。我将 FPS 限制为 60 并计算了每帧的增量时间。然后我使用这个增量时间来更新我的弹丸的位置。但是,问题是,更新似乎很慢。
根据我对给定弹丸轨迹的论文计算,弹丸应该在不到 5 秒的时间内完成它的路径。然而,在弹丸完成其路径之前已经过去了更多的时间。这是我的代码:
def update(self, dt):
if not self.is_on_ground:
self.time += dt # time is initialized to 0
# calculate initial x and y velocities
vx = self.vi * math.cos(self.angle)
vy = self.vi * math.sin(self.angle)
# kinematics
self.dx = (vx * self.time)
self.dy = (vy * self.time) + ((-9.8 * (self.time ** 2)) / 2)
# update old positional values
self.x = self.dx + self.init_x
self.y = self.init_y - self.dy
# update rectangle position
self.rect.center = (self.x, self.y)
# check if the ball has hit the ground
self.check_collisions()
我希望球会在计算出的时间同时落地,但事实并非如此。我已经排除了这是一个 FPS 问题的可能性,因为打印dt
总是给我一个一致的 0.017 秒(大约 1/60)。我错过了什么吗?
这是一个示例运行:
t x y vi angle
0.5 687.51 751.21 21.93 1.15
t x y vi angle
1.0 692.02 744.88 21.93 1.15
t x y vi angle
1.51 696.63 740.95 21.93 1.15
t x y vi angle
2.02 701.14 739.59 21.93 1.15
t x y vi angle
2.53 705.78 740.77 21.93 1.15
t x y vi angle
3.04 710.38 744.5 21.93 1.15
t x y vi angle
3.55 715.0 750.83 21.93 1.15
t x y vi angle
4.07 719.62 759.75 21.93 1.15
注意 - 较低的 y 值意味着“物理上”较高
使用方程式v_yf = v_yi + gt^2
并求解t
将给出大约 2 秒的时间。根据结果,该程序需要两倍的时间来完成此操作。
编辑:添加日志