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
};

ああ、いつrotation = (0,0,0), BoundingBox = Box。しかし、Box のすべてを含む最小の BoundingBox を計算する方法は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;
4

2 に答える 2

1

デカルト座標で行列回転を使用できます。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)

これで、6つのコーナーの位置を使用してベクトルを作成し、これらのベクトルに完全な回転行列を適用できます。これにより、回転バージョンの6つのコーナーの位置がわかります。次に、対向するコーナー間の距離を計算するだけで、新しいバウンディングボックスの寸法が得られます。

于 2012-08-14T13:14:52.950 に答える
0

元のバウンディング ボックスの頂点に回転を適用し (計算のために)、それらすべてを反復処理して min と max xyおよびzすべての頂点を見つける必要があります。これにより、軸に沿ったバウンディング ボックスが定義されます。これが最も基本的な形です。詳細を調べてみてください。良いスタートになることを願っています。:)

于 2012-08-14T12:46:06.797 に答える