物理对象双缓冲

Physics Object Double Buffering

我一直在 python 中使用我编写的(非常)基本的物理引擎开发一个小游戏。最初的物理代码很匆忙,所以我一直在清理它并试图让它不那么糟糕。问题是:

我想通过让物理对象将它们的碰撞响应函数存储在一个变量中,使碰撞检测(使用 SAT 算法)与碰撞响应分离,这允许不同的对象表现为触发器、固体对象、力场等。在这样做时,我必须使响应包含两个方法调用(一个用于碰撞中的每个对象),这意味着一个调用在另一个调用之后发生。这会导致问题,因为对一个对象的更改会影响另一个对象对碰撞的响应。

我读过有关在显示图像时使用双缓冲的信息,并认为它可以通过以某种方式缓冲对每个对象的所有更改并在计算完所有更改后应用它们来解决此问题。我一直无法想出一种干净灵活的方法来做到这一点。有谁知道处理这种非同时碰撞响应的好方法?

编辑:我想过每个变量都有一个以前的和当前的版本,但这看起来很难看,而且会使 class

膨胀

(很抱歉,如果这是一个冗长的问题,我觉得需要背景来弄清楚我想做什么)

假设您有 2 个物理对象 A 和 B,并且您分别确定它们刚刚发生碰撞。你的问题是,如果你先计算出 A 对 B 的影响,然后再计算出 B 对 A 的影响,但是 B 已经改变了,这使得第二部分成为问题!

一种可能的方法是制作 2 个 Collision 对象。每个都包含 A 的副本和 B 的副本(可能在构造函数中以这种方式初始化)。假设在内部,碰撞对象称为 Obj1 和 Obj2。

主要方法 () 可能命名为 getTheCollissionEffectOfObj1onObj2()。这将 return 新版本的 Obj2 具有新的速度、自旋等或您正在使用的任何物理特性。

创建 2 个 Collision 对象,其中一个 A 作为 Obj1,B 作为 Obj2,第二个相反。然后在两者上调用 getTheCollissionEffectOfObj1onObj2() 而不必担心 A 或 B 已更改。

这与您建议的变量没有太大区别,但它允许单独计算对每个对象的影响,因为碰撞对象是用碰撞前 A 和 B 的副本构造的。当2个碰撞对象被销毁时,副本也将被销毁。

我不知道 Python 所以我不能给出示例代码,但这在任何 OOP 语言中都是可行的。