我考虑过这种情况:大致如下所示的对象:
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 或隐式的会很好)。问题是我不清楚如何做以下两件事:
每个物理对象以不同的方式在其任何顶点计算自己的加速度(考虑到对象由通过弹簧或某种约束对象连接的质点组成)。此函数必须传递给积分器,但它是特定于对象的。可以获得指向非静态方法的指针,但这如何适合
IIntegrator
接口?当一个对象调用它的
Update()
方法时,幕后发生的事情是一个集成器被用来提供功能。也许我想即时切换集成方法。或者至少用不同的积分器实例化同一种对象。对我来说,这听起来像是一家工厂在这样做,而且对于即时集成商切换……也许是一种策略模式?在这种情况下,什么解决方案会非常优雅和高效?