2011-07-11 190 views
8

說我有一個精靈。它的軸對齊邊界框(AABB)很容易找到,因爲我知道寬度和高度。假設我將它旋轉45度,我不認爲AABB的大小足以覆蓋它,所以我需要一個新的AABB。我如何計算旋轉矩形的邊界矩形? (給定中心點,角度,寬度和高度)。旋轉精靈的AABB?

請注意,OpenGL做旋轉,所以我沒有訪問頂點信息。

我想要做的是得到AABBs,所以我可以做2D渲染的剔除。

是否有可能找到滿足任何角度的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); 

如果您不知道如何將矢量乘以矩陣,請嘗試使用Google搜索。

還要注意,由於該矩陣尺寸是4×4,爲頂點的載體也需要是4維。通過添加第三個分量0(零)和第四個分量1(一個),可以將二維矢量轉換爲四維矢量。乘法完成後,可以通過將x和y分量除以第四個分量,並簡單地忽略第三個分量,將得到的4D向量轉換回2D,因爲您不需要第三個維度。

由於矩陣乘法可能是一個相當處理器繁重的操作,這種方法可能只有好處沒有壞處,如果你並不需要經常更新了大量的的AABB。

+1

OpenGL有'glMultMatrix',所以你可以使用它。 –

+0

是的。除了glMultMatrix可能會做一些額外的工作,因爲它將矩陣乘以矩陣而不是矩陣乘以矢量。但這可能是好的,因爲這種方法可能很慢。 – kynnysmatto

+0

您將四個向量乘以相同的4×4矩陣,因此您可以一次完成所有這些操作。 –

1

如果你想覆蓋各個角度單選框,只取半對角線現有盒爲圓的半徑。新的盒子必須包含這個圓圈,所以它應該是一個正方形,其邊長等於半徑的兩倍(相當於原始AABB的對角線),並且與原始中心相同。

一般對象將圍繞任意點進行旋轉,所以你必須計算中心的新位置,此框轉換到合適的位置。