Подоба А.А, Бровков В.Г.
Одесский национальный политехнический
университет.
Исследование методов организации
данных в задачах визуализации 3D-обьектов. Метод QuadTree
С революцией графических карт произошёл переворот не только в трехмерных
играх, а также в программах отображения трехмерных объектов. Ранее большинство
игр составляли шутеры - игры от первого лица. Почему раньше доминирующее
положение занимали именно шутеры? Потому что их было проще реализовывать, так
как отображались довольно небольшие пространства - одна, две комнаты. С
большими, открытыми пространствами (ландшафтами) дела были совсем плохи – из-за
отсутствия стен и потолка, которые
ограничивают обзор и отсекают лишние пространства при рендеринге, при больших
пространствах нужно рендерить целиком всю панораму сцены, что более
затруднительно, нежели рендеринг тех комнат, в которых находиться камера в
шутере. Ввиду такой особенности трехмерной геометрии были предприняты шаги,
чтобы упростить рендеринг больших пространств.
Шаги, которые необходимо предпринять для отображения трёхмерного
обьекта:
1) Пересчитать координаты камеры
2) Пересчитать координаты трёхмерного
объекта относительно камеры
3) Определить, какие обьекты следует
отображать, а какие - нет
4) Выполнить процедуру clipping’a
относительно камеры
5) Перевести координаты обьектов в
экранные
6) Отрисовать объекты на экране
При больших размерах сцены и открытых ландшафтах, когда необходимо
просчитывать все обьекты, которые могут попасть в камеру,обработка происходит
за линейное O(n) время. Это значит, что в случае, когда на открытом пространстве сцены
присутствует 1024 обьекта – все обьекты будут просчитаны. Это очень повлияет на
отрисовку сцены и появится необходимость уменьшить время вычисления – это
повлияет на скорость отрисовки сцены на экране.
Было введено понятие quadtrees (дословный перевод этого термина звучит
как: «деревья квадратов»). Этот метод оптимизации позволяет уменьшить время до O(4*lg2(n)). Пример: если на сцене
присутствует 1024 обьекта – то время уменьшается до 40 временных единиц на
объект (с 1024 временных единиц на объект). Если на сцене 30000 – время около
60 временных единиц на объект.
Давайте представим себе наш ландшафт как большую сетку, простирающуюся в
плоскости x/z. Смотрите на рисунок 1. Здесь мы имеем камеру, размещенную в
правой нижней части ландшафта, с видимым пространством в виде синего
треугольника, видимое пространство камеры охватывает несколько ячеек в синем
треугольнике в направлении взгляда камеры. Таким образом, без всяких оптимизаций
рендеринг нашего ландшафта будет выглядеть так:
Рисунок 1.
Деревья квадратов (Quadtrees) делят наш ландшафт на четыре части,
после чего каждую из четырех частей
делят еще на четыре части и так далее, пока величина деления не будет равна
заданной. Рассмотрим наглядно на рисунке 2. Сначала начинаем с нашей сетки.
После этого делим эту сетку на 4 меньших раздела.
Рисунок 2.
Как вы видите на рисунке 3, сейчас мы имеем 4 подраздела ландшафта (2,
3, 4, 5). Делить на разделы необходимо до тех пор, пока, к примеру, один раздел
не будет равен размеру одной ячейки. Так, в нашем следующем рисунке мы будем
делить первый раздел на четыре меньших части.
Рисунок 3.
И снова делим один из полученных разделов на 4
части :
Рисунок 4.
И вновь делим полученный в результате деления
раздел на 4 части:
Рисунок 5.
Итак, в результате деления мы получили наши разделы, каждый из которых
равен одной синей ячейке. В конечном счете целое дерево будет разделено. Так,
чтобы создать quadtree, вы делите один раздел на четыре, потом полученный один
из четырех разделов делим еще на четыре и так далее, пока величина раздела не
достигнет некой заданной величины. Этот минимальный размер, на котором должно
остановиться деление, мы задаем сами. При построении дерева мы должны
регулировать такие факторы:
1) Максимальная вложенность - уровень
разбивки (LEVEL_Splitting). Это глубина дерева, по достижению которой мы останавливаем
процесс разбивки (обычно от 8 до 16)
2) MINIMUM_WIDTH – минимальная ширина ячейки-quad, физические размеры которой зависят
от самого малого объекта на сцене. При достижении этой величины для стороны
квадрата мы также останавливаем процесс разбивки. Необходимость может
возникнуть из-за того, что два обьекта с одинаковыми AxisAlignedBoundingBox расположены друг над другом и
процесс разбивки не остановится.
3) Минимально допустимое количество
объектов, которое может содержать один quad.
При создании QuadTree и геометрическом разделении пространства сцены необходимо
учитывать все три вышеперечисленных условия.