我考虑过这种情况:大致如下的对象:
class PhyisicalObject
{
private:
virtual void Update() = 0;
friend class PhysicsController;
void DoUpdate() { this->Update(); }
};
有一个名为PhysicsController
的控制器类,它通过调用DoUpdate()
方法来管理物理对象池的动态。就这个方法而言,这种方法调用Update()
函数的重载版本,其中使用数值积分器逐步计算对象位置,速度和加速度。我认为有一个界面暗示这个功能将是一个很好的起点:
class IIntegrator
{
virtual void opertor() (const vec3& pos, const vec3& vel, vec3& outPos, vec3& outVel);
};
现在继承这个IIntegrator
抽象类并提供各种方法的实现是下一步(显式的Euler,RK4,Verlet,Midpoint,Symplectic Euler,也许一些半隐式/ IMEX或隐式的将是优秀的)。问题是我没有清楚地知道如何做以下两件事:
每个物理对象以不同的方式计算其自身在任何顶点的加速度(考虑到对象由通过弹簧或某种约束对象连接的质点组成)。此函数必须传递给积分器,但它是特定于对象的。可以获得指向非静态方法的指针,但这如何适合IIntegrator
接口?
当对象调用其Update()
方法时,幕后发生的事情是使用积分器来提供功能。我想也许会动态切换集成方法。或者至少使用不同的集成器实例化相同类型的对象。对我来说,这听起来像是工厂那样做,对于即时集成商的转换......也许是一种策略模式?在这种情况下,什么解决方案会非常优雅和高效?