私はキューブベースのゲーム(すべてがキューブです)を作成していて、現在、視野の外にあるものを描画しないことによってそれを最適化しようとしています。
以下は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);
}
ご存知かもしれませんが、左翼の視野限界が負になり、zcuberotに2パイが追加されるため、範囲が乱れるため、0度付近に問題があります。359度についても同じ話ですが、実際にはview_limit = .4
。
私はこれを2日間いじり回していて、これを尋ねるのはとてもばかげているように感じます。