0

box2dゲームで特定のイベントの遅いリプレイを表示しようとしています。このイベントには、ヘルスに基づいてオブジェクトが移動、回転、衝突、破壊されることが含まれます。

私がやったことは、イベントが始まる直前に自分の世界のすべてのオブジェクトの状態を保存し、イベントが終了したときにそれらを復元して、すべてが再び起こるようにすることです。この再生を遅くしたいので、実際に渡された時間の一部をワールド更新関数に渡します。衝突処理を除いて、すべての動きとオブジェクトは正常であり、元の実行で破壊された一部のオブジェクトはリプレイで存続し、その逆も同様です。

このことは、box2dを使用して理論的に正しく実行できますか、それとも時間を無駄にしていますか?

4

2 に答える 2

1

最も重要なことは、両方の実行でタイム ステップの長さを同じに保つことです。遅く見えるようにするには、レンダリングの位置を補間できます。Box2D は効率を高めるためにいくつかの内部状態を保持します。位置と速度を保存された状態にリセットして再度実行することによって、これを完全に無効にすることはできないと思います。

スローモーションが長すぎない場合は、シミュレーションを 1 回だけ実行して、すべてのステップのすべての位置を記録し、それを使用してスローモーションとフルスピードの実行の両方をレンダリングします。たとえば、スローモーションの長さが 3 秒で、60 fps で実行している場合、スローモーション シーンが必要になるとすぐに、(レンダリングなしで) 世界を 180 ステップずつ Step() し、すべての位置を配列か何か。次に、配列内の位置を前後に任意の速度で補間することにより、スローモーションをレンダリングできます:) スローモーションシーンが終了したら、配列を破棄して通常どおり続行します。欠点は、ワールドが大きい場合、180 のステップを実行するのにかなりの時間がかかる可能性があることです。

于 2012-07-19T01:23:03.107 に答える
0

iforce2d は正しいです。リプレイを行う最善の方法は、すべての位置を記録することです。box2d に同じ入力を与えても、出力が異なる可能性があるためです。

于 2012-07-24T05:44:07.447 に答える