2016-11-10 30 views
0

我想製作一個遊戲,在3D平面上玩家可以與周圍的物體發生碰撞。我打算通過用無法輸入的不可見矩形包裹遊戲中的所有3D模型來進行碰撞。我寫了代碼來計算每個頂點的X,Y和Z的最小值/最大值,以查找每個頂點的最高點和最低點。我會如何將它變成一個矩形棱鏡?如何使用X,Y和Z頂點的最小/最大值計算矩形棱鏡

這裏是我到目前爲止的代碼:

public CollisionModel(List<Vector3f> vert) { 
    float xLow = 1000; 
    float xHigh = 0; 
    float yLow = 1000; 
    float yHigh = 0; 
    float zLow = 1000; 
    float zHigh = 0; 
    for(Vector3f v : vert) { 
     if(v.x > xHigh) { 
      xHigh = v.x; 
     } else if(v.x < xLow) { 
      xLow = v.x; 
     } 
     if(v.y > yHigh) { 
      yHigh = v.y; 
     } else if(v.y < yLow) { 
      yLow = v.y; 
     } 
     if(v.z > zHigh) { 
      zHigh = v.z; 
     } else if(v.z < zLow) { 
      zLow = v.z; 
     } 
    } 
} 
+1

我想我很困惑你是什麼意思的頂點。你談論一個「頂點」就像它可以有最高點和最低點。不是頂點本身只是3D空間中的一個點嗎? – nhouser9

+0

你還需要什麼?只需使用八個(x,y,z)組合作爲頂點。 – Bubletan

+0

對不起,我不是很清楚,我試圖通過迭代頂點數組來找到最高和最低,以及最遠和最遠的背部以及3D模型的左右頂點。我想如果我能找到這些點,我可以在模型本身上創建一個矩形棱鏡。 –

回答

1
  1. min,max的初始值應該是第一個頂點不是硬編碼0,1000
  2. 你會發現min,max給你包圍盒這就是你所說的棱鏡。

現在你需要做碰撞測試。問題是你的對象很可能會移動/旋轉...所以你需要首先將變換應用到你的盒子。因此,首先構造邊界框頂點。在3D是8分:

p0 = (xLow , yLow , zLow ) 
p1 = (xHigh , yLow , zLow ) 
p2 = (xHigh , yHigh, zLow ) 
p3 = (xLow , yHigh, zLow ) 
p4 = (xLow , yLow , zHigh) 
p5 = (xHigh , yLow , zHigh) 
p6 = (xHigh , yHigh, zHigh) 
p7 = (xLow , yHigh, zHigh) 

現在申請對象transformations他們每個人。最後你需要添加碰撞測試。所以你很可能想測試兩個邊界框是否碰撞。爲此,您需要測試是否有任何邊緣線bbox1(q0..q7)bbox2(p0..p7)的任何面相交。這些面是:

p0,p1,p2,p3 
p4,p5,p6,p7 
p0,p1,p5,p4 
p1,p2,p6,p5 
p2,p3,p7,p6 
p3,p0,p4,p7 

和邊緣線:

q0,q1 
q1,q2 
q2,q3 
q3,q0 
q4,q5 
q5,q6 
q6,q7 
q7,q4 
q0,q4 
q1,q5 
q2,q6 
q3,q7 

對於交叉口本身就需要谷歌的公式(我懶得爲你獲得或搜索它),但是在這裏第一次谷歌打我發現:

是喲您可以使用三角形與線相交,因爲您面對的是2個連接的三角形...還有另一個選項,即將線條轉換爲另一個bbox的座標系,然後爲每條線計算點,其中x,y,z = minmax,然後只是測試其他兩個座標是否在範圍內。

相關問題