C ++, OpenGL отсечение - PullRequest
       32

C ++, OpenGL отсечение

1 голос
/ 18 декабря 2010

Я делаю игру на основе куба (все является кубом) и в настоящее время пытаюсь оптимизировать ее, не рисуя материал вне поля зрения.

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

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Было бы намного, намного быстрее (и менее подвержено ошибкам) ​​реализовать октре . После этого вы сможете отбирать все невидимые кубы, отбрасывая части октодерева, которые не пересекаются с вашим усечением просмотра. Вам не нужно будет выполнять этот тест для каждого куба, и вы сможете сократить тест до сравнения одного большего куба с 6 плоскостями.

По сравнению с тем, что у вас есть, октри будет на несколько порядков быстрее.

Вы можете найти много информации о октреях в Википедии и Flipcode , среди других мест.

0 голосов
/ 18 декабря 2010

То, что вы должны сделать, это прижаться к плоскостям усеченного конуса.Здесь вы найдете почти все, что вам нужно знать о усеченной фигуре и о том, как извлечь плоскости из матрицы представления, и даже некоторый код для проверки, находится ли куб в объеме представления: http://www.crownandcutlass.com/features/technicaldetails/frustum.html

...