AABB的旋转精灵?

时间:2011-07-11 22:31:23

标签: c++ algorithm

说我有一个精灵。它的轴对齐边界框(AABB)很容易找到,因为我知道宽度和高度。假设我将它旋转45度,我认为AABB不足以覆盖它,所以我需要一个新的AABB。如何计算旋转矩形的边界矩形? (给定中心点,角度,宽度和高度)。

请注意,OpenGL会进行旋转,因此我无法访问顶点信息。

我要做的是获取AABB,以便我可以进行2D剔除渲染。

是否有可能以贪婪的方式找到满足任何角度的AABB?

由于

3 个答案:

答案 0 :(得分:30)

enter image description here

答案 1 :(得分:1)

如果您想要一个覆盖所有角度的单个框,只需将现有框的半对角线作为圆的半径即可。新的盒子必须包含这个圆圈,因此它应该是一个边长等于半径的两倍(相当于原始AABB的对角线)并且与原始中心相同的正方形。

通常,对象将围绕任意点旋转,因此您必须计算中心的新位置并将此框转换到正确的位置。

答案 2 :(得分: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搜索。

另请注意,由于矩阵尺寸为4x4,因此顶点的矢量也需要为4维。您可以通过添加第三个组件0(零)和第四个组件1(一个)将2D矢量转换为4D矢量。在完成乘法之后,您可以通过将x和y分量除以第四个分量并将其简单地忽略第三个分量,将得到的4D向量转换回2D,因为您不需要第三个维度。

由于矩阵乘法可能是一个非常耗费处理器的操作,如果您不需要经常更新大量AABB,这种方法可能只是好的。