私はこのシナリオを検討しました:大まかに次のように見えるオブジェクト:
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、ベレ、ミッドポイント、シンプレクティックオイラー、およびおそらくいくつかの半暗黙的/ IMEXまたは暗黙的なものが優れています)。問題は、次の2つのことを行う方法がはっきりとわからないことです。
各物理オブジェクトは、さまざまな方法で任意の頂点で独自の加速度を計算します(オブジェクトは、ばねまたはある種の拘束オブジェクトを介して接続されたマスポイントで構成されていると見なされます)。この関数はインテグレーターに渡す必要がありますが、オブジェクト固有です。非静的メソッドへのポインタを取得することは可能ですが、これは
IIntegrator
インターフェイスにどのように適合しますか?オブジェクトがその
Update()
メソッドを呼び出すとき、舞台裏で行われるのは、機能を提供するためにインテグレーターが使用されることです。おそらく、その場で統合方法を切り替えたいと思います。または、少なくとも同じ種類のオブジェクトを異なるインテグレータでインスタンス化します。私には、それは工場がそれを行っているように聞こえます、そして、オンザフライのインテグレーター切り替えのために..おそらく戦略パターン?このコンテキストでは、どのソリューションが非常にエレガントで効率的でしょうか?