1

私はキューブベースのゲーム(すべてがキューブです)を作成していて、現在、視野の外にあるものを描画しないことによってそれを最適化しようとしています。

以下は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日間いじり回していて、これを尋ねるのはとてもばかげているように感じます。

4

2 に答える 2

3

octreeを実装する方がはるかに高速です(エラーが発生しにくくなります)。次に、表示錐台と交差しない八分木の部分を破棄することにより、すべての非表示の立方体をカリングできるようになります。すべての単一の立方体に対してこのテストを実行する必要はなく、単一の大きな立方体を6つの平面と比較するようにテストを減らすことができます。

あなたが持っているものと比較して、八分木は数速くなります。

ウィキペディアフリップコードなどで、八分木に関する多くの情報を見つけることができます。

于 2010-12-18T19:48:18.737 に答える
0

あなたがすべきことは、錐台面に対してクリップすることです。ここでは、錐台について知っておく必要のあるほとんどすべてのことと、ビューマトリックスから平面を抽出する方法、さらには立方体がビューボリューム内にあるかどうかをテストするためのコードを見つけることができます:http ://www.crownandcutlass.com /features/technicaldetails/frustum.html

于 2010-12-18T19:51:48.530 に答える