2010-12-18 67 views
1

我正在製作一個基於多維數據集的遊戲(所有東西都是一個立方體),並且目前正試圖通過不在視野外繪製東西來優化它。C++,OpenGL剪輯

以下內容僅適用於x和y平面,我會擔心後面的z ...所以現在只有邊裁剪。

我知道自己在世界上的位置和旋轉以及每個立方體的位置,因此我們的想法是比較玩家和立方體相對於玩家的z和x旋轉角度,並僅顯示在規定範圍內的立方體。

代碼時間:

// this is how I turn 
float zrotrad = (float)zrot*DEG2RAD; 
float view_limit = .4; 

// distance between the cube and me 
float dist_x = box_x-xpos; 
float dist_y = box_y-ypos; 
float dist_z = box_z-zpos; 

// total distance (I'll use fast sqrt later) 
float dist_tot = sqrt(dist_x*dist_x+dist_y*dist_y); 

float angle = acos(dist_y/dist_tot); 
// need to add 2 pies because acos returns a value [0,2PI] 
float zcuberot = dist_x<0?2*PI-angle:angle; 

if(zcuberot > zrotrad-view_limit && zcuberot < zrotrad+view_limit) 
{ 
    drawcube(box_x, box_y, box_z); 
} 

正如你可能已經明白,還有周圍0度的問題,因爲我的左視場限制爲否定而zcuberot被添加到其2個餡餅的範圍內得到弄糟。 359度同樣的故事 - 實際上因爲view_limit = .4而減少。

我一直在這裏搞了2天,覺得自己像這樣一個啞巴問這個問題。

回答

3

實施八叉樹會更快,更容易(也更不容易出錯)。然後,您可以通過丟棄不與視錐相交的八叉樹部分來清除所有不可見的立方體。您不必爲每個立方體執行此測試,並且您將能夠減少測試,以將一個較大的立方體與6個平面進行比較。

相比你有什麼,一個八叉樹將幾個數量級更快

你可以在WikipediaFlipcode以及其他地方找到有關octrees的大量信息。

+0

非常好,究竟是什麼我需要。 – Solenoid 2010-12-18 20:23:48

0

你應該做的是剪掉錐臺。 在這裏,您幾乎可以找到關於視錐體以及如何從視圖矩陣中提取平面的所有信息,甚至還有一些用於測試立方體是否位於視圖體積內的代碼:http://www.crownandcutlass.com/features/technicaldetails/frustum.html

+0

非常好的主意,將立即執行......在我以某種方式得到這些frustrum音量值後。 – Solenoid 2010-12-18 20:25:16