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

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

Опубликованно: 24.06.2017, 14:20
Последняя редакция, Andry: 24.06.2017 16:50
Осуждаемый. Посмотрите на 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 HeightMaps (темно синий) в качестве четырех суб-квадрантов. Это означает, что ландшафт размером 513 будет использовать 257 плиток. Кроме того, LRUCache встроен в пакет terrain, поэтому окружающие плитки (зеленый) можно предварительно кэшировать в другом потоке, уменьшая время загрузки. Квадраты обновляются, когда камера приближается к границе синей секции.

Обоснование

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

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

Применение

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


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

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

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