非整列衝突回避(ステアリング)を使用しているときにオブジェクトの衝突が移動する


9

まれなケースだと思うのに、未調整の衝突回避に問題があります。2つのオブジェクトを互いに近づけるように設定しましたが、オフセットはわずかです。そのため、1つのオブジェクトがわずかに上方向に移動し、1つのオブジェクトがわずかに下方向に移動しています。

私の位置合わせされていない衝突回避ステアリングアルゴリズムでは、オブジェクトの前線と、これら2つの線が最も近い他のオブジェクトの前線上の点を見つけています。これらの最も近い点が衝突回避距離内にあり、それらの間の距離が2つのオブジェクトの境界球の2つの半径よりも小さい場合、オブジェクトは適切な方向に離れるはずです。

問題は、私の場合、線上の最も近い点が実際の衝突点から本当に遠くにあると計算されることです。これは、オブジェクトが通過するときに、各オブジェクトの2本の前進線が互いに離れるからです。問題は、これが原因でステアリングが行われず、2つのオブジェクトが部分的に衝突することです。

オブジェクトの転送行のスクリーンショット。

衝突点を正しく計算する方法について何か提案はありますか?おそらく、2つのオブジェクトのサイズを考慮に入れているのでしょうか。


スクリーンショットでは、緑、赤、青の線が3Dワールドの軸にすぎないことに注意してください。
James Bedford

回答:


6

これは、私が遭遇した群を抜いて最高のボール対ボール衝突検出記事です。

ビリヤード場レッスン:円または球の間の高速で正確な衝突検出


球と球の衝突テストの方法を知っています。私の問題は、この衝突が将来発生する場所を見つけることです。ありがとう。
James Bedford

@ジェームズその記事はあなたの問題を解決します。2ページ目を見てください。球の1つで「速度」に任意の高い数値を使用して、「将来の」衝突点を特定できます。
Tetrad 2011年

わかりました-チェックアウトしなくて申し訳ありませんが、見た目はかなり良いです!それを読んだら、私はあなたに連絡しなければならないでしょう。おかげで:)
ジェームズ・ベッドフォード

1
2ページの「バンクショット:移動する2つの円の衝突」のセクションで説明すると、最初の円の速度ではなく、2つの円の速度の差をアルゴリズムで使用する必要があるということですか。(2番目の円の速度は、アルゴリズムの定常バージョンでは使用されません。)このビットは私にはそれほど明確ではありませんでした。ありがとう。
James Bedford

0

あなたは最も近い点を見つけたくありません。

距離が両方の球の半径の合計に等しい線上の点を見つけたいとします。


ああ… これを数学的に理解する方法を知っていますか?
James Bedford

0

私があなたの質問を正しく理解している場合は、AttackingHoboが示唆しているように、球と球の交差テストを使用するだけで済みます。

このようなテストを行うための数学は次のとおりです(私が間違っていれば訂正してください。しばらくの間ですが)。また、これは球がそれぞれ中心と半径の変数を持つことを考慮しています。

チェックの式は次のようになります。

distanceOfSpheres <= sumOfRadii^2

球と球の交差があります。これは非常に単純です。コードでどのように見えるか見てみましょう!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

繰り返しますが、これはあなたが探している正しい答えだと思います。これが間違っていることを誰かが知っている場合は、修正してください。これは、この計算を行ってからしばらく時間が経過しているためです。


球と球の衝突テストの方法を知っています。私の問題は、この衝突が将来発生する場所を見つけることです。ありがとう。
James Bedford

0

わかりました、うまくいけばこれは理にかなっています...ボールのベクトルを取得し、それらの衝突点を計算します。これをp1と呼びます。2つのベクトル間の角度を見つけ、これをa1と呼びます。a1 / 2で線を引くと、これは2つのベクトルの真ん中に度単位で配置されます。この線上の位置でsin(a1 / 2)=(radius1 + radius2)/ 2が必要です。この写真が私の頭の中で右に視覚化されている場合、これが衝突が発生する場所です。これが間違っていると申し訳ありません...それは遅いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.