Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество

Бесконечные Ландшафты

Опубликованно: 24.06.2017, 14:20
Последняя редакция, Andry: 18.09.2018 22:18
Осуждаемый. Посмотрите на https://hub.jmonkeyengine.org/t/design-question-terrain/28771.

TerrainGrid это DEPRECATED.

TerrainGrid — это расширение, созданное на основе инструментов TerraMonkey, таких как TerrainQuad и HeightMap, которые обеспечивают «Бесконечные процедуры подкачки ландшафта(infinite Terrain paging routines)».
Спасибо Gábor (@anthyon) и Brent (@sploreg) за этот вклад!

Примеры кода

Классы с исходным кодом можно найти в пакетах org.jme3.terrain.geomipmapping и org.jme3.terrain.heightmap. Также есть 3 теста, подготовленные в пакете jme3test.terrain:

  • TerrainGridTest.java: Использует экземпляр ImageBasedHeightMapGrid для загрузки фрагментов
  • TerrainFractalGridTest.java: Использует класс FractalHeightMapGrid и генерируйте ландшафт из шума
  • TerrainGridAlphaMapTest.java: Показывает, как использовать TerrainGridListener для изменения материала плиток

Спецификация

TerrainGrid состоит из класса TerrainGrid и интерфейсов HeightMapGrid и TerrainGridListener.

  • TerrainGrid является главным классом системы. Он заботится о перемещении камеры в LODUpdate, загрузке и выгрузке плиток ландшафта по требованию и уведомлений от любых зарегистрированных слушателей изменений.
  • TerrainGridListener раелизует два события для слушателей:
    • GridMoved(Vector3f): получает новый центр как параметр после обновления местности, поэтому любые объекты могут быть добавлены или удалены по мере необходимости.
    • Material tileLoaded (Material material, Vector3f cell): уведомляет систему о загрузке плитки. Параметры это клонированное значение материала, добавленного в TerrainGrid, и ячейки новой плитки. Система может изменять материал в соответствии с этой информацией (например, требуемые значения alphamap и.т.д.).

В TerrainGrid можно добавить несколько слушателей, они будут вызываться в порядке добавления, поэтому можно внести несколько изменений в Материал до завершения загрузки плитки.

HeightMapGrid добавляет возможность загрузки плиток рельефа по требованию вместо простого массива высоты. Не существует предопределенного способа хранения этих фрагментов, он заботится только о загрузке одного объекта HeightMap в определенное место за раз.

Мотивация

После того как поиграешься с ландшафтом в jME3, в скорее появляется необходимость в том чтобы иметь более крупные участки земли. Увеличение размера одного TerrainQuad приводит к большему использованию памяти, и при этом по-прежнему мир будет не так уж и велик. Именно по этому и был разработан TerrainGrid. Он расширяет класс TerraindQuad и использует 4 HeightMap-а (темно синий) в качестве четырех под-квадрантов. Это означает, что ландшафт размером 513 будет использовать 257 плиток. Кроме того, LRUCache встроен в пакет terrain, поэтому окружающие плитки (зеленый) можно предварительно кэшировать в другом потоке, уменьшая время загрузки. Квадранты обновляются, когда камера приближается к границе синей секции.

Обоснование

Дизайн системы TerrainGrid выбирался достаточно тщательно, так что требуется минимальное усилие для переключения с предыдущих применений TerrainQuad. Он имеет те же конструкторы с небольшим исключением, в том что, вместо массива heightmap требуется экземпляр HeightMapGrid. Все остальные параметры перенаправляются в базовую систему TerrainQuad. Существуют также две основные реализации HeightMapGrid:

  • ImageBasedHeightMapGrid: использует последовательно пронумерованные, 16-разрядные серые карты высот. Название физического файла этих файлов может быть сгенерировано через интерфейс Namer. Когда плитка не может быть найдена с помощью agentManager, создается пустая (all-zero) heightmap и добавляется предупреждение в журнал.
  • FractalHeightMapGrid: использует библиотеку шума для создания пейзажа «на лету». Форма местности может контролироваться различными параметрами и постфильтрами фракталов. С помощью этой реализации в виде клеток(grid) нет ограничений — превышение пределов точности float — как далеко может добраться камера. Плитки, сгенерированные таким образом, могут быть кэшированы в файловую систему для последующей модификации. FractalHeightMapGrid всегда будет загружаться из кеша, если там есть плитка!

Применение

  1. Создайте экземпляр объекта TerrainGrid
  2. Задайте материал, слушателей, преобразований, масштаб и.т.д.
  3. Добавить экземпляр LODControl к объекту
  4. Вызовите инициализацию с данными местоположения камеры
  5. (Необязательно) добавьте его в physicsSpace, как и TerrainQuad
  6. Более подробную информацию о местности и TerrainQuad можно найти в вики:


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

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

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