我認爲這個腳本對象:對象大致是這樣的:添加數值積分到更新自己的身體狀態
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