2015-02-08 77 views
1

對於我的OpenGL場景中的每個對象,我想添加一個BoundingBox,以便我可以將它們用於簡單的碰撞檢測。爲此我創建了一個簡單的BoundingBox類,如下所示:OpenGL BoundingBox碰撞檢測

public class BoundingBox 
{ 
    private float[] mathVector; 

    public float[] minVector; 
    public float[] maxVector; 

    public BoundingBox(float minX, float maxX, float minY, float maxY,float minZ, float maxZ) 
    { 
     mathVector = new float[] {0, 0, 0, 0}; 

     minVector = new float[] {minX, minY, minZ, 1}; 
     maxVector = new float[] {maxX, maxY, maxZ, 1}; 
    } 

    public void recalculate(float[] modelMatrix) 
    { 
     Matrix.multiplyMV(mathVector, 0, modelMatrix, 0, minVector, 0); 
     System.arraycopy(mathVector, 0, minVector, 0, minVector.length); 

     Matrix.multiplyMV(mathVector, 0, modelMatrix, 0, maxVector, 0); 
     System.arraycopy(mathVector, 0, maxVector, 0, maxVector.length); 
    } 

    public boolean overlap(BoundingBox bb) 
    { 
     return (maxVector[0] >= bb.minVector[0] && bb.maxVector[0] >= minVector[0]) && 
       (maxVector[1] >= bb.minVector[1] && bb.maxVector[1] >= minVector[1]) && 
       (maxVector[2] >= bb.minVector[2] && bb.maxVector[2] >= minVector[2]); 
    } 
} 

現在我的問題是重新計算函數並不真正起作用。我認爲它足以將矩陣(因爲存在roatation,位置和sclae)與向量相乘而看起來不夠。重新計算工作還需要做什麼?

回答

3

對於潛在旋轉的網格,您正在使用軸向對齊的邊界框。 由於箱子軸向對齊,因此無法直接處理旋轉。然而,你可以用多種方式處理這個問題:

  • 使用一個定向的邊界框,它可以旋轉,因此它可以跟蹤你的對象的移動。
  • 更昂貴的方法是使用一個軸向對齊的盒子,並通過變換對象的頂點並在每次旋轉對象時提取最小值和最大值來重新計算最小值和最大值,這不僅更昂貴,碰撞檢測通常不太精確,因爲定向邊界框不太適合(取決於對象的形狀)。
+0

啊我想我知道你的意思。所以我需要在最後4點爲一個定向邊界框? – Cilenco 2015-02-08 14:34:39

+0

@Cilenco它*可以*但是當你旋轉一個軸向對齊的盒子時,你會得到一個拉伸的版本,*不是*旋轉的版本,因此你的邊界框會變得比預期的大得多。但這取決於你想要達到什麼目的。 – concept3d 2015-02-08 14:35:02

+0

@Cilenco你需要存儲不同的信息來創建一個OBB,它是一個不同的故事,它取決於你想要達到什麼樣的模擬。 http://gamedev.stackexchange.com/questions/49041/oriented-bounding-box-how-to – concept3d 2015-02-08 14:37:37

3

我在我的遊戲中做了類似的事情。在最小最大值框中轉換8個點後,需要重新掃描以找到沿每個軸的新最小值。

想想最低限度作爲鞋盒。新的矩陣旋轉並拉伸它。變換之後,8個點中的任何一個都可以是任何軸上的新的最小值或最大值。

+0

謝謝你當然是對的我忘了這個。我現在已經實施了,但這並沒有幫助。還有其他的錯誤或者我忘記的東西嗎? – Cilenco 2015-02-08 14:28:47