1

これが私の問題です。

私のゲームは、効率的なレンダリングと衝突のために領域に分割されています。各領域には、動的に移動する多くのオブジェクトがあります。彼らが移動したときに、彼らがどの地域にいるのかをすばやく判断する方法が必要です。

オブジェクトは、領域よりも長くまたは広くすることはできません。したがって、一度に 4 つ以上のリージョンに存在することはできません。

注意が必要なのは、オブジェクトの四角形が 2D の分離軸定理を使用した方向付けられた境界ボックスであるため、回転できることです。

これを行う主な方法は、各ポイントの領域を決定することです。

static public int colFromPos(float startX,float width, float x)
{
    x -= startX;
    return (int)Math.floor(x / width);

}

static public int rowFromPos(float startY,float height, float y)
{
    y -= startY;
    return (int)Math.floor(y / height);

}

これはかなり速いようです。

私はこのようにそれを行うためのいくつかの方法を考えました:

  1. OBB の境界四角形を生成し、この四角形の 4 つの領域を見つけます。ここでの欠点は、オブジェクトが本当に入っているかどうかを判断するために、さらにテストを行う必要があることです。
  2. OBB の各コーナーと各中間点の領域を決定します。

これを行うためのより良い、より速い方法はありますか? 私の解決策はどちらも良いアイデアですか?

ありがとう

ここに画像の説明を入力

4

1 に答える 1

0

OBBの各頂点を含む領域を決定します。

4つすべてが同じリージョンにある場合は、そのリージョンを返します。

4つすべてがX座標またはY座標を共有する領域のペアにある場合は、その領域のペアを返します。

それらが4つの異なるリージョンにある場合は、4つのリージョンのグループを返します。

これらの条件のいずれにも当てはまらない場合は、2つの異なる領域X座標と2つの異なる領域Y座標があり、単一の頂点Vで交わる4つの領域のグループを定義します。

VがOBB内にある場合は、4つの領域すべてを返します。

VがOBBの外側にあり、OBB頂点が3つの異なる領域にある場合、それらの3つの領域を返します。

残りのケースは、対角線上に隣接する領域のペアにOBBの頂点が含まれ、VがOBBの外側にある場合です。同じ領域にない頂点を接続するOBBの側を選択します。2つの頂点を含む領域と、線が交差する3番目の領域を返します。

私は、例えばVがOBBの側にいるという問題には取り組んでいません。これらのケースの処理は、プログラムの規則によって異なります。

于 2012-11-08T20:16:49.360 に答える