C++ 从长方体计算AABB(中心、半尺寸、旋转)
我想从我的长方体类计算AABB(轴对齐的边界长方体) 盒子类:C++ 从长方体计算AABB(中心、半尺寸、旋转),c++,rotation,game-physics,bounding-box,aabb,C++,Rotation,Game Physics,Bounding Box,Aabb,我想从我的长方体类计算AABB(轴对齐的边界长方体) 盒子类: Box{ Point3D center; //x,y,z Point3D halfSize; //x,y,z Point3D rotation; //x,y,z rotation }; AABB类(长方体,但不旋转): Ofc,当旋转=(0,0,0)时,BoundingBox=Box。但是,当旋转=(rx,ry,rz)时,如何计算包含所有内容的最小边界框 如果有人问:旋转以弧度为单位,我在DirectX矩阵
Box{
Point3D center; //x,y,z
Point3D halfSize; //x,y,z
Point3D rotation; //x,y,z rotation
};
AABB类(长方体,但不旋转):
Ofc,当旋转=(0,0,0)时,BoundingBox=Box
。但是,当旋转=(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
,y
和z
。这将定义轴对齐的边界框。这就是它最基本的形式,你应该试着弄清楚细节。我希望这是一个好的开始 那么,您应该在原始边界框的顶点上应用旋转(为了计算的目的),然后在所有顶点上迭代以找到所有顶点的最小值和最大值x
,y
和z
。这将定义轴对齐的边界框。这就是它最基本的形式,你应该试着弄清楚细节。我希望这是一个好的开始 可以在笛卡尔坐标系中使用矩阵旋转。绕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)
及
有了这个,你可以计算(甚至是分析)最终的旋转矩阵。假设您先沿z旋转(按该顺序),然后沿y再沿x旋转(请注意,轴x、y、z在空间中是固定的,它们不会在每次旋转时旋转)。最终矩阵为产品:
R = Rx(A) Ry(B) Rz(C)
现在,您可以使用六个角的位置构造向量,并将全旋转矩阵应用于这些向量。这将给出旋转版本中六个角的位置。然后,只需计算对角点之间的距离,就可以得到新的边界框尺寸。可以在笛卡尔坐标系中使用矩阵旋转。绕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)
及
有了这个,你可以计算(甚至是分析)最终的旋转矩阵。假设您先沿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'应包含新顶点的位置。然后计算它们到xy、xz和yz平面的距离。最大距离是边界框的一半。谢谢:)这可能很愚蠢,但如何将矩阵应用到DirectX 11中的点/向量(不在着色器中)?不再有setState函数。我没有真正使用DirectX,所以我不知道如何回答。让我试一试。实际上,我所做的是创建向量,就是创建向量V=(X,Y,Z)
其中X=+/-X的一半大小,Y=+/-Y的一半大小,Z=+/-Z的一半大小(非旋转)。这将为您提供8个顶点。您只需要4个顶点(不需要相反的顶点)。然后做一个乘法(矩阵和向量的乘法)。V'应包含新顶点的位置。然后计算它们到xy、xz和yz平面的距离。最大距离为边界框的一半。