python-3.x - 为什么在物理计算中使用增量时间会产生比预期慢的代码?
问题描述
我有一个使用 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 秒的时间。根据结果,该程序需要两倍的时间来完成此操作。
编辑:添加日志
解决方案
推荐阅读
- java - Spring Security anyRequest.authenticated 行为
- tensorflow - 当使用 TFX 生成数据集时,如何将 tf.Dataset 拟合到 Keras 自动编码器模型?
- javascript - 向 livewire 发送请求时向 sweetalert 添加加载
- flutter - 如何将我从 firebase 数据库中提取的数据以 json 格式上传到 firebase 存储?(扑)
- python - 如何连接特定轴上的张量列表?
- javascript - 如何为从 JS 生成的站点创建唯一的 URL-s?
- python - 搜索具有此编号的日期 python
- django - AWS Elasticbeanstalk Django - 应用程序部署期间出错
- avro - 在 Avro 中,为什么我们必须为正确的 Enum 类型指定一个“null”字符串?
- java - 如何将具有集合作为参数的对象映射到单个对象 - SpringBoot