Lod ландшафта что такое

Lod ландшафта что такое

Докуметация Cтарт Статьи Форум Лента Вход

jMonkeyEngine 3 урок (10) — Hello Terrain

Одним из способов создания 3D-ландшафта является лепка огромной модели местности. Это дает вам много свободы творчества — но визуализация такой огромный модели может быть довольно медленной. В этом руководстве объясняется, как создавать участки местности которые быстро рендерятся, с помощью карты высот(heightmaps), и как использовать texture splatting(метод комбинирования разных текстур), чтобы местность хорошо выглядела.

Пример кода

Когда вы запустите этот пример вы должны увидеть пейзаж с коричневыми горами, траву на равнинах, а также дорогу между ними.

Что такое карта высот(Heightmap)?

Карта высот(Heightmap) — это эффективный способ представления формы холмистого ландшафта. Не каждый пиксель ландшафта сохраняется, вместо этого, используется сетка из выборочных значений для обозначения высоты рельефа в определенных точках. Высота между выборочными значениями интерполируется.

В Java, карта высот является float массивом, содержащим значения высоты между 0f и 255f. Вот очень простой пример ландшафта, генерируемого из карты высот с количеством значений высот 5×5=25.

Важные вещи на заметку:

  • Низкие значения (например, 0 или 50) являются долины.
  • Высокие значения (например, 200, 255) являются холмами.
  • Карта высот задает лишь несколько точек, а движок интерполирует остальное. Интерполяция является более эффективной, чем создание модели с несколькими миллионами вершин.

При взгляде на типы данных Java для хранения массива из значений от 0 до 255, на ум приходит изображение. Сохранение значений высоты ландшафтом, в качестве изображение из градаций серого, имеет одно большое преимущество: Такой результат является очень удобным, и похожим на топографическую, карта:

  • Низкие значения (например, 0 или 50) являются темно-серым — это долины.
  • Высокие значения (например, 200, 255) являются светло серым — это холмы.

Посмотрите на следующий скриншот: В левом верхнем углу вы видите изображение размером 128×128 в градациях (карта высот), которое использовалось в качестве основы для создания изображения местности. Для того, чтобы холмистая форма поверхности была лучше видна, горные вершины окрашены в белый цвет, долины — коричневый, а участки между ними зеленым:

В реальной игре, вы будете хотеть использовать более сложные и более гладкие местности, чем простые карты высот, показанные здесь. Как правило, карты высот имеют квадратные размеры 512×512 или 1024×1024, и содержат от сотни тысяч, до 1 миллиона значений высоты. Независимо от того, какой размер, концепция является такой же, как описано здесь.

Взглянем на код карты высот

Первый шаг создания ландшафта является карта высот. Вы можете создать её самостоятельно в любом стандартном графическом приложении. Убедитесь, что она будет обладать следующими свойствами:

  1. Размер должен быть квадратным, и при этом степенью двойки.
    • Примеры: 128×128, 256×256, 512×512, 1024×1024&
  2. Цветовой режим должен быть 255 оттенков серого.
    • Не задавайте цветное изображение, оно будет интерпретировано как оттенки серого цвета, с, возможными, странными результатами.
  3. Сохраните картинку как .jpg или .png файл изображения.

Файл mountains512.png , что вы видите здесь, является типичным примером изображения карты высот.

Вот как вы создаёте объект heightmap в вашем коде jME:

  1. Создайте объект типа Texture .
  2. Загрузите подготовленное изображение карты высот в объект типа Texture .
  3. Создать AbstractHeightmap объект из ImageBasedHeightMap .
    Для это потребует изображения из объекта типа Texture JME.
  4. Загрузите карту высот.

Что такое Texture Splatting?

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

Texture splatting позволяет создать пользовательский материал, и «рисовать» текстурами на нем, как «кистью». Это очень удобно для ландшафтов: Как вы видите в приведённом здесь примере, вы можете разрисовать текстурой травы долины, текстурой грязи горы, и нарисовать дороги любых размеров между ними.

Splat textures основаны на материале Terrain.j3md . Если вы откроете файл Terrain.j3md , и посмотрите в разделе параметров материала, вы увидите, что у вас есть несколько текстурных слоев для рисования: Tex1 , Tex2 , Tex3 и.т.д.

Читайте также:  Конструкция теплицы с обогревом

Прежде чем начать рисовать, вы должны принять несколько решений:

  1. Выберите три текстуры. Например, grass.jpg , dirt.jpg и road.jpg .
  2. Вы «нарисуете» три текстурных слоя, используете три цвета: красный, синий и зеленый. Вы можете произвольно выбрать, что …
    1. Красный — это трава — красный слой это Tex1 , поэтому текстура травы в Tex1 .
    2. Зеленый — это грязь — зеленый слой это Tex2 , поэтому текстура грязи в Tex2 .
    3. Синий — это дороги — синий слой это Tex3 , поэтому текстура дороги в Tex3 .

Теперь вы начинаете рисовать текстуру:

  1. Сделайте копию вашей карты высот местности, mountains512.png . Использование её, будет вам полезно тем что вы будете лучше знать форму поверхности ландшафта.
  2. Назовите вашу копию alphamap.png .
  3. Откройте alphamap.png в графическом редакторе и переключитесь на режим цветного изображения.
    1. Закрасьте черные долины красным — это будет трава.
    2. Закрасьте белые холмы зеленым — это будет грязь гор.
    3. Закрасьте синими линиями, те места где вы хотите, чтобы на ландшафте пролегали дороги.
  4. Конечный результат должен выглядеть примерно так:

Взглянем на код текстурирования

Как обычно, вы создаете объект типа Material . Основанный на Описании Материала(Material Definition) Terrain.j3md , который включен в фреймворк jME3.

Загрузите четыре текстуры в этот материал. Первый из них, Alpha , это alphamap , которую вы только что создали.

Три другие текстуры это слои, которые вы ранее нарисовали: трава, грязь, и дороги. Вы создаете объекты текстуры и загружаете три текстуры, как обычно. Обратите внимание, как вы назначаете их соответствующим текстурным слоям (Tex1, Tex2 и Tex3) внутри Материала!

Масштаб конкретной текстуры (например, mat_terrain.setFloat(«Tex3Scale», 128f); ) зависит от размера используемых вами текстур.

  • Вы можете сказать, что вы выбрали слишком маленький масштаб, если, вдруг ваши дорожные плитки появляются как крошечные песчинки.
  • Вы можете сказать, вы выбрали слишком большой масштаб, если, например, маленькие травинки выглядят как целые ветви.
  • Используйте setWrap(WrapMode.Repeat) , чтобы заполнять большую области небольшими текстурами которые будут многократно повторятся. Если повторение слишком заметно, попробуйте отрегулировать значение Tex*Scale .

    Что такое Ландшафт(Местность)?

    Генерируемая сетка(mesh) ландшафта внутри разбивается на плитки(tiles) и блоки(blocks). Это оптимизация, упрощающая отсечение. Вам не стоит слишком беспокоиться о «плитках» и «блоках» просто используйте рекомендованные значения которое на данный момент — 64 хорошее для начала.

    Предположим, что вы хотите создать местность 512×512. Вы уже создали объект карты высот. Вот шаги, которые вы выполняете каждый раз, когда создаете новый ландшафт.

    Создайте TerrainQuad (Квадрант Ландшафта) со следующими аргументами:

    1. Задайте название: например, my terrain .
    2. Задайте размер плитки: Вы хотите плитки местность размером 64×64, значит вы зададите 64+1=65.
      • В целом, 64 является хорошим начальным значением для плиток местности.
    3. Задайте размер блока: Так как вы подготовили карту высот размером 512×512, вы зададите 512+1=513.
      • Если вы укажете размер блока в карте высот размером 2x (1024+1=1025), вы получите боле растянутый, более широкий, и плоский рельеф местности.
      • Если вы укажите размер блока 1/2 размера карты высот (256+1=257), вы получите меньшую размером, и более точную местность.
    4. Задайте объект, карту высоты 512×512, как она создана.

    Взглянем на код местности

    Вы создаете объект terrain .

    1. Не забудьте применить созданный материал:
    2. Не забудьте прикрепить местность к rootNode .
    3. При необходимости, масштабируйте и перемещайте объект Ландшафт, так же как и любой другой Spatial.

    Что такое LOD (уровень детализации)?

    JME3 включает в себя оптимизацию, которая регулирует уровень детализации (LOD) ландшафта в зависимости от того, насколько близко или далеко участок ландшафта находится от камера.

    Близкие участки ландшафта визуализируются полностью. Части ландшафта что расположенные в отдалении от камеры в любом случае видны хуже, и JME3 повышает производительность, делает их менее детализированными. Таким образом, вы можете себе позволить загружать огромные территории без серьезных тормозов, вызванных деталями ландшафта что все равно не видны или видны плохо.

    Упражнения

    Упражнение 1: Текстурные слои

    Что произойдет, если поменять местами два слоя, например Tex1 и Tex2?

    Как можете увидеть, легче поменять местами слои в коде, чем изменить цвета в alphamap.

    Упражнение 2: Случайный Ландшафт

    Следующие три строчки генерируют объект heightmap на основе вашего пользовательского изображения:

    Вместо этого, вы так же можете позволить JME3 генерировать случайный ландшафт для вас:

    1. Какой результат вы получите, когда вы замените вышеуказанные три строки с heightmap на эти строки, и запустите образец?
    2. Измените один параметр, за раз и снова запускайте образец. Обратите внимание на различия. Можете ли вы выяснить, какие из значений влияют на генерируемый Ландшафт (смотреть также javadoc)?
      • Какое значение управляет размером?
        • Что произойдет, если размер не квадратное число +1?
      • Какое значение управляет количеством генерируемых холмов?
      • Какие значения контролируют размер и крутизну холмов?
        • Что произойдет, если минимальные будут больше, чем или равны максимальным?
        • Что произойдет, если как минимум так и максимум малые значения (например, 10/20)?
        • Что произойдет, если как минимальное так и максимальное большие значения очень большие (например, 1000/1500)?
        • Что произойдет, если минимальные и максимальные значения очень близки (например. 1000/1001, 20/21)? Очень далеки друг от друга (например, 10/1000)?

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

    Упражнение 3: Твердая местность

    Можете ли вы объединить то, что вы узнали здесь и в Hello Collision, и сделать рельеф местности твердым?

    Вывод

    Вы научились создавать ландшафты местность, которые являются более эффективными, чем загрузка одной гигантской модели. Вы знаете, как генерировать случайные карты высот, или создавать их вручную. Вы можете добавить control LOD для ускорения рендерига больших территорий. Вы знаете, как вы можете применить, то что вы узнали об обнаружении столкновения, чтобы сделать рельеф местности твердым для игрока с физикой. Вы также можете текстурировать ландшафт «как босс», используя слоистые материалы и texture splatting. Вы знаете, что jMonkeyEngine SDK предоставляет TerrainEditor, который помогает справиться с большинством из этих задач вручную.

    Вы хотите услышать как ваши игроки говорят «ой!», когда они врезаются в стену или падают с горы? Тогда продолжите обучение, как добавить звук в вашу игру.

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

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

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

    Для отправки комментария вам необходимо авторизоваться.

    Источник статьи: http://www.jmonkeyengine.ru/wiki/jme3/beginner/hello_terrain

    LOD Мира

    Введение

    Диалоговое окно World LOD используется для генерации LOD ландшафта и LOD геометрии строений для мира.

    Поля данных и Кнопки

    • Worldspace list: Список всех мировых пространств.
    • Worldspace Stats: Имя в редакторе, имя в игре, ID формы, количество «кусков» LOD ландшафта и количество ячеек.
    • Generate Terrain Meshes: Создает сетку ландшафта для мира основываясь на локальной геометрии земли.
    • Generate Terrain Texture: Создает текстуры и карты нормалей для LOD ландшафта, так же отталкиваясь от локальных данных земли.
    • Chop Terrain Texture: Позволяет вам воспользоваться нарисованной вручную текстурой размером до 8192х8192 вместо построения текстуры LOD ландшафта.
    • Combine Generated and Handpainted Terrain Textures (Комбинировать сгенерированную текстуру и текстуру созданную вручную):
    • Generate Objects: Создает LOD геометрию и карты текстур для всех объектов-ссылок в мире, которые обозначены как видимые на расстоянии.
    • Generate Trees (Генерация деревьев)

    Примечания

    Terrain Mesh Generation (Генерация Сетки Ландшафта)

    • Время, которое тратит GECK на генерацию LOD сетки напрямую зависит от количества «кусков» земли, которые нужно генерировать, которые в свою очередь зависят от количества ячеек в вашем пространстве мира. Для маленьких миров (до двадцати «кусков») может потребоваться всего пару минут; для больших пространств (20-50 кусков) времени может потребоваться 30-60 минут; для пространств в которых больше 50-ти кусков в основном тратиться несколько часов. Для генерации всей карты высот, созданной в редакторе карты высот (примерно 1300 кусков) потребуется 2-3 недели генерации в безостановочном режиме.
    • Во время процесса генерации сетки, может показаться, что GECK завис. В некоторых случаях, это может быть правдой; в большинстве же случаев он продолжает генерировать новую сетку и только выглядит недоступным. (Вы можете проверить состояние GECK в диспетчере задач, наблюдая за тем, использует GECK какие-либо системные ресурсы или нет. При генерации LOD сам GECK может использовать до 100% ресурсов вашей системы). Если во время LOD генерации GECK завис или вылетел на рабочий стол, запустите его еще раз и повторите процесс. Вся сгенерированная LOD сетка будет сохраняться из предыдущего сеанса программы и редактор продолжит процесс с места, в котором остановился.

    Terrain Texture Generation (Генерация текстур ландшафта)

    • В настоящий момент, вся функциональность создания текстур, вначале создает исходные TGA текстуры, которые после этого нуждаются в проходе через процесс построения GECK, чтобы в итоге, стать видимыми в игре. Когда генерация LOD тек-стур будет закончена, вы найдете сгенерированные LOD текстуры в формате DDS за пределами директории Fallout3 в папке Source(Источник)\Textures TGA\landscape\LOD\(папка с названием вашего мира).
    • Для того чтобы игра обнаружила ваши сгенерированные текстуры, вы должны скопировать эту папку и поместить ее в Data\Textures\Landscape\LOD\папка. Папку Diffuse вы можете удалить, а название папки DiffuseGenerated поменять на Diffuse или скопировать файлы из папки DiffuseGenerated в папку Diffuse. (Игра будет искать текстуры в папке Diffuse, но GECK по умолчанию не помещает эти текстуры в нужную папку — (Часто складывается впечатление, что GECK делали одни чуваки, а игру другие. прим. Vel)).

    LOD Object Generation (Генерация LOD объектов)

    • Для генерации LOD объектов, вы должны обеспечить GECK необходимыми сетками LOD и текстурами.
    • Сетки LOD обычно находятся в той же папке, где и оригинальные, но с окончанием «_lod.nif». Если вы еще этого не сделали, извлеките эти файлы из вашего сетки.bsa и разместите из в нужной папке. (Вообще-то, LOD сетка будет только у тех объектов, у которых установлен флаг Visible When Distant — Видимый на расстоянии).
    • LOD текстуры можно получить двумя способами: открыв LOD сетку в NifSkope и, раскрыв NiTiStrips найти BSShaderTextureSet (список текстур вы увидите в окне Block Details возле иконок фиолетовых цветков), или запустить процесс Generate Object и записав пропущенные текстуры, которые будут перечислены в окне с предупреждением. (После размещения всех необходимых текстур, вам придется перезапустить эту команду для генерации объектов). Вам нужно будет извлечь из архива и Diffuse карту и Normal карту, конвертировав их после этого в формат TGA, нужный для процесса генерации (смотрите ниже).
    • Все текстуры для LOD объектов должны быть в формате TGA, иначе редактор не сможет их обработать. Для конвертирования ваших текстур DDS в формат TGA от-крой их в программе редактора изображений, например в Irfanviewor, в GIMP и выберите команду «Save as» TGA. (Настройки по умолчанию появляются при работе с GIMP).
    • Конвертированные текстуры TGA должны быть помещены в папку Source\Textures TGA\папка, использующая такую же структуру папок, которую использует игра. Например, если ваши текстуры находятся в папке Data\Textures\architecture\urban\, файлы TGA должны быть размещены в папке Source\Textures TGA\architecture\urban. (Папка Source\Textures TGA\ размещается за пределами директории игры Fallout3 в главной папке Bethesda Softworks).
    • После того как ваши текстуры будут извлечены и конвертированы, запустите команду Generate Objects. Редактор поместит сгенерированные текстуры в вашу папку Source\Textures TGA\landscape\LOD\(папка_по_названию_вашего_мира). Скопируйте сгенерированные текстуры в соответствующую папку Data\Textures\Landscape\LOD\папка. (Если вы забудете о необходимости помещать здесь текстуры сгенерированных объектов, эти объекты в игре будут визуализироваться фиолетовым цветом).

    LOD деревья

    • Мир столичной пустоши находится на высоте примерно 10500 по оси Z. Новый мир вы всегда должны создавать на высоте больше этой координаты; как минимум на 3000 выше, чем 10500 по оси Z. Иначе, при изменении мира, вы можете получить плавающие в воздухе или находящиеся под землей деревья (LOD).

    LOD вода

    • LOD генерируется только для ландшафта, находящегося выше уровня воды. Если с другой стороны большой массы воды нет LOD ландшафта, под водой будет видно небо, а морское дно будет заканчиваться на краю области видимости. Также воз-можно появление видимого шва между плоскостью воды и LOD водой. По этим причинам, большие пространства воды лучше заканчивать видимой землей.
    • Помните еще и о том, что при создании LOD для мира с авто-водой, иногда вы можете получить большие «дыры» в поверхности LOD воды, которые совсем не просто устранить.
    • Проверяйте соответствие вашей LOD воды с типом воды вашего пространства мира, чтобы избежать неприятных различий в месте соединения плоскости воды и LOD воды. Тип воды и тип LOD воды устанавливаются в диалоговом окне World Spaces.

    Регенерация данных LOD

    • Перед повторным созданием LOD данных для пространства мира, важно удалить все существующие данные из папки lod. Команда генерации LOD не будет регенерировать существующие блоки LOD: эти блоки должны быть удалены из папки LOD вашего мира, чтобы редактор смог их регенерировать. Если вы изменили количество ячеек в своем мире (увеличив их), забыв удалить эти файлы приведет к тому, что в результате LOD будет выдавать ошибки в вашем моде. (Это справедливо для сетки ландшафта и не всегда относится к другим типам LOD генерации. Для выяснения требуется дополнительное тестирование).
    • LOD информация сохраняется в следующих папках:
      • data\meshes\landscape\lod\ваш_мир\ в котором находятся все сетки ландшафта и до двух подпапок: соответственно для блоков и деревьев LOD объектов и LOD деревьев.
      • data\textures\landscape\lod\ваш_мир\ в котором находится диффузный блок, сгенерированный диффузный (если вы не конвертировали его в папку диффузного блока), блок нормалей и возможно, блоки для LOD объектов.
      • data\LODSettings (удаляйте только те файлы, которые относятся к вашему миру).
      • source\textures TG\landscape\lod\ваш_мир\ в котором находятся все сгенерированные текстуры ландшафта, объектов и деревьев, которые вам нужно переместить или скопировать в вашу папку с текстурами для первого прохода генерации. Папка источника находится в вашей главной папке Bethesda Softworks.

    Источник статьи: http://bethplanet.ru/fallout-new-vegas/articles/geck/world-lod

    Читайте также:  Норма полива для сотки огорода
    Оцените статью