3

この問題についてあなたの提案をしたい...

簡単にするために、x 軸のみを考えます。

位置 10 にあるオブジェクトをイメージし、その幅も 10 単位で、毎秒 100 単位で前進します。フレームが少ないため、更新ごとに 80 単位移動する必要があります。

最初の update が呼び出された後、その位置は 90 になり、位置 120 に同じサイズの別のオブジェクトがあります。

次の更新では、オブジェクトを位置 170 に移動します。衝突検出を実装する必要があることを考慮して、更新の前後に衝突を計算しますが、どれも機能しません。

ここで簡単な質問が来ます...

この場合どうすればいいですか?

次のようにします。

Position start = destinationPos - currentPos;
for (int i; i < start; i++)
    if (IsColliding(movingObj.Position + i, staticObj))
        //do the colliding stuff here

私はこの解決策が好きではありません。この場合は問題ないかもしれませんが、x、y、z と多くの移動オブジェクトがある場合はどうでしょうか?

私が良いと思った別の解決策は、信頼できるかどうかはわかりませんが、このすべての計算をループで実行する別のスレッドを用意することです。

このスレッドは無限ループのようなものになり、反復ごとelapsedTimeに非常に小さいと思われるものを計算し、動き続けて衝突を計算し、はるかに遅いレンダリングスレッドが現在の状態を取得しますオブジェクトの、それをレンダリングするだけです。

どう思いますか?

4

3 に答える 3

7

これは幸いなことに、数学の骨の折れる私たちにとっては、多かれ少なかれすでに解決されている問題です。あなたが説明している問題は、動的衝突検出によって解決されます。これは、2 つのオブジェクトがフレーム間で衝突したかどうかを判断するために使用され、特定の種類の衝突については、衝突がいつ発生したかを正確に伝えることさえできるため、世界の状態を更新できます。正しく。

衝突検出アルゴリズムを自分で実装することに特に興味がない場合は、この種のことを既に行っているライブラリの使用を検討します。

このテーマに関する多くの優れた本の 1 つは、Real Time Collision Detectionです。

于 2009-05-23T18:43:04.113 に答える
4

マイク・ダニエルズはこれに触れましたが、あなたの答えはノーです。オブジェクトを個別の「バースト」で移動するものとして扱いたくありません。1d の例を見てみましょう: 車は x = 0 から出発し、前方に 2 単位/秒^2 の速度で加速します。各フレームで速度と位置を再計算することはありません。代わりに、いくつかの単純な計算を使用します。速度は加速度の積分であり、位置は加速度の積分です。したがって、v =2*tと p = t^2. その後、初期条件からの経過時間に基づいて t を代入するだけです。

次に、位置 100 に 2 番目のオブジェクトがあり、-3 単位/秒^2 で加速しているとします。そのとき、その速度は-3*tであり、その位置は100 - (3/2)*t^2です。2 つの位置が等しいときを解くと、t = 40 のときに衝突することがわかります。

方程式を使用すると、フレーム間で物が衝突するかどうかを確認できます。これを行うフレームワークもいくつかありますが、そのしくみについて基本的な理解を深めることが重要です。

于 2009-05-23T19:17:37.370 に答える
3

これは副次的な問題ですが、ロジックの更新レートをゲームのフレームレートから切り離し、物理とロジックのタイム ステップを固定する価値があることに気付くかもしれません。これにより、多くの物理演算と衝突処理が大幅に簡素化され、フレームレートが低下したときの爆発が防止されます。

Glenn Fiedler のサイトには、この方法で動作するゲーム ループの例があります。個人的には、選択肢があれば常に固定レートの更新を使用します。特に物理学の周りで、非常に多くのことを単純化します。

于 2009-05-23T21:11:16.393 に答える