4

我考虑过这种情况:大致如下所示的对象:

class PhyisicalObject
{
  private:
  virtual void Update() = 0;
  friend class PhysicsController;
  void DoUpdate() { this->Update(); }
};

有一个称为 a 的控制器类PhysicsController,它通过调用物理对象的DoUpdate()方法来管理物理对象池的动态。就术语而言,此方法调用函数的重载版本,Update()其中使用数值积分器逐步计算对象的位置、速度和加速度。我认为拥有一个暗示此功能的接口将是一个很好的起点:

class IIntegrator
{
  virtual void opertor() (const vec3& pos, const vec3& vel, vec3& outPos, vec3& outVel);
};

现在继承这个IIntegrator抽象类并提供各种方法的实现是下一步(显式欧拉、RK4、Verlet、中点、辛欧拉,也许一些半隐式/IMEX 或隐式的会很好)。问题是我不清楚如何做以下两件事:

  1. 每个物理对象以不同的方式在其任何顶点计算自己的加速度(考虑到对象由通过弹簧或某种约束对象连接的质点组成)。此函数必须传递给积分器,但它是特定于对象的。可以获得指向非静态方法的指针,但这如何适合IIntegrator接口?

  2. 当一个对象调用它的Update()方法时,幕后发生的事情是一个集成器被用来提供功能。也许我想即时切换集成方法。或者至少用不同的积分器实例化同一种对象。对我来说,这听起来像是一家工厂在这样做,而且对于即时集成商切换……也许是一种策略模式?在这种情况下,什么解决方案会非常优雅和高效?

4

1 回答 1

2

在不讨论实现细节的情况下,这里有一些可能适用于您的问题的设计模式

  • 工厂原型在启动时从文件创建对象,或分别在运行时克隆它们。
  • Composite这可以用于建模PhysicalObjects,可以是独立的对象,也可以是由弦、弹簧或重力连接的集合。
  • 迭代器访问者这可以用于PhysicsController迭代所有物理对象(复合或独立)并在它们上应用函数。
  • 策略在运行时选择不同IIntegrator的对象及其集成函数。

除了 GoF 书籍(亚马逊),这里还有一个很好的在线资源

于 2012-08-15T09:44:28.013 回答