Я делаю игру на основе куба (все является кубом) и в настоящее время пытаюсь оптимизировать ее, не рисуя материал вне поля зрения.
Следующее относится только к плоскостям 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 дня бездельничаю с этим и чувствую себя таким тупицей, когда спрашиваю об этом.