2012-08-14 46 views
1

我想從我的Box類中計算AABB(軸對齊的邊界框)。從框中計算AABB(center,halfSize,rotation)

盒類:

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。但是如何計算包含盒子裏所有東西的最小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; 

回答

1

您可以在笛卡爾座標中使用矩陣旋轉。繞x軸的角度A的旋轉由矩陣定義:

   1  0  0 
    Rx(A) = 0 cos(A) -sin(A) 
      0 sin(A) cos(A) 

如果周邊的周圍旋轉Z Y和C的角度B做同樣的您有:

   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) 

現在,您可以構建載體與六個角的位置和全旋轉矩陣適用於這些載體。這將給出旋轉版本中六個角落的位置。然後,只需計算相對角之間的距離,並獲得新的邊界框尺寸。

+0

謝謝:)這可能是愚蠢的,但如何將矩陣應用於DirectX 11中的點/矢量(而不是着色器)?不再有setState函數。 – PolGraphic 2012-08-14 13:29:28

+1

我不真的使用DirectX,所以我不知道如何回答。讓我試一試。在實踐中,我所做的是創建矢量是創建矢量'V =(X,Y,Z)',其中X = +/-沿x的一半尺寸,Y = +/- 沿y的半尺寸和Z = +/- 沿z的一半尺寸(不旋轉)。這會給你8個頂點。你只需要4(你不需要對立的頂點)。然後,只需進行乘法'V'= R V'(矩陣和矢量的相乘)。 V'應該包含新頂點的位置。然後計算它們到xy,xz和yz平面的距離。最大距離是邊界框的一半。 – rpsml 2012-08-14 13:39:13

+0

偉大:-)非常感謝。 – PolGraphic 2012-08-14 13:51:14

0

那麼,你應該應用旋轉的原始邊框的頂點(爲的目的計算),然後重複遍歷所有頂點,找出所有頂點的最小值和最大值,即x,yz。這將定義你的軸對齊的邊界框。這是它最基本的形式,你應該試着弄清楚細節。我希望這是一個好的開始。 :)