3

スイープとは、オブジェクトが現在衝突しているかどうかだけでなく、オブジェクトがどこかで衝突するかどうかを判断することを意味すると思います。間違っている場合は教えてください。

軸上に配置された境界ボックスのあるオブジェクトがあります。オブジェクトのボックスはさまざまなサイズにすることができますが、常に長方形です。

ある時点で2つの移動するAABBオブジェクトが衝突するかどうかを判断するためのアルゴリズムを試してみましたが、非常に苦労しています。ある時点で2つのオブジェクトが通過する時間間隔を決定することについての質問をここで読みました。それを視覚化することに問題はありませんでしたが、それを実装することは別の話でした。例外が多すぎて、正しくやっていないようです。

オブジェクトは直線でしか移動できず(明らかに方向を変えることができますが、たとえば方向を変えることができますが、常に軸上にあります。軸をオフにしようとすると機能しません)、バインドされます軸に。それらの境界ボックスは回転したり、そのようなことをしたりしません。速度は変化する可能性がありますが、メソッドのポイントは、オブジェクトの現在の状態を考慮して、オブジェクトが「衝突コース」にあるかどうかを判断することであるため、問題ではありません。さらに情報が必要な場合はお知らせください。

誰かがいくつかの擬似コード(または実際のコード)を提供できれば、それは素晴らしいことです。凸オブジェクトの交差:軸を分離する方法というドキュメントを読みましたが、その中の擬似コードの一部を理解していませんでした(Unionの意味)?

どんな助けでもありがたいです、ありがとう。

4

1 に答える 1

1

衝突が発生すると、ボックスは片側に接触します。側面のペア(LR、RL、UD、DU)が接触しているかどうかを確認できます。

問題を単純化する場合は、最初のボックスが原点にあり、移動しないようにボックスを変換できます。

次のコードのようなもの:

dLR = B.L - A.R;
dRL = A.L - B.R;
dUD = B.U - A.D;
dDU = A.U - B.D;

vX = A.xV - B.xV;
vY = A.yV - B.yV;

tLR = dLR / vX;
tRL =-dRL / vX;
tUD = dUD / vY;
tDU =-dDU / vY;

hY = dUD + dDU; //combined height
hX = dLR + dRL;

if((tLR > 0) && (abs(dDU + vY*tLR) < hY)) return true;
if((tRL > 0) && (abs(dUD - vY*tRL) < hY)) return true;
if((tUD > 0) && (abs(dRL + vX*tUD) < hX)) return true;
if((tDU > 0) && (abs(dLR - vX*tDU) < hX)) return true;
return false;
于 2010-08-02T03:41:07.563 に答える