0

我有一个使用 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 秒的时间。根据结果​​,该程序需要两倍的时间来完成此操作。

编辑:添加日志

4

0 回答 0