从盒子计算 AABB(中心、半大小、旋转)



我想从我的 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 中的所有内容的最小边界框rotation = (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;

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

             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)

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

好吧,您应该在原始边界框的顶点上应用旋转(出于计算目的),然后遍历所有这些顶点以找到所有顶点的最小和最大xyz。这将定义轴对齐的边界框。这就是最基本的形式,您应该尝试找出细节。我希望这是一个良好的开端。:)

相关内容

  • 没有找到相关文章

最新更新