2010-12-18 15 views
1

私はキューブベースのゲームを作成しています(すべてが立方体です)、視野の外にアイテムを描画しないように最適化しようとしています。C++、OpenGL clipping

以下は、xとy平面にのみ適用されます。後でzについて心配します...今のところサイドクリッピングのみです。

世界の自分の位置と回転、それにすべての単一立方体の位置がわかっているので、プレーヤとキューブのzとxの回転角度をプレーヤと比較し、定義された範囲内のキューブ。

コード時間:私の左のフィールドビューの制限が負になると範囲が台無しに取得し、それに追加zcuberotは2つのパイを取得しますので、

// 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度周りの問題が、あります。 359度の同じ話 - 実際にはview_limit = .4のために少ない

私はこれで2日間ぐっすり揺さぶられてきました。

答えて

3

オクテイルを実装する方がはるかに高速(エラーが発生しにくい)になります。あなたは視覚錐台と交差していないオクトリーの部分を破棄することによって、すべての目に見えないキューブを取り除くことができます。 1つのキューブごとにこのテストを実行する必要はなく、1つの大きなキューブと6つのプレーンを比較するテストを減らすことができます。

あなたが持っているものと比べると、オクトリーは少しだけの次数がになります。

オクツリーについての情報は、WikipediaFlipcodeなど多くの情報があります。

+0

私は欲しい。 – Solenoid

0

あなたがすべきことは、錐台の平面に対してクリップすることです。 ここでは、錐台について知る必要があるすべてのものと、ビューマトリックスからプレーンを抽出する方法、さらにはキューブがビューボリューム内にあるかどうかをテストするコードさえあります。http://www.crownandcutlass.com/features/technicaldetails/frustum.html

+0

非常に良いアイデアは、すぐに実装する...私は何とかそれらの欲求のボリューム値を取得した後。 – Solenoid