1

我想从我的 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. 但是如何计算包含 Box 中所有内容的最小 BoundingBox whenrotation = (rx,ry,rz)呢?

如果有人问:旋转是弧度,我在 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;
4

2 回答 2

1

您可以在笛卡尔坐标中使用矩阵旋转。角度 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)

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

于 2012-08-14T13:14:52.950 回答
0

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

于 2012-08-14T12:46:06.797 回答