Мои мысли и проекты

Определение тайлов для вывода

Навигация
Счетчики
Cпoнcоры

Определение тайлов для вывода

В своей первой статье я постарался набросать общее представление об организации данных в 3D карте. На рисунке, приведенном ниже, я привел пример вывода тайлов.

Вы видите карту, разбитую на тайлы с помошью QuadTree (однако теоретически тайл может разбиваться и не по QuadTree, а по каким-то другим алгоритмам. Главное, чтобы каждый дочерний тайл имел форму прямоугольника).
L0 - это вся карта, т.е. тайл верхнего уровня
L1 - это дочерние тайлы, из которых состоит тайл L0
L2 - это дочерние тайлы, из которых состоит тайл L1
L3 - это дочерние тайлы, из которых состоит тайл L2
L4 - это дочерние тайлы, из которых состоит тайл L3

Уровней может быть больше, но для развития моей мысли этого не требуется, так что ограничимся этими уровнями. Точка A - это точка положения взгляда камеры. Красным цветом нарисована пирамида видимости камеры (frustum), спроецированная на плоскость тайлов. На рисунке я закрасил все видимые тайлы. Из рисунка видно, что нужно вывести 8 тайлов уровня L4, 8 тайлов уровня L3 и 7 тайлов уровня L2.
Я не буду расписывать поверку попадания прямоугольника в пирамиду видимости камеры, так как это достаточно простая задача. Однако, есть ещё одна важная функция, связанная с выводом.
К примеру у нас тайл размером 1x1 км и камера висит на высоте 1 км. Если разбивать этот тайл на части с помощью QuadTree, то тайл 13-го уровня будет иметь размеры около 12 сантиметров. Однако для наблюдателя, который смотрит из точки расположения камеры (которая, напоминаю, находится на высоте 1 км) вывод тайла таких размеров будет совершенно ненужным, так как всё-равно наблюдатель ничего не сможет рассмотреть. Так что нужно определиться: каким образом определять, что вывод более детальных тайлов совершенно не нужен?
Мое решение сводится к следующему:
  1. Определяю расстояние от точки взгляда камеры до каждого тайла (для простоты можно брать расстояние до центра тайла)
  2. Определяю коэффициент K = <расстояние до тайла> / <длинна диагонали тайла>
  3. Если коэффициент K больше определенного порогового значения, то значит выводить более детальный тайл не нужно.

При этом пороговое значение коэффициента можно менять в зависимости от железа пользователя. Если вывод "тормозит", то можно изменить этот коэффициент так, чтобы выводились более крупные тайлы. Это уменьшит количество выводимых тайлов и ускорит работу.

Категории: OSM 3D