Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Уровень деталей(LOD)(Level of Detail) Оптимизация

Уровень деталей(LOD)(Level of Detail) Оптимизация

Опубликованно: 09.05.2017, 14:39
Последняя редакция, Andry: 29.09.2017 15:54

Сетка с высоким уровнем детализации имеет много полигонов и хорошо выглядит крупным планом. Но когда сетка находится дальше (и детальность уже не видна), высока полигональность замедляет работу без необходимости.

Одним из решений этой проблемы является использование высокодетализированных сеток для объектов, находящихся рядом с камерой, и малодетализированных сеток для объектов, удаленных от камеры. Когда игрок перемещается по сцене, вы должны продолжать заменять близкие объекты более подробными сетками, а далекие объекты — менее детализированными сетками. Цель — сохранить на переднем плане мало высококачественных объектов медленного рендеринга и множество низкокачественных объектов быстрой рендеринга в фоновом режиме. (Опытные пользователи могут сравнить этот подход с системой территорий JME TerraMonkey, которая внутренне использует специализированный алгоритм GeoMipMapping для генерирования уровней детализации местности).

Теперь вы видите, почему вам может понадобиться автоматическая генерация уровней детализации для сложных геометрий. JME3 поддерживает Java-реализацию генератора LOD генератора Ogre (изначально Péter Szücs и Stan Melax): вы используете jme3tools.optimize.LodGenerator в сочетании с com.jme3.scene.control.LodControl.

Для демонстрации запустите TestLodGeneration.java из JmeTests, затем нажимайте +/- и пробел, чтобы поэкспериментировать. На следующих скриншотах показана модель обезьян с тремя уровнями уменьшения детализации:

jmonkey-lod

Применение

Чтобы активировать эту оптимизацию:

  1. Выберите метод Reduction и значения для геометрии. (Методом проб и ошибок…)
  2. Сгенерируйте LOD для геометрии, либо в SDK, либо в коде.
  3. Добавьте в геометрию элемент control LOD.

Выбрать Методы Reduction и Значение

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

Методы Reduction Описание Значения Reduction 
LodGenerator.TriangleReductionMethod.COLLAPSE_COST Удаляет вершины многоугольника из сетки до тех пор, пока результат сокращения ( = вызовет неестественные искажения) не превысит заданное пороговое значение 0.0f — 1.0f 
LodGenerator.TriangleReductionMethod.PROPORTIONAL Удаляет заданный процент полигонов из сетки. 0.0f — 1.0f 
LodGenerator.TriangleReductionMethod.CONSTANT Удаляет заданное количество полигонов из сетки. integer 

Если вы не знаете, что выбрать, поэкспериментируйте. Например, для начала попробуйте COLLAPSE_COST и .5f-.9f.

Генерировать LOD

Вы должны генерировать и кэшировать несколько уровней детализации(LOD) для каждой сетки, от многих до нескольких полигонов. Алгоритм генератора LOD пытается автоматически сжимать вершины, избегая при этом уродования объектов. Генератор LOD не генерирует новые сетки, он только генерирует отдельные уменьшенные буфера индекса для более сильных пониженных уровней.

  • Если вы создаете геометрию вручную (3D-модели), используйте SDK для генерации LOD.
  • Если вы создаете геометрии программно, сгенерируйте LOD из вашего Java-кода.

Генерирование LOD в SDK

SDK содержит удобный для пользователя интерфейс для генерации LOD для модели (.j3o-файл).

  1. Откройте окно Проекты или Файлы.
  2. Выберите .j3o файл в папке Project Assets ▸ Models.
  3. Выберите Окно ▸ SceneExplorer, если SceneExplorer еще не был открыт. Информация о выбранной модели теперь отображается в SceneExplorer.
  4. Щелкните [ПК мыши] модель в SceneExplorer. Выберите меню Tools ▸ Generate Levels of Detail. jme-sdk-generate-lod-menu
  5. Откроется мастер настройки Generate LOD:
    jme-sdk-generate-lod-window
  6. Выберите reduction method и reduction values для одного или нескольких уровней.
    Введите более высокие reduction values для более высоких уровней.
  7. Нажмите [Finish], чтобы сгенерировать LOD для этой модели.

LOD сохраняются в файле модели .j3o.

Выберите Окно ▸ Свойства, если окно Свойства не открывается. Выберите сгенерированные LOD из раскрывающегося списка в окне Свойства и проверьте их качество в SceneComposer.

jme-sdk-generate-lod-full

Генерирование LOD в коде

Утилита jme3tools.optimize.LodGenerator помогает программно генерировать LOD для произвольной сетки (объекта Geometry) из вашего кода Java. Вы создаете и выпекаете один LodGenerator для каждой геометрии.

LodGenerator lod = new LodGenerator(geometry);
lod.bakeLods(reductionMethod,reductionValue);

LOD хранятся внутри объекта Geometry.

Пример: как сгенерировать LOD сетки myPrettyGeo с на 50% меньшим количеством полигонов:

LodGenerator lod = new LodGenerator(myPrettyGeo);
lod.bakeLods(LodGenerator.TriangleReductionMethod.PROPORTIONAL,0.5f);

Активируйте элемент управления LOD

После генерирования LOD для геометрии, вы создаете и добавляете com.jme3.scene.control.LodControl к геометрии. Добавление LodControl активирует оптимизацию LOD для этой геометрии.

LodControl lc = new LodControl();
myPrettyGeo.addControl(lc);
rootNode.attachChild(myPrettyGeo);

Чтобы вычислить расстояние до геометрии LodControl получает информацию от камеры, то есть из экрана игрового вида игры. В зависимости от расстояния, LodControl выбирает соответствующий уровень детализации и передает более (или менее) подробные вариант данных вершин в средство визуализации.

Влияние на качество и скорость

Номер уровня  Цель Расстояние Скорость визуализации Качество визуализации
“Level 0  Первоначальная сетка используется этот уровень по умолчанию автоматически для крупных планов, если LOD не были сгенерированны. Ближайшее Медленная Наилучшая
“Level 1
“Level 2
“Level 3
… 
Если вы сгенерировали LOD, JME3 использует их автоматически в фоновом режиме, как только объект движется. Чем выше уровень,
тем дальше.
Чем выше уровень,
тем быстрее.
Чем выше уровень,
Тем ниже качество.

Смотрите также


Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.