物理模拟利用重力时会产生无限的能量

问题描述 投票:0回答:1

我制作了一个非常简单的物理模拟引擎,效果非常好。我想通过一些“向后”模拟来测试它,我只是否定速度并反转每个物体的弹性,然后“向后”逐步执行模拟,这样,如果我在例如之后再次反转所有内容, t=-100 并模拟直到 t=0 再次向前,我应该最终处于与原始 t=0 相同的位置。 这一直有效,直到我添加了重力,当它最终处于与原始位置相同的另一个位置时。

  def step(self) -> list[CollisionHandler]:
    """Updates the simulation by one step with the step-size of dt."""
    collisions = []
    for i, kin in enumerate(self.kinetics):
      for o_kin in self.kinetics[i+1:]:
        handler = self.get_collision_handler(kin, o_kin)
        if handler is None: raise RuntimeError("Unknown Handler")

        if handler.check(kin, o_kin):
          if self.sound: collisions.append(handler)
          handler.resolve(kin, o_kin, self.dt)

      for stat in self.statics:
        handler = self.get_collision_handler(kin, stat)
        if handler is None: raise RuntimeError("Unknown Handler")

        if handler.check(kin, stat):
          if self.sound: collisions.append(handler)
          handler.resolve(kin, stat, self.dt)

    for kin in self.kinetics:
      kin.velocity += self.dt * self.gravity

      kin.loc += self.dt * kin.velocity

    return collisions

我的空间更新功能有问题吗?因为那是唯一使用重力的地方。

该错误不应该是浮点精度错误,因为我确实将所有变量从十进制更改为 Decimal(),而不是 np.float64 并且我仍然没有达到与开始时相同的状态

python python-3.x math physics physics-engine
1个回答
0
投票

如果不看看你如何计算重力,就很难说。

你检查过坐标了吗?我不确切知道你是如何向后运行模拟的,但你可能也需要否定该位置。

© www.soinside.com 2019 - 2024. All rights reserved.