【问题标题】:AABB of rotated sprite?旋转精灵的AABB?
【发布时间】:2011-10-03 04:52:31
【问题描述】:

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

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

我想要做的是获得 AABB,这样我就可以进行 2D 剔除以进行渲染。

有没有一种贪心的方法可以找到满足任意角度的AABB?

谢谢

【问题讨论】:

  • 不熟悉的可以提一下AABB = "axis-aligned bounding box"?

标签: c++ algorithm


【解决方案1】:

【讨论】:

  • 如果你走这条路,一定要记住原来的 AABB 和当前的旋转角度,否则当你应用越来越多的旋转时,修正后的框会越来越大(使它不太有用) .您帖子中的另一个想法(找到适用于所有角度的 AABB)也很容易(请参阅我的回答)。
  • 请注意,除非精灵本身是一个矩形,否则旋转的 AABB 通常不会是最佳边界;我的意思是,严格来说,您的 AABB 将是一个“边界框”(即:保证在里面),但可能有一个较小的旋转 AABB 适合精灵。 (例如,如果精灵在 AABB 的角附近没有点)
  • 还要记下您的语言是否需要以弧度表示的 theta 或 sin / cos 的度数。 (因此,我浪费了两天时间将其翻译成 Python。)
  • 确保三角函数的abs,否则你会得到退化的大小。
【解决方案2】:

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

通常物体会围绕任意点旋转,因此您必须计算中心的新位置并将此框平移到正确的位置。

【讨论】:

    【解决方案3】:

    我不知道这是否是最有效的方法,但我只会计算顶点的新位置并根据该数据找出 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);
    

    如果您不知道如何将矩阵乘以向量,请尝试使用谷歌搜索。

    还要注意,由于矩阵维度是 4x4,因此顶点的向量也需要是 4 维的。您可以通过添加第三个分量 0(零)和第四个分量 1(一)将 2D 矢量转换为 4D 矢量。乘法完成后,您可以将得到的 4D 向量转换回 2D,方法是将 x 和 y 分量除以第四个分量,并且只需忽略第三个分量,因为您不需要第三维。

    由于矩阵乘法可能是一个相当耗费处理器的运算,因此这种方法可能仅适用于您不需要经常更新大量 AABB 的情况。

    【讨论】:

    • OpenGL 有glMultMatrix,所以你不妨使用它。
    • 是的。除了 glMultMatrix 可能会做一些额外的工作,因为它将矩阵乘以矩阵而不是矩阵乘以向量。但这可能没关系,因为无论如何这种方法可能很慢。
    • 你将四个向量乘以同一个 4×4 矩阵,所以你可以一次完成所有这些......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多