2011-07-11 31 views
8

私はスプライトを持っていると言います。私は幅と高さを知っているので、その軸に沿ったバウンディングボックス(AABB)は簡単に見つけることができます。私はそれを45度回転させると、私はAABBがそれをカバーするのに十分に大きいとは思わないので、私は新しいAABBが必要です。どのように回転矩形の境界矩形を計算することができますか? (中心点、角度、幅と高さが与えられている)。回転スプライトのAABB?

OpenGLはローテーションを行うので、頂点情報にアクセスすることはできません。

私がしようとしているのは、レンダリングのために2Dカリングを行うことができるようにAABBを取得することです。

任意の角度を満たすAABBを見つけるには貪欲な方法がありますか?

おかげ

+5

使い慣れていない人には、AABB = "軸に合わせた境界ボックス"と言えるでしょうか? –

答えて

29

enter image description here

+5

+1:画像には千語分の価値があります。 –

+0

あなたがこのルートに行くならば、元のAABBと現在の回転角度を忘れないようにしてください。そうしないと回転がますます増えるので、修正されたボックスは大きくなります。 あなたの記事の他のアイデア(すべての角度で機能するAABBを見つけること)も簡単です(私の答えを見てください)。 –

+1

スプライトがそれ自体が長方形でない限り、回転したAABBは一般的に最適な境界にならないことに注意してください。つまり、AABBは厳密に「バウンディングボックス」(つまり内部にあることが保証されています)と言いますが、スプライトに適合する回転AABBが小さくなることがあります。 (たとえば、スプライトにAABBのコーナーの近くにポイントがない場合) – lurscher

0

これが最も効率的な方法であれば、私は知りませんが、私はちょうど、頂点の新しい位置を計算し、そのデータに基づいてAABBを見つけるでしょう。たとえば、

Vertex v0, v1, v2, v3; 
// in the local coordinates of the rectangle 
// so for example v0 is always 0,0 and width and height define the others 
// put some values to v0..v3 

glLoadIdentity(); 
glTranslatef(the position of the rectangle); 
glTranslatef(center_point); 
glRotatef(angle, 0,0,1); 
glTranslatef(-center_point); 

GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix); 

v0 = multiply_matrix_by_vector(matrix, v0); 
v1 = multiply_matrix_by_vector(matrix, v1); 
v2 = multiply_matrix_by_vector(matrix, v2); 
v3 = multiply_matrix_by_vector(matrix, v3); 

AABB = find_the_minimums_and_maximums(v0, v1, v2, v3); 

ベクトルで行列を乗算する方法がわからない場合は、googlingしてください。

また、行列の寸法が4×4であるため、頂点のベクトルも4次元である必要があります。 3番目のコンポーネント0(ゼロ)と4番目のコンポーネント1(1)を追加して、2Dベクトルを4Dベクトルに変換できます。乗算が完了したら、xおよびy成分を4番目の成分で除算し、3番目の成分が不要なため3番目の成分を無視することで、結果の4Dベクトルを2Dに戻すことができます。

行列の乗算は非常にプロセッサー重い操作である可能性があるので、多くのAABBを非常に頻繁に更新する必要がない場合は、この方法が有効です。

+1

OpenGLには 'glMultMatrix'があるので、それを使うこともできる。 –

+0

はい。ただし、glMultMatrixはおそらくベクトルによって行列の代わりに行列で行列を乗算するため、余分な作業をします。とにかくこの方法はおそらく遅いのでおそらく大丈夫です。 – kynnysmatto

+0

4つのベクトルに同じ4×4行列を乗算しているので、一度にそれらをすべて実行できます... –

1

すべてのアングルをカバーする1つのボックスが必要な場合は、既存のボックスの半対角を円の半径として取ってください。新しいボックスにはこの円が含まれている必要があります。そのため、半径の2倍の辺の長さ(元のAABBの対角に等しい)と元の中心と同じ長方形の正方形でなければなりません。

一般に、オブジェクトは任意の点を中心に回転するので、中心の新しい位置を計算し、このボックスを適切な場所に移動する必要があります。

関連する問題