【问题标题】:Calculating AABB from Box (center, halfSize, rotation)从 Box 计算 AABB(中心、halfSize、旋转)
【发布时间】:2012-08-10 18:03:16
【问题描述】:

我想从我的 Box 类中计算 AABB(轴对齐边界框)。

盒子类:

Box{
    Point3D center; //x,y,z
    Point3D halfSize; //x,y,z
    Point3D rotation; //x,y,z rotation
};

AABB 类(方框,但没有旋转):

BoundingBox{
    Point3D center; //x,y,z
    Point3D halfSize; //x,y,z
};

Ofc,当rotation = (0,0,0), BoundingBox = Box。但是rotation = (rx,ry,rz)时如何计算包含Box中所有内容的最小BoundingBox?

如果有人问:旋转是弧度,我在 DirectX 矩阵旋转中使用它:

XMMATRIX rotX = XMMatrixRotationX( rotation.getX() );
XMMATRIX rotY = XMMatrixRotationY( rotation.getY() );
XMMATRIX rotZ = XMMatrixRotationZ( rotation.getZ() );
XMMATRIX scale = XMMatrixScaling( 1.0f, 1.0f, 1.0f );
XMMATRIX translate = XMMatrixTranslation( center.getX(), center.getY(), center.getZ() );
XMMATRIX worldM = scale * rotX * rotY * rotZ * translate;

【问题讨论】:

    标签: c++ rotation game-physics bounding-box aabb


    【解决方案1】:

    嗯,你应该在原始边界框的顶点上应用旋转(为了计算的目的),然后遍历所有顶点以找到最小和最大 xyz的所有顶点。这将定义您的轴对齐边界框。这就是它最基本的形式,你应该试着弄清楚细节。我希望这是一个好的开始。 :)

    【讨论】:

      【解决方案2】:

      您可以在笛卡尔坐标中使用矩阵旋转。角度 A 绕 x 轴的旋转由矩阵定义:

                   1     0      0 
          Rx(A) =  0   cos(A)  -sin(A) 
                   0   sin(A)   cos(A)
      

      如果你对围绕 y 的角度 B 和围绕 z 的 C 做同样的事情,你有:

                   cos(B)     0      sin(B) 
          Ry(B) =    0        1        0 
                  -sin(B)     0      cos(A)
      

               cos(C)   -sin(C)  0 
      Rz(C) =  sin(C)    cos(C)  0 
                 0         0     1
      

      有了这个,你可以计算(甚至分析)最终的旋转矩阵。假设您(按此顺序)沿 z 旋转,然后沿 y 旋转,然后沿 x 旋转(注意轴 x、y、z 在空间中是固定的,它们不会在每次旋转时旋转)。最终的矩阵是乘积:

      R = Rx(A) Ry(B) Rz(C)
      

      现在您可以使用六个角的位置构造向量,并将完整的旋转矩阵应用于这些向量。这将给出旋转版本中六个角的位置。然后只需计算对角之间的距离,就可以得到新的边界框尺寸。

      【讨论】:

      • 谢谢 :) 这可能很愚蠢,但如何将矩阵应用于 DirectX 11 中的点/向量(不在着色器中)?不再有 setState 函数。
      • 我并没有真正使用 DirectX,所以我不知道如何回答。让我试一试。在实践中,我所做的是创建向量是创建向量V = (X,Y,Z),其中 X = +/- 沿 x 的一半大小,Y =+/- 沿 y 的一半大小和 Z =+/- 沿 z 的一半大小(非旋转)。这将为您提供 8 个顶点。你只需要 4 个(你不需要相反的顶点)。然后只需进行乘法V' = R V(矩阵和向量的乘法)。 V' 应该包含新顶点的位置。然后计算它们到 xy、xz 和 yz 平面的距离。最大距离是边界框的一半。
      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多