コードネーム「Sphynx」におけるこれまでのFarseer Physics Engine 2.0の懸案
現在までのコードネーム「Sphynx」開発において、対応方法に検討が必要になっている部分についてです。
オブジェクトのクローン(複製)
外から操作できる値の複製によって、オブジェクトのクローンを作る場合、シーンの再現に必要なすべてのオブジェクトのクローンを再構築しても、内部状態まで再現されているとは限りません。そこで、時間を0すすめることで再現できると良いのですが、PhysicsSimulator.Updateメソッドに経過時間0では内部処理を行わないため、無理があります。
ステージ編集時における再現性の検討
ステージ編集時には完全な物理状態の永続化をしないで、ある程度制約を設けるのがよいと検討しています。
- ロード直後の経過時間0での完全再現が困難ならば、「ゲーム開始」ではBody.ResetDynamicsメソッドなどによって規定値から始まる仕様にする。
PhysicsSimulator.Updateメソッドでの悩み
また、ステージ編集時には、作業の都合上、ゲーム時間を止めたまま編集作業をすることがあります。その場合、たとえば物体を追加したときには、その時点(経過時間0)から交差判定したいわけです。例えば、カーソル位置の物体を調べるといった具合です。そこで、物理エンジンお得意の衝突判定を利用したいのですが、先ほどのPhysicsSimulator.Updateメソッドの仕様によって、ワールド座標の頂点などの物体の状態が更新されないため、交差判定などに問題が出ています。
また、挙動を確認してみると、物体などのPhysicsSimulatorにコレクションされている要素は、追加と削除をあるタイミングで行うために遅延されています。これもまた、物体を追加したその時点(経過時間0)から最新状態で編集できない理由になっています。
現在の「Sphynx」では、一部においては、0でない適度な経過時間を指定して更新することで、それらしい動作をさせ、未対処部分では不自然な挙動になっています。
対策検討事項
- Body.Enabledなどを駆使して、うまく最新状態にさせることができるか?
- Body.Enabledをfalseとすると衝突が起きなくなる。
- IsStaticをtrueにしても、衝突が起きない。使い分けはあるか?
余談
コードネーム「Sphynx」はLBPと対比しながら作業をしています。LBPにおいて、物理エンジンの都合からできた仕様もあるのだろうかと、想像が膨らんできます。
たとえば、「一時停止でピストンを編集していて、一時停止中なのに操作方法によっては動かないものを一緒に引きずってしまう」ような現象です。
- LBPのクリエイトモードについての推測
- 一時停止状態でも物理エンジンはだいたい動作していて、交差判定などを利用して直観的操作を提供している。(推測)
- その仕様によって、ときには期待に反して、JointクラスやSpringクラスに相当する部品が思うように移動・回転操作できない事態になっている。(推測)
- 再生状態でも編集操作をした物体は一時停止状態になっている。Enabledのようなものがある。(推測)