我想从我的 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)
现在,您可以使用六个角的位置构造矢量,并将完整的旋转矩阵应用于这些矢量。这将给出旋转版本中六个角的位置。然后只需计算相对角之间的距离,您就有了新的边界框尺寸。
好吧,您应该在原始边界框的顶点上应用旋转(出于计算目的),然后遍历所有这些顶点以找到所有顶点的最小和最大x
、y
和z
。这将定义轴对齐的边界框。这就是最基本的形式,您应该尝试找出细节。我希望这是一个良好的开端。:)