Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从长方体计算AABB(中心、半尺寸、旋转)_C++_Rotation_Game Physics_Bounding Box_Aabb - Fatal编程技术网

C++ 从长方体计算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矩阵

我想从我的长方体类计算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矩阵旋转中使用它:

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平面的距离。最大距离为边界框的一半。