- Ландшафт шаг за шагом.
- Создание игрового ландшафта. Процесс и тонкости.
- 1. Знакомство с интерфейсом
- 2. Добавление своих кистей
- 3. Создание нового мира
- 4. Пример — создание острова.
- Шаг первый. Создание формы острова.
- Шаг второй. Работа над рельефом.
- Шаг третий. Текстурирование.
- Шаг четвертый. Объекты и слои.
- 5. Экспорт карты.
Ландшафт шаг за шагом.
Автор: Серба Андрей
Этот туториал охватывает азы техники создания ландшафтов. Я рассмотрю карту высот, простейший алгоритм визуализации, раскраску (текстурирование) ландшафта, а так же оптимизацию на уровне OpenGL. Что касается примеров, я считаю, что если размер примера (не считая инициализации OpenGL и т.п.) больше 8-10 Кб то это что угодно, но только не пример. Поэтому я старался следовать этому принципу.
Представление ландшафта, карта высот.
Для представления ландшафта мы будем использовать карту высот.
Карта высот — это двумерный массив значений высот ландшафта, взятых с определенным интервалом. Т.е. мы каждому дискретному значению Х и Y в горизонтальной плоскости сопоставляем высоту.
массив
Графическое представление массива
Создать карту высот можно с помощью графического редактора (прекрасно подойдет Photoshop) или с помощью программ специально для этого предназначенных, например TerraGen. Для создания карты высот в Photoshop’е необходимо выполнить фильтр Clouds, а затем несколько раз фильтр Different clouds. И сохранить полученную картинку как Grayscale файл в формате RAW (в принципе можно использовать другой формат, но об этом поговорим позже). Размер карты может быть произвольный, но удобней использовать квадратную, с размером стороны кратным числу степени двойки: 128х128, 256х256 и т.д.
Будем считать, что на представленных примерах светлые области представляют собой возвышения, соответственно темные — низменность.
|
TerraGen |
Итак, начнем. Как известно, любая поверхность может быть достаточно точно представлена треугольниками. Поэтому любые четыре расположенные рядом точки карты высот задают прямоугольник, который мы разбиваем на два треугольника и рисуем.
В примере ландшафт реализован в виде класса Terrain. Приведенный ниже кусочек кода — часть функции Terrain::RenderLandscape() демонстрирует простейшую реализацию процедуры рисования.
Пример (40 кБ)
Раскраска (текстурирование) ландшафта.
Я расскажу о двух способах закраски ландшафта (и во втором случае текстурирования). Это очень краткое объяснение, не затрагивающее множество аспектов, таких как мультитекстурирование, блендинг нескольких текстур, и т.п. Обо всем этом я напишу отдельную статью.
Способ первый — интерполяция цветов.
Первый способ раскраски ландшафта состоит в использовании интерполяции цветов. Что такое интерполяция цветов, наверное, знает каждый, но если кто-то не знает, краткий пример. Например, если, рисуя треугольник, каждой вершине задать разный цвет, получим картину изображенную ниже. При этом OpenGL сам выполнит интерполяцию, от нас только требуется включить интерполяцию, что делается просто:
ниже приведен код демонстрирующий рисование треугольника с интерполяцией цветов:
Но вернемся к ландшафту. Для раскраски нам опять понадобиться карта, я называю ее картой цветов. Данными для карты цветов служат графические файлы примерно следующего вида:
Грубо говоря, любая RGB картинка сохраненная, как Raw-файл, может быть использована в качестве карты цветов. Важно заметить, что ширина и высота этих файлов должны быть равными размеру карты высот!
Как известно в RGB режиме одна точка изображения описывается тремя байтами — значение Red, Green, Blue компоненты цвета. Таким же образом точки картинки хранятся и в Raw-файле.
Хранить карту цветов (как и карту высот) мы будем в массиве, только в карте высот одному элементу массива соответствует одно значение высоты, а в карте цветов три значения — интенсивность красной, зеленой и синей составляющей цвета. Поэтому введем следующую структуру, которая и будет элементом массива цветов:
При этом процедура рисования (я убрал рисование «проволочной» модели) претерпела минимальные изменения:
Способ второй — текстурирование.
Суть второго способа состоит в наложении на ландшафт текстуры. Для этого нам понадобится текстура, точно такая же как файл для карты цветов, только сохранить его надо как TGA файл (понятно, что выбор формата — это дело вкуса, но в приведенных мною примерах используются TGA-файлы). Я предполагаю что вы знакомы с текстурирование, и не буду описывать процесс загрузки и создания текстуры в OpenGL.
Размер текстуры, может и не соответствовать размеру карты высот. Например для карты высот 128×128 может быть выбрана текстура размером 64×64 или 512×512 точек. В последнем случае качество буде лучше. На практике достаточно выбрать размер текстуры равный размеру карты высот.
Суть метода состоит в текстурирование одной текстурой всех треугольников нашего ландшафта, рассчитывая каждому треугольнику соответствующие координаты текстуры.
Итак, прежде чем приступить к текстурированию мы должны определит шаг изменения координат текстуры. Необходимо вычислить значение 1.0/MapSize (MapSize — размер карты высот). И тогда умножая координаты x и y треугольника на этот шаг, мы получим координаты текстуры соответствующие этому треугольнику. Ниже приведен рисунок иллюстрирующий текстурирование, и пример процедуры рисования.
Если вы хотите, чтобы текстура не «растягивалась» на весь ландшафт, а соответствовала определенной его части, необходимо при вычислении шага, вместо 1 подставить нужное вам число, и текстура повториться заданное количество раз.
Шаг изменения координат текстуры объявлен как константа в Terrain.H.
const GLfloat TextureBit = 1.0f/(float)MapSize;
а измененная процедура рисования выглядит следующим образом:
Следует сказать пару слов о фильтрации текстуры. В приведенном примере используется линейная фильтрация, что намой взгляд, является оптимальным вариантом. Фильтрация ближайший сосед (GL_NEAREST) существенно ухудшает качество, в то время как мипмаппинг практически его не улучшает. Использование мипмаппинга будет иметь смысл, если размер текстуры превышает размер ландшафта хотя бы в два раза, или если текстура повторяется.
Оптимизация на уровне OpenGL.
Сразу необходимо заметить, что только оптимизация на уровне OpenGL не может решить проблему производительности в целом. Безусловно, прирост производительности будет но не всегда достаточный. OpenGL оптимизацию необходимо использовать вместе с оптимальным алгоритмом отображения ландшафта. Хотя, если размер карты не превышает 128×128, можно обойтись оптимизацией только на уровне OpenGL.
Первое, что можно сделать на уровне OpenGL, это уменьшить число вершин предаваемых на конвейеру текстурирования, для этого необходимо заменить рисование с использованием GL_TRIANGLE_STRIP на эквивалентный GL_TRIANGLE_FAN, как показано на рисунке:
|
GL_TRIANGLE_FAN |
Правда в примере, я использовал GL_TRINGLE_STRIP
Второе, использовать для отображения функцию glDrawElements. Это функция позволяет рендерить множество примитивов вызовом одной функции, тем самым уменьшая число вызовов OpenGL функций. Для того, что бы выполнить рисование с помощью функции glDrawElements необходимо выполнит три шага:
1. Активировать массивы с данными, в нашем случае массив вершин и координат текстур (аналогично можно поступить с цветами, нормалями и некоторыми другими атрибутами). Для этого необходимо воспользоваться функцией void glEnableClientState(GLenum Array), где в качестве параметра указать GL_VERTEX_ARRAY, а затем GL_TEXTURE_COORD_ARRAY.
2. Задать параметры данных и массивы для их хранения. Для задания массива и типа вершин служит функция
void glVertexPointer( GLint Size, GLenum Type, GLsizei Stride, void *Ptr )
которая определяет способ хранения и координаты вершин. При этом Size определяет число координат вершины (может быть равен 2, 3, 4), Type определяет тип данных (может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно хранить в одном массиве другие атрибуты вершины, и тогда параметр Stride задает смещение от координат одной вершины до координат следующей. Если Stride равен нулю, это значит, что координаты расположены последовательно. В параметре Ptr указывается адрес, где находятся данные.
Аналогично можно определить массив координат текстуры, используя команду
void glTexCoordPointer(GLint Size, GLenum Type, GLsizei Stride);
3. Заполнить массивы данными и выполнить отрисовку. Как уже было сказано, рисование выполняется с помощью функции
Источник статьи: http://www.gamedev.ru/articles/?id=30015
Создание игрового ландшафта. Процесс и тонкости.
Автор урока: Sirius
Проработка игрового окружения, как известно, очень важный элемент для того, чтобы ваш проект выглядел более привлекательным и интересным для игрока.
Этот урок направлен на то, чтобы ближе познакомить вас, картоделов сообщества Custom NPCs Forever, с небезызвестной программой WorldPainter, рассмотреть процесс создания собственного ландшафта и рассказать о некоторых фишках, которые помогут вам быстрее освоить эту программу и создавать уникальные миры для ваших карт.
Гайд может быть интересен как для тех, кто еще не знаком с WorldPainter, так и для опытных пользователей. Однако, как скачать и установить программу в этом уроке мы разбирать не будем, только работу в ней.
Приступим?
Для удобства урок разделен на 5 частей, так что вы можете пропустить некоторые этапы, если с ними знакомы.
▸ 1. Знакомство с интерфейсом
▸▸ 2. Добавление своих кистей
▸ 3. Создание нового мира
▸ 4. Пример — создание острова
▸ 5. Экспорт карты
1. Знакомство с интерфейсом
Итак, первое, что мы видим — множество непонятных столбиков, настроек, инструментов и сгенерированный программой участок мира. Сразу хочу отметить, это мой интерфейс и у вас он будет выглядеть иначе. Вы свободны настроить его так, как удобно вам, перетаскивая модули в нужные части экрана. Вы можете использовать мое расположение элементов, если считаете его удобным.
Также отмечу, что интерфейс программы полностью на английском.
Пройдемся по самым важным элементам интерфейса:
◆ ИНСТРУМЕНТЫ (Tools) — здесь все довольно просто и понятно, не станем здесь задерживаться надолго. Самые главные инструменты, которые мы будем использовать:
▸ Высота(Height), Выравнивание (Flatten) — для создания рельефа. Инструмента Наращивания горы (Raise Mountain) советую избегать, потому что он создает гору с самой высокой точки кисти, т.е. начинает растить с верхушки, а не целую гору.
▸ Спрей, Карандаш, Глобальные операции — для применения и редактирования слоев и текстур к нашему ландшафту.
◆ СЛОИ (Layers) — сюда же отнесу материалы (Terrain), биомы, аннотации. Слои применяются для, можно сказать, раскрашивания ландшафта — мы применяем к нему различные блоки, указываем биомы, добавляем леса, растительность и другие элементы.
◆ КИСТИ (Brushes) — название говорит за себя. В качестве кистей используются карты высот (Heightmaps), в которых чем светлее точка — тем выше высота. Далее мы рассмотрим, откуда брать и как добавлять свои кисти, помимо предлагаемых программой примитивных фигур, с которыми далеко не уедешь.
◆ НАСТРОЙКИ КИСТЕЙ (Brush settings) — настройки наших кистей. Здесь остановлюсь поподробнее, рассмотрим все элементы этого меню:
▸ Поворот кисти (Rotation) — тут все понятно. Кстати, удобно применять сокращение Alt+Колесо мыши для поворота кисти не отвлекаясь от рисования;
▸ Интенсивность (Intensity) — то, насколько сильно будет применяться кисть. Например, с низкой интенсивностью Спрей делает более рассеянное пятно, а инструмент Высота медленнее наращивает ландшафт;
▸ Внутри/изнутри выделения (Inside/outside selection) — применяется при использовании инструмента Выделения, названия говорят за себя. Может быть удобно при работе с каким-то небольшим участком карты, но при этом будьте осторожны, чтобы на границе выделения у вас не было резких переходов;
▸ Начиная на […] / заканчивая на […] (At or above / At or below) — позволяю себе вольный перевод. Первая характеристика показывает, начиная с какой высоты (координата Y) будут происходить ваши изменения. Вторая, соответственно, до какой высоты будут происходить изменения. Прилагающаяся опция Feather допускает при применении слоев немного заходить за указанные высоты, чтобы слой не обрывался резко на одной высоте, но по моему опыту, эта опция работает не должным образом, поэтому ей можно не уделять особого внимания.
▸ Только на […] / Кроме […] (Only on / Except on) — очень важная опция при наложении текстур и слоев. Здесь вы можете указать, к чему будет применяться ваш слой (или к чему НЕ будет): только к суше / воде / лаве / конкретному блоку / биому / аннотации / слою.
Соответственно, эти же элементы вы можете исключить с помощью Except on. Например, наложить биом только на блоки травы, но исключая пространство, на котором, например, другой биом.
▸Угол наложения (above / below […] degrees) — также очень важная функция, особенно незаменима при наложении камня на горы. Разбираться в том, как именно накладывается угол, не будем, иначе уйдем в геометрию. Экспериментируйте с разными значениями, чтобы добиться нужного результата.
ИТАК, мы познакомились с самыми главными элементами интерфейса, разобрав их подробно. Тяжело в учении — легко в бою, дальше будет интереснее!
2. Добавление своих кистей
Прежде, чем метнуться воздвигать горы и создавать дремучие леса, нам нужны кисти, о которых я уже говорил.
Откуда их брать? Тут все просто. Для начала советую скачать готовые наборы кистей, которые можно найти на просторах сети. Сам приведу паки, предоставленные публике господином TylerTimoJ и Evman. При этом советую не добавлять себе все подряд, а выделить основные важные кисти, вместо того, чтобы скачать сотню кистей и ими в результате не пользоваться. На практике, для создания интересного ландшафта хватает и 5 кистей. Пользоваться кистями, предназначенными для рек, или участками ландшафта с обрывающимися границами не рекомендую.
Скачали. Что дальше? Остается только добавить их.
Закрываем WorldPainter, если он вдруг открыт, и открываем директорию %AppData%/Roaming/WorldPainter/brushes
Если у вас нет папки brushes, то создайте ее. А внутри нее создайте еще одну папку, она будет отображаться как категория в кистях. У меня, на скриншоте выше, вы можете увидеть категории 1, Brushes, Own помимо стандартных кистей. Закидываем туда наши отобранные кисти и радуемся жизни.
3. Создание нового мира
Хватит теории, переходим к практике! А, еще не совсем. Для начала нам нужно создать мир и рассмотреть, какие при этом используются параметры.
Открывая меню создания нового мира, мы видим множество параметров. Я не буду останавливаться на параметрах Названия и Размера (Dimensions) (обратите внимание, что размеры строго кратны 128), здесь вы сами решаете.
Раздел топографии. Здесь нам по умолчанию предлагают создать мир со сгенерированными холмами. В пекло их, они выглядят убого. Выбираем тип мира Flat, плоский, и настраиваем стандартную высоту, на которой будет почва, и высоту уровня моря. Учитывая специфику нашего урока, а мы будем создавать остров, возьмем уровень почвы значительно ниже уровня воды, чтобы вокруг нашего острова был океан, а не лужа, в которой видно дно. Я возьму уровень почвы 40, а уровень воды оставлю стандартным. Пункт «Beaches» (пляжи) отключим, мы сами хотим раскрашивать наш мир.
Материал покрытия. Здесь хочу заострить внимание на том, что стандартно стоит Grass — нас это не устраивает. Почему? Это трава, на которой самостоятельно генерируется трава и цветы, и генерируется отдельными кусками. Мы сами будем решать, где и что растет, поэтому сейчас здесь выбираем Bare Grass — трава без растительности на ней. Пункт «Advanced» трогать не советую, там вы задаете примитивное автоматическое применение материалов к ландшафту, а мы будем делать это вручную, чтобы наш ландшафт выглядел красиво.
Здесь же идет пункт Extended block IDs — это нужно только если вы хотите использовать блоки из модов, собственноручно вбивая их ID в материалы. Нам к этому прибегать не нужно, да и вообще, как мне кажется, не имеет смысла, только если вы не пользуетесь модом Conquest Reforged или подобными.
Сид. Здесь советую просто оставить океан. Этот параметр отвечает за мир, который будет генерироваться за пределами нарисованного вами мира, если игрок туда вдруг сунется. Хочу сделать важное примечание, если вы также будете делать остров, в разделе топографии оставьте уровень моря 62 — в сиде будет такой же и вне острова везде будет безграничный океан. Однако, если вы хотите использовать другой уровень моря, мы обсудим это в последней части урока, при экспорте.
4. Пример — создание острова.
И тут начинается самое интересное, создадим свой собственный остров. Здесь будет много картинок, текста уже было достаточно.
Для этого мы будем следовать определенной последовательности этапов, я настоятельно рекомендую вам ее придерживаться, чтобы избежать множества ошибок, исправлений и попросту траты времени.
Шаг первый. Создание формы острова.
Для начала нам нужно определиться с формой острова. Вы можете пробовать повторить форму какого-либо острова, найдя его в сети, но мы начнем с нуля.
Здесь все довольно просто: вооружайтесь любой из скачанных кистей, поставив ей высокую интенсивность (или, если вы никуда не торопитесь, используйте любую) и просто создавайте произвольную кляксу, пока форма вас не устроит.
Обращайте при этом внимание на высоты. Ваши берега не должны быть резкими и гораздо выше уровня воды (разве что если вы к этому не стремитесь). Обратите внимание на образовавшиеся в процессе хребты — это наши будущие горы. Разумеется, некоторые можно будет сравнять с землей в угоду игровому пространству, мы ведь создаем это с расчетом на игрока.
Шаг второй. Работа над рельефом.
Итак, мы имеем грубый набросок формы. Пора задуматься о том, как это все будет видеть игрок, а увидит он кашу из блоков, по которой без прыжка нельзя пройти и пяти метров.
Это значит, что нам нужно немного выровнять ландшафт. Как это сделать?
Зачастую люди прибегают к инструменту Сглаживания (Smooth), что вполне логично. ОДНАКО! Сглаживание сделает наш ландшафт слишком плавным, это будет абсолютно неестественно.
Я советую использовать инструмент Выравнивания (Flatten) с низкой интенсивностью (10-20%) и выбрать при этом круглую кисть из стандартных кистей. Далее просто кликать в случайных местах, пока не добьемся нужного результата.
Обратите внимание, в процессе я не буду прорабатывать весь остров, а продемонстрирую все шаги на отдельных участках и применю все к одному.
Только что мы разравнивали, а теперь наоборот, в некоторых местах сделаем выступы и неровности, чтобы ландшафт был интереснее и реалистичнее:
А теперь перейдем к вышеупомянутым хребтам, которые станут основой наших гор. Первым делом мы их сгладим инструментом Сглаживание (Smooth), который я не советовал использовать для разравнивания основного ландшафта. Здесь мы на сглаженном месте вырастим горы, а хребты бы создали мешанину при наращивании.
При наращивании обращайте внимание на высоту горы. Разумеется, хочется огромные непроходимые горы, но выглядеть это будет не очень хорошо. Советую при этом проверять 3D-рендер мира, который можно открыть в меню View сверху, либо сокращением Ctrl+3
При этом иногда у подгорья или на самой горе можно заранее заметить интересное место, в котором в дальнейшем можно будет что-нибудь построить. Его можно заранее подровнять инструментом Выравнивания (Flatten), как мы уже выравнивали основной ландшафт.
Шаг третий. Текстурирование.
Итак, наш ландшафт на этом этапе полностью готов. Я советую перед тем, как приступать к этапу текстурирования, экспортировать наш ландшафт в игру, полетать и все осмотреть, возможно найдутся места, которые вам не понравятся. Когда вас будет все устраивать — можете приступать к наложению текстур.
Что подразумевается под «текстурированием»? Наложение на наш ландшафт различных блоков, потому что сейчас он состоит из одной земли.
Для начала рекомендую накладывать камень. Для этого мы берем инструмент Карандаш и во вкладке Terrain выбираем камень, кисть при этом берем из стандартных с резкими краями (сплошной круг или квадрат). Дальше — самое интересное, мы обращаемся ко вкладке настроек кисти (Brush settings) и выставляем градусную меру Above 45 degrees. Теперь карандашом тыкаем по ландшафту, получая замечательный и реалистичный паттерн.
Помимо того, вы можете использовать для наложения камня инструмент Глобальные операции. Для этого вы выбираете этот инструмент и в открывшемся меню выбираете операцию заливки камнем, а в настройках справа выбираете, чтобы изменения были применены только к суше и с градусной мерой 45 градусов. Вы можете экспериментировать со значением и добиваться своего результата. Однако, если вы используете глобальные операции, изменение будет применено ко всей карте, а ручной метод с использованием Карандаша позволяет вам в разных местах по-разному накладывать камень.
Помимо наложения камня я часто использую блоки земли, которые накладываю Спреем с низкой интенсивностью и настройками «только на суше; кроме камня» или аналогичными, чтобы не залезть с землей на горы. Это мелкое изменение, но разнообразит бескрайнюю траву для игрока в процессе игры.
Дальше займемся пляжем. Это не составит для нас проблем. Мы просто накладываем песок с помощью Карандаша с указанием максимальной высоты и других параметров (не забываем, что нам не нужно залезать на камень). Рекомендую отнестись к этому с умом и не применять песочные насыпи где попало, например у крутых берегов. Во-первых, это не реалистично, во-вторых, игрок там все равно не окажется. После того, как мы сделали грубый пляж карандашом, можно чуть-чуть повысить максимальную высоту, взять Спрей и пройтись вдоль пляжа, чтобы создать переход.
Обратите внимание, Спрей используется со стандартной кистью шума. Это наиболее подходящая для Спрея кисть.
Однако, под водой у нас стандартно земля. Исправим это с помощью Глобальной операции, заполнив все землей только там, где вода:
Шаг четвертый. Объекты и слои.
На мой взгляд, самый интересный этап. Здесь мы добавляем растения и деревья, облагораживая наш голый кусок земли, песка и камня.
Для начала создадим слой травы. Для этого во вкладке Layers. Под всеми дефолтными слоями видим «+», который позволяет нам создать свой слой. Создадим слой растений, с помощью «Add a custom plants layer…». Здесь я обычно выбираю траву, высокую траву, папоротник, причем обычная трава в подавляющем большинстве. Если высокой травы будет много, игроку будет сложно ориентироваться и в целом играть. Называем слой, опционально выбираем цвет.
Сразу же настроим и слой цветов.
После того, как мы создали наши слои, с помощью Спрея наносим на ландшафт. Не забываем про настройки кисти, чтобы не залезть куда не надо. При этом цветы добавим с очень низкой интенсивностью. Почему мы не добавили их к слою травы? Потому что тогда они могут расти повсеместно, а не в определенных местах, а также их легче редактировать, когда они в отдельном слое.
Траву мы не добавляем повсеместно, так выглядит лучше и разнообразнее.
Когда разобрались с мелкой растительностью, добавим леса. Для этого нам нужны схематики деревьев: вы можете скачать их в сети или, если есть желание и умение, сделать самостоятельно. Для примера я использую свои деревья.
Для этого мы создаем новый слой с помощью «Add a custom object layer…».
Добавляем схематики с помощью иконки конструктора со знаком «+». Но на этом не останавливаемся, нам нужно проверить каждый схематик, дважды на него кликнув и в открывшемся меню нас интересует пункт Offset. Нажимаем на Auto и затем на выделенные синим координаты. Делаем это мы для того, чтобы наше дерево точно стояло на земле.
Здесь мы видим референсный блок, относительно которого и будет применяться схематик. При текущем расположении дерево может заспавниться, например, над уступом и парить в воздухе.
С помощью кнопки «Auto» мы уже поправили координаты X и Z, но нам нужно еще слегка прикопать дерево, чтобы оно ТОЧНО было в земле.
Эта деталь очень часто проявляется на картах неопытных пользователей WorldPainter, поэтому учитывайте это.
Затем, настройте частоту (Sparseness). В помощь предпросмотр справа.
Когда наш слой готов, с помощью спрея применяем его к нужным местам, учитывая, что деревья должны расти только на блоках земли.
На этом наше заполнение ландшафта окончено и мы можем экспортировать готовую карту.
5. Экспорт карты.
Наконец, мы можем экспортировать наш мир. Здесь все также интуитивно понятно.
Здесь заострю внимание на следующих пунктах:
Border — граница. Если выбрать No border, то за границами нарисованного мира будет генерироваться мир из сида, с которым мы встречались при создании мира. Если у вас при создании уровень воды был стандартный, 62, можно оставить этот вариант. Вариант Void просто обрубит мир. Вариант Water позволяет вам за границами продолжить сплошной океан на определенном уровне, который вы можете настроить, что полезно, если при создании мира указывался свой уровень моря. С вариантом Lava все аналогично.
Все остальное понятно. Также отмечу, что при экспорте можно экспортировать либо всю карту, либо только определенные участки (Export selected tiles). Советую использовать в процессе создания, когда нужно просто проверить изменения, не дожидаясь полного экспорта.
На этом наш ландшафт готов.
Надеюсь, что гайд был для вас полезен и теперь вы сможете создать свой собственный ландшафт для вашей карты, который игроку будет гораздо интереснее исследовать!
Источник статьи: http://vk.com/@customnpcforever-sozdanie-igrovogo-landshafta-process-i-tonkosti