我认为这个脚本对象:对象大致是这样的:添加数值积分到更新自己的身体状态
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
抽象类,并提供各种方法的实现是下一步(显式欧拉,RK4,verlet的,中点,辛欧拉,也许一些半隐含/ IMEX或隐式的将是非常好的)。问题是,我没有看清楚怎么做以下两件事情:
每个物理对象在其任何以不同的方式顶点的计算自己的加速度(考虑对象包括通过弹簧连接masspoints的或某种约束对象)。这个函数必须传递给积分器,但它是特定于对象的。有可能获得指向非静态方法的指针,但这将如何适合
IIntegrator
接口?当一个对象调用它的
Update()
方法时,幕后会发生什么情况是使用集成器来提供功能。或许,我想立即切换集成方法。或者至少用不同的集成商实例化相同类型的对象。对我来说,这听起来像是一家工厂,为了即时集成商切换..也许是一种战略模式?在这种情况下,什么解决方案会非常优雅和高效?
这本书http://www.amazon.co.uk/Scientific-Software-Design-Object-Oriented-Way/ dp/0521888131/ref = sr_1_1?s = books&ie = UTF8&qid = 1345024376&sr = 1-1可能会引起您的兴趣。我推荐它。 – 2012-08-15 09:54:08