簡體   English   中英

C ++,OpenGL裁剪

[英]C++, OpenGL clipping

我正在制作一個基於多維數據集的游戲(一切都是多維數據集),當前正在嘗試通過不在視場外繪制內容來對其進行優化。

以下內容僅適用於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

我已經為此糾纏了兩天了,問這個問題真是愚蠢。

這將是非常非常快(和不易出錯)來實現八叉樹 然后,您將可以通過丟棄八叉樹與觀察視錐不相交的部分來剔除所有不可見的立方體。 您不必對每個多維數據集都執行此測試,並且可以減少將單個較大的多維數據集與6個平面進行比較的測試。

與您所擁有的相比,八叉樹速度要快幾個數量級

WikipediaFlipcode上 ,您可以找到很多有關八叉樹的信息。

您應該做的就是夾住平截頭平面。 在這里,您將找到有關平截頭體以及如何從視圖矩陣中提取平面的幾乎所有知識,甚至還有一些代碼可以測試多維數據集是否在視圖體積之內: http : //www.crownandcutlass.com /features/technicaldetails/frustum.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM