LOD (уровень детализации) означает управление объектами в разных масштабах отображения, которые можно разделить на две части. Однако вы можете использовать один из них, и этого будет достаточно для большинства случаев.
Показать / скрыть слои (группы объектов одного типа) в зависимости от величины (масштаб отображения).
Метод, основанный на алгебраической геометрии, называется обобщением (это алгоритм для упрощения многоугольников). посмотрите на следующую картинку
Самый известный и эффективный метод обобщения (упрощения) многоугольной сетки известен как теорема Декарта-Эйлера (уравнение 4.5, извините, если я ссылаюсь на книгу, это было лучше, чем я могу сделать) и используется большинством пространственных баз данных. например модули PostGIS в PostgreSQL. Он просто удаляет меньшие стороны многоугольника и делает его очень округлым (рисунок выше).
Чтобы внедрить LOD в игру, вам нужно сохранять и управлять масштабом вашей карты (сцены) во время операций увеличения / уменьшения масштаба. Масштаб изменяется от нуля до бесконечности, и вы должны разделить это на определенное количество диапазонов, например что-то вроде этого:
- 1 / ноль = бесконечность до 1/50
- 1/50 до 1/100
- 1/100 до 1/1000
- 1/1000 до 1 / бесконечность = 0
Затем вам нужно определить, какие типы ваших объектов (слоев) должны быть видимыми или невидимыми в каждом из указанных диапазонов. Например, небольшой тип объекта, такой как клапан гидранта, не должен быть виден, когда пользователь находится в четвертом диапазоне, потому что он будет очень маленьким в этом масштабе и не может быть различим, поэтому не имеет значения, пропустите ли вы рисование на экран.
Поэтому, когда пользователь использует увеличение и уменьшение масштаба для изменения увеличения, он перемещается через вышеуказанные пределы от одного диапазона к другому, и ваша игра использует эти шкалы отображения для управления уровнем детализации, показывая или скрывая объекты на сцене. Это делает дискретное решение, что объекты внезапно исчезают во время вашей операции уменьшения масштаба, однако, если масштаб отображения и диапазоны увеличения определены тщательно, пользователь ничего не почувствует.
Вышеприведенная группа из 4 диапазонов является лишь примером, и вам нужно найти лучшее для вашего случая методом проб и ошибок. Для этого нет правила.
Иногда игры используют свои собственные методы LOD, Subway Surfer на мгновение, показывает маленький прямоугольник без текстуры, чтобы показать здание на большом расстоянии, и, когда он приближается внезапно, он получает текстуру, геймер чувствует это. Вы не говорили о своей проекционной системе, которая очень важна, и не говорили о том, какую игру вы создаете.
Однако предположим, что вы реализуете полную трехмерную игру с openGl и хотите отфильтровать некоторые сетки перед их переносом на графическое оборудование, и я уверен, что это поможет вам сократить операции связывания / открепления с буферными объектами и массивами вершин (VBO, VAO), пока дело с OpenGl.
Использование только управления слоями или просто реализация обобщения Эйлера
В большинстве случаев нет необходимости реализовывать алгоритм обобщения, а фильтрация объектов просто работает и обеспечивает необходимую вам эффективность (частоту обновления), однако она полностью зависит от случая к случаю. Хотя это простой алгоритм, который просто удаляет маленькие стороны многоугольника, вам нужно определить порог, который является произведением величины и постоянного числа, чтобы большие стороны фильтровались в гораздо более отдаленной точке зрения.
Создание простейшего слоя управления и реализация только алгоритма обобщения Эйлера обеспечивает очень аккуратный и непрерывный метод, в котором вы просто проверяете каждую сторону и линии на соответствие заранее заданному порогу и показывает их только в том случае, если они достаточно велики, чтобы их можно было различить на экране.
PS: увеличение - это число с плавающей точкой> 0, которое равно 1 / шкала, а масштаб обычно <1, поскольку шкала 1: 1 означает, что в вашей игре есть длины реального мира.