シミュレーションを行うと、シーンを構成するオブジェクトの状態が変化する。 ある時刻での状態を保存しておき、再現することができると、数ステップ前に戻ったり、あるステップのシミュレーションを、力を加えた場合と加えない場合で比べたりといった作業ができ る。 Springheadでは、ObjectStatesIfを用いることで、以下のようにシーン全体の状態をまとめてメモリ上に保存、再現することができる。
PHSceneIf* phScene; 省略:phScene(物理シミュレーションのシーン)の構築 UTRef<ObjectStatesIf> states; states = ObjectStatesIf::Create(); // ObjectStatesオブジェクトの作成 states->AllocateState(phScene); // 保存用のメモリ確保 states->SaveState(phScene); // 状態の保存 phScene->Step(); // 仮のシミュレーションを進める 省略:加速度の取得など states->LoadState(phScene); // 状態の再現 states->ReleaseState(); // メモリの開放 省略:力を加えるなどの処理 phScene->Step(); // 本番のシミュレーションを進める
Springheadのシーン(PHSceneやCRScene)は、複数のエンジン(PHEngineやCREngineの派生クラス)を呼び出すことで、シミュレーションを進める。 シーンは、エンジンの呼び出し中以外のタイミングであればいつでも状態を保存・再現することができる。
状態保存用のメモリは、シーンの構成に依存している。AllocateState(), SaveState(), LoadState()だけでなく、ObjectStatesIf::ReleaseState()も依存するので、ObjectIf::AddChildObject()などのAPIによってシーンの構成を 変化させてしまうと、保存・再現だけでなくメモリの開放もできなくなる。変更前に開放するか、シーン構成を戻してから開放する必要がある。