3D衝突回避:更新された速度ベクトルを見つける(「衝突速度」コーンの外)


8

私は現在、静的障害物(すべて球の形状)を回避することに焦点を当てており、飛行運動(6自由度)の完全3D衝突回避(ステアリング動作)システムのメカニズムを理解して実装しようとしています。

ただし、移動するエージェントの新しい速度ベクトルを理解する方法はわかりません。次の図は、シーンを示しています。移動するエージェント(緑)は、3つの静的オブジェクト(青)を操縦する必要があります。赤い線は、初期の前方速度ベクトルを表します。

ここに画像の説明を入力してください

また、3つの白/半透明の円錐があることに注意してください。これらは、各障害物に関する「禁止速度ベクトル」を表します。これは、エージェントの新しい前方ベクトルとして使用された場合に、エージェントが1つ以上の障害物と衝突することになる速度ベクトルのセットです(各コーンの半径は、指定された障害物の半径と等しいことに注意してください)プラスエージェントの半径。これにより、プレイヤーが操作できるようにオフセットを設定できます)。

このような3D環境で移動エージェントの新しい先行ベクトルを見つけるために、3つの障害を考慮して、単純なアプローチは、このよく引用される記事で説明され、次の2D画像で例示される古典的なソリューションを3Dに移植することです。

ここに画像の説明を入力してください

そこでは、新しい速度(オレンジ色の矢印)は、元の速度と障害物の中心との間の最小距離(黒い矢印)を正規化し、そのような法線に障害物の半径と移動エージェント。次に、各障害物について計算された新しい速度の平均が、最終的な速度の合計になります。

多くの場合、それで十分です。ただし、以下のケースを確認してください(視覚化を容易にするために2Dで例示)。

ここに画像の説明を入力してください

それらすべてにおいて、ナイーブなアプローチは衝突を引き起こします。aとbでは、最終的な新しい速度は元の速度(赤い矢印)と一致し、移動中のエージェントは部分的または完全にブロックされているにもかかわらず前進します。c)とd)では、新しい速度(オレンジ色の矢印)でも同じ結果になります。

だから、私の質問です:衝突を回避する方法で3つの障害を考慮して、そのような3D環境で移動エージェントの新しい前方ベクトルを見つける最も計算効率の良い方法は何ですか?または、言い換えると、次のような新しい先行ベクトル:

1)コーンの内部にない。

2)は、元の前方ベクトルに最も近い(図の赤い線)。

PS:できれば、私は図書館を探しているのではなく、その方法を学びたいと思っています。

回答:


1

問題を正確に解決する効率的な方法はないと思いますが、これが私がそれに取り組む方法です。

まず、オブジェクト自体ではなく、各オブジェクトの周囲に境界ボリュームを使用します。ただし、各オブジェクトは複数のバウンディングボリュームの結合によって近似できます。

最も簡単な解決策は、回避する必要があるすべてのオブジェクトを含む単一の境界ボリュームを計算し、そのボリュームからコーンを計算することです。

オブジェクトが互いに比較的近くない場合、これは十分ではないかもしれません。次に、2つのオブジェクトが同じクラスターに属することができない場合、または少なくともそれらの間をやり取りするのが簡単ではない場合に、2つのオブジェクトが同じクラスターに属するようにクラスタリングを行うことができます。バウンディングボリュームに加えて、プレーヤーのバウンディングボリュームのサイズと追加のマージンを考慮して、オブジェクトのクラスターを計算します。あなたはこのようなものを使うかもしれません:

http://lab.polygonal.de/?p=120

クラスターを取得したら、最も近いクラスターを見つけて、コーンとの衝突を避けるためにコーンを計算します。クラスターの作成方法により、1つのクラスターに当たらないように操縦した場合、別のクラスターには当たらないでしょう。

さらに、クラスターを計算するときに再帰的な構造を作成して、最も近いクラスターを見つけることができます。

あなたが遊ぶことができるいくつかのものがあります。たとえば、最も近いクラスターを選択する代わりに、2つの最も近いクラスターを選択し、両方を回避する単一の円錐を計算します。また、球体以外のバウンディングボリュームを試すこともできます。


0

私が見ることができるこの質問に対処するには2つの方法があります。最初に、単に操縦する方法を見つけたい場合は、パスファインディングを実装する必要があります(これは非常に役立ちます)。これで終わりです(この質問に対する正しい実用的な答えです)が、問題の数学的な解決策についてもっと知りたいと思います。

これに対処するために、同等の問題を見てみましょう。元のベクトルに垂直な飛行機のパイロットの「前方」にあるシーンの2Dスライスを撮ります。取得されるのは、元のベクトルを表す点と、オクルージョンコーンの2D投影である一連の楕円です。次に、P重複しない楕円の外側にある、元のポイント(と呼びましょう)に最も近いポイントを見つけます。これは解決するのがかなり難しい問題であることがわかります。3つのステップがあります。

  • すべての楕円の交点を把握する
  • すべての楕円の結合に穴を見つけます
  • Pユニオンの外側にあるすべての楕円(穴の内側にある場合もあります)に最も近い点を見つけます

さて、これらすべては、ラグランジュ乗数と角度チェック、および他のいくつかの本当に複雑なものを解決する必要があります。他のオプションを見てみましょう。代わりに問題を角度空間に変換すると、実際に実行したいのは、点と球の表面に投影された複数の円の間の最小距離を見つけることです。微分幾何学では、これはしばしば2球と呼ばれ、ここで役立ちます。したがって、最初に、球の表面上の2点間の距離を見つける必要があります。これは、2球メトリックを使用して見つけます。幸いなことに、それは非常に簡単ですds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)。ここでは、R3空間に投影された2球の半径を一定に保ちます。物理学から来て、私が取るth正からの角度であることをzph正からの角度であることをxs距離です。

これを行うことで何が達成されますか?これにより、ラグランジュ乗数の使用を削除して距離を最小化し、「ネイティブ」座標で作業することができます(オクルージョンをオクルージョンの角度で定義するため)。したがって、今度は円錐投影の半径を見つける必要があります。ここでは、1つの円錐を取り上げ、それを定義する角度と呼びますa。投影の半径は単純R*aです。それは十分に簡単でした-コーンについて知る必要がある他の量は何ですか?投影の中心を知る必要があります。これは、アクターからのルックベクトルによって定義されます。まず、我々は変換しxy、とz私たちは距離を置いていることを知っている球座標にR、そしてのために解決thし、ph我々は単に私たちの変換式に差し込むことによって行うことができます:th = acos(z/R)そしてph = atan2(y/x)atan2ここでは、アークタンジェントの四分円のあいまいさを説明するために使用します)。球座標で元のベクトルの位置を見つけるプロセスは同じです。

したがって、問題は単純化されました。ただし、問題を解決することは非常に困難ですが、楕円と点または角度とベクトルではなく、円と点のみを考慮する必要があります。残りのプロセスはかなり手続き型です。あなたは本質的にあなたのサークルによって形成された境界領域を見つける必要があり、それに対して複数の解があります。最善ではないかもしれませんが、機能する1つの方法を紹介します。

まず、すべての円ペアの半径の合計と中心間の距離を比較し、それらの合計が中心距離よりも大きい場合は、それらを等しく設定しthph交差点を見つける。交点の各ペアは問題の円の「禁止角度」を説明していることを知っています。これは、この円と交差する各円の交点の角度(円の中心からの)の配列として保存します。重要なのは「次の部分が正しく機能するように配列に追加するときに重複する範囲をすべてマージします。次に、円の端で元の点に最も近い点を見つけます(これは、円の中心点と元の点を通る線を引くのと同じくらい簡単で、次に円の半径での線上の位置を見つけます中心から離れて)。次に、格納された配列をループして、その角度が各禁止角度の範囲内にあるかどうかをテストします。その場合は、最も近いエッジを選択します。これは、この円の内側に記述されている外側に最も近い点です。すべての円についてこのプロセスを繰り返します(選択プロセスで一部の最適化を行うことができます。実際にすべての円についてこれを計算する必要はありません)。次に、すべての最短距離を比較し、最短距離を見つけます。それが角度で説明されている答えですthph。この計算を実行する間、距離は2球メトリックで記述されることに注意してください。このすべてがオンになっている球については気にしないので、角度だけR=1が単位球でこれらの計算を設定および実行できます。

これは私がこれを行うと考えることができる最も簡単な方法です。それが絶対に最も簡単な方法であるかどうかはわかりませんが、かなりうまくいくでしょう。ただし、実際のゲームでは、パスファインディングを実装したいだけです。

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