- Генерация ландшафтов в Unity3d
- План действия
- Частые ошибки
- Шум Перлина
- Алгоритм diamond-square
- Ландшафт в Unity3D. Часть 1. Создание террейна в Unity 3D и экспорт карты высот из Unity 3D
- Создаем ландшафт в Unity3D
- Особенности и секреты террейна/ландшафта в Unity3D
- Модифицируем/изменяем террейн в Unity 3D
- Экспорт террейна в Unity3D через экспорт карты высот ландшафта
Генерация ландшафтов в Unity3d
Думаю все заметили, что сейчас стало появляться множество всяких бродилок с выживанием в стиле Minecraft. Сделать такую решился и я. Начало было лёгким — Unity3d имеет огромный функционал для сознания простеньких игр (и не только). Персонаж, игровые объекты, в общем основу сделать быстро. Но какой minecraft без рандомно генерируемого мира? Это стало первой трудной задачей. И думаю не только для меня. Просмотрев весь гугл и потратив кучу времени на эту бесполезную вещь я решил написать эту статью дабы сократить страдания других.
Дальше вас ждёт описание алгоритмов (и код) создания более менее реалистичных ландшафтов. Уточню, что все примеры на C#.
План действия
Для начала хорошо бы было разобраться, что подразумевается под генерацией ландшафта:
- Генерация карты высот. Это самая главная часть, по карте высот строится terrain (или mesh). Её можно также использовать для окрашивания terrain в зависимости от высоты
и для расстановки игровых объектов. - Построение ландшафта. Есть два способа выполнения этого пункта, в зависимости от того не хотите ли вы сложностей и используете ли вы unity3d, или же вам плевать на производительность, но вам важно, чтоб было красиво. В первом случае советую использовать встроенный в unity3d редактор ландшафта (terrain).
Простенький код для этого:
Второй способ заключается в создании mesh. Данный метод даёт больший простор действий над ландшафтом, но он и сложнее: вам придётся создавать mesh, далее разбивать его на треугольникии и трудиться над шейдерами для покраски. Разобраться во 2 способе вам поможет эта статья.
Наложение текстур.Конечный этап в генерации ландшафта. Здесь опять нам пригодится карта высот из первого пункта. Для наложения и смешивания текстур мы будем использовать простой шейдер.
Здесь мы получили на вход 3 текстуры: карта высот, текстуры травы и камня. Далее мы смешиваем текстуры камня и травы по карте высот, используя функцию lerp(). И на выход мы подаём нашу карту высот но окрашенную в нужные текстуры.
Итак, поняв общий план действий, надо приступать к делу.
Частые ошибки
С самого начала я думал, что всё будет очень просто и для рандомной генерации ландшафта можно обойтись обычной функцией Random(). Но это самый неправильный способ. Его результат это вовсе не красивая карта, а расчёска в приближении.
Шум Перлина
Perlin noise (Шум Перлина, также иногда Классический шум Перлина) — математический алгоритм по генерированию процедурной текстуры псевдо-случайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использоваться для генерации эффектов дыма, тумана и т.д.
Думаю многих испугала приставка псевдо, но от неё легко избавиться. Далее представлен способ реализации шума в Unity3d:
Я бы не сказал, что данный способ даёт ошеломляюще реалистичные результаты, но он довольно неплох для создания пустынь или равнин.
Алгоритм diamond-square
После долгих часов скитаний по интернету наткнулся на этот алгоритм, и он оправдал все мои ожидания. Он даёт прекрасные результаты. Для расчитывания вершин есть очень простая формула.
Представим себе плоскость, её 4 вершины и точку по центру. Её высота будет равна сумме высот 4 вершин, делённая на их кол-во и некого случайного числа с коэффициентом. Вот код для unity3d (халява копи-пастерам):
Источник статьи: http://habr.com/ru/post/226635/
Ландшафт в Unity3D. Часть 1. Создание террейна в Unity 3D и экспорт карты высот из Unity 3D
В данной статье-уроке по созданию террейна в Unity3D рассказывается о том, как создать ландшафт в Unity3D. В уроке раскрываются первые секреты и особенности ландшафта в Unity 3D, а также рассказывается о том, как экспортировать карту высот созданного в Unity3D ландшафта с целью ее дальнейшего использования для редактирования в графических редакторах, например, GIMP или Photoshop.
Создаем ландшафт в Unity3D
Для того чтобы создать заготовку для нового террейна в Unity3D выберите в главном меню вкладку “Game Object”, в которой в свою очередь выберите вкладку “3D Object”, а в ней – “Terrain”. В окне сцены “Scene” появится плоскость, похожая на стандартный примитив “Plane” или “Quad”, расположенные все в той же вкладке “3D Object”.
На рисунке показано меню создания ландшафта террейна в Unity3D.
Хотя только что созданная плоскость террейна и имеет компонент “Transform”, как любые другие объекты в Unity 3D, данный компонент позволяет лишь менять расположение террейна в пространстве, абсолютно игнорируя изменения значений для масштаба “Scale” и поворота “Rotation” террейна (выделено красным на рисунке выше).
Но значение для Rotation можно изменить, если его вращать через Гизмо. Конечно существуют инструменты позволяющие повернуть ландшафт в Unity3D, точнее будет сказать, не террейн, а карту высот террейна. Одним из таких инструментов является ассет с Unity Asset Store Terrain Rotator.
На рисунке показан ассет Terrain Rotator, позволяющий повернуть карту высот ландшафта в Unity 3D, по сути, позволяющий развернуть террейн Unity 3D.
Особенности и секреты террейна/ландшафта в Unity3D
Вместо того чтобы задавать размер террейна через масштаб “Scale” в компоненте преобразования трансформации “Transform” (как это работает, например, для 3D моделей, импортированных в Unity3D), необходимо использовать параметры ширины террейна (по оси Z в глобальных/мировых единицах) и длины/протяженности террейна (по оси X в глобальных/мировых единицах) – “Terrain Width” и “Terrain Length”, задаваемые в настройках/установках террейна “Terrain Settings” (выделено на рисунке выше зеленым цветом). Особенностью созданной заготовки-плоскости для террейна является то, что она может быть изменена имеющимися в Unity3D встроенными инструментами создания террейна, расположенными в компоненте “Terrain” в окне инспектора “Inspector”, такими как понижение/повышение террейна ”Raise/Lower Terrain”, выравнивание террейна до заданной высоты “Paint Height”, сглаживание террейна “Smooth Height”, раскрашивание ландшафта текстурой “Paint Texture”, размещение деревьев на террейне “Place Trees”, размещения травы и мешей “Paint Detail”. Более подробно данные инструменты для работы с террейном в Unity3D описаны в разделе Ландшафтный движок в официальном руководстве Unity3D.
Для данной статьи нам подойдет ландшафт в Unity3D размером в 100 на 100 единиц/units, которые в Unity можно условно приравнять и одному метру, и одному миллиметру (например, для создания макромира в Unity 3D) и нескольким тысячам километров (для создания стратегий в бесконечном космосе в Unity 3D). Остальные настройки (выделены зеленым на рисунке выше в правом нижнем углу) я выставил также не слишком высокими (выделены в нижней правой части рисунка выше зеленым цветом). Обратите внимание, что размер/разрешение карты высот задается не в стандартных размерах 256 (x256), 512 (x 512), 1024 (x 1024), 2048 (x 2048), а к данным значениям добавляется единица, но об этом несколько позже.
Забавности с террейном на этом не заканчиваются: попробуйте повернуть террейн вокруг любой из его осей. Для того чтобы повернуть 3D объект, выберите его (в данном случае террейн), щелкнув по нему Левой Кнопкой Мыши, и перейдите в режим поворота/вращения объекта, нажав клавишу ‘E’, после чего, чтобы повернуть объект вокруг оси Z, щелкните Левой Кнопкой Мыши на синей окружности гизмо, которая окрасится в желтый цвет и удерживая Левую Кнопку Мыши, переместите мышь. За поворот террейна (да и любого другого 3D объекта в окне сцены Unity 3D) вокруг оси Y отвечает зеленая окружность, а вокруг X — красная.
На рисунке показан “повернутый” ландшафт в Unity3D, который на самом деле не развернулся, а лишь поменял свое местоположение.
Обратите внимание, что ландшафт в Unity3D не поворачивается вокруг своей оси, а поворачивается вокруг некоей точки, как если бы его pivot point лежал не в центре самого террейна, причем ориентация террейна при повороте сохраняется, т.е. если левый край террейна смотрел на сервер, а правый – на юг, то данная ориентация краев террейна не изменится после процедуры вращения террейна. После того как вы «повернете» ландшафт в Unity3D, в результате этого «поворота» изменится лишь его положение в 3D пространстве. В зависимости от того, вокруг какой оси вы поворачиваете террейн, зависит то, по каким осям происходит смещение террейна. После того как вы повернете ландшафт в Unity3D, отпустите Левую Кнопку Мыши и поверните террейн еще раз вокруг той же оси. Попробуйте вернуть его в прежнее положение! Не получается… Получается, что как только вы отпускаете Левую Кнопку Мыши, опорная точка pivot point (как Pivot Center for Rotation/Scaling в Blender) террейна автоматически перемещается в новую точку.
Такое поведение террейна, не как обычного 3D объекта, обусловлено условиями, предъявляемыми к оптимизации террейна в Unity3D. Отсутствие поворота – и плюс и минус одновременно. Минус – вы не можете вращать террейн, но при больших локациях, открытых мирах и огромных уровнях вращение террейна просто убило бы производительность и снизило бы FPS до нуля. Для небольших уровней, например, в виде отдельных островков, отсутствие возможности повернуть террейн может считаться минусом, но при данных начальных условиях всегда можно использовать меш взамен террейна, поскольку в данном случае производительность (даже без поворота террейна) может встать на сторону использования именно мешей, а не террейнов.
Модифицируем/изменяем террейн в Unity 3D
Итак, вернемся к созданному мешу. Верните “развернутый” террейн в прежнее его положение, нажав сочетание клавиш Ctrl+Z, являющейся широко используемой комбинацией для отмены последней операции (в 3D редакторах, текстовых редакторах, графических редакторах и т.д.).
Давайте придадим некую форму созданной заготовке нашего террейна, чтобы он был больше похож на какой-нибудь абстрактный ландшафт. Для этого выберем инструмент повышения/понижения высоты террейна “Raise/Lower Terrain”, выберем соответствующую кисть в разделе “Brushes” , зададим размер и непрозрачность (нажим) кисти и, удерживая Левую Клавишу Мыши, проведем по поверхности будущего ландшафта. Я не стал залезать на края заготовки для террейна, хотя существуют инструменты и скрипты, позволяющие “сшивать” несколько частей террейна (например, созданных непосредственно в Unity3D), даже значительно разнящихся на границах без заметных артефактов.
На рисунке показаны инструменты компоненты «Transform», при помощи которых можно создать ландшафт в Unity3D.
Ландшафт в Unity3D, как много содержится в этих словах и как много можно с ним сделать. Что же мы можем сделать с только что созданным террейном? Раскрасить текстурами, высадить на нем деревья, кустарники и траву, установить Зону ветра “Wind Zone” и настроить ее для травы, а также настроить отображение размещенной растительности и объектов на террейне, включая подмену 3D моделей билбордами (одной или несколькими плоскостями, имитирующими деревья на большом расстоянии от наблюдателя/камеры с целью снизить нагрузку на графический процессор – все равно на большом удалении игрок не увидит каждую веточку дерева или траву, да и не обращает игрок на них, как правило, внимание, за исключением отдельных перфекционистов, которые и в XCOM2, Skyrim, FarCry, Crysis, серии Assasins Creed, Mass Effect, Final Fantasy, Bioshok, Just Cause, Prince of Persia или последнем Ведьмаке , которые по праву считаются одними из самых красивых игр, увидят недостатки, несоответствия, недостаточный реализм и т.д. и т.п.).
Кстати, если вам не хватает имеющихся кистей в Unity3D, вы можете с Unity 3D Asset Store скачать ассет Generic Terrain Brushes, включающий 35 кистей для террейна, либо создать свои кисти. О том, как это сделать, я рассказал в уроке по террейну в Unity 3D “Террейн в Unity 3D. Часть Вводная – для затравки. Создание лабиринтов и подземелий в Unity3D”.
Кроме всего перечисленного Unity 3D позволяет, как импортировать, так и экспортировать созданный террейн в другое приложение для его редактирования. Точнее будет сказать, экспортируется не сам террейн, а карта высот, ведь именно карты высот мы рисуем, когда водим различными кистями по поверхности террейна. Приложениями, в которые может быть импортирована карта высот, созданная в Unity 3D, могут быть и 3D редакторы, например, Blender 3D, и специализированные приложения для создания террейнов/ландшафтов, например, World Machine 2 (поддерживающее множество известных инструментов для построения качественного ландшафта).
На рисунке показан один из ландшафтов, созданных в редакторе ландшафтов World Machine.
Приложение World Machine «выросло» из GeoControl, о чем извещает страница, на которой ранее располагался сайт GeoControl 2.
На рисунке показана страница перенаправления на один из сайтов, на котором можно познакомиться и купить генератор ландшафтов World Machine 2.
Экспорт террейна в Unity3D через экспорт карты высот ландшафта
Давайте экспортируем карту высот, по которой создается ландшафт в Unity3D. Опция экспорта карты высот террейна в формате RAW доступна в меню установок террейна “Terrain Settings” (иконка с шестеренкой).
На рисунке показан процесс экспорта карты высот из Unity3D.
В окне Инспектора в компоненте “Terrain” в разделе карты высот “Heightmap” выберите кнопку “Export RAW”, чтобы открыть меню экспорта карты высот (на базе которой и построен ландшафт в Unity3D). В данном меню вам предложат выбрать параметры для формата RAW экспортируемого изображения. Выберите 16 bit для параметра Depth, чтобы сохранить карту высот в 16-битном формате (об этом мы поговорим в одном из следующих уроков по созданию ландшафта в Unity3D); для Byte Order – Windows, и НЕ ставьте флаг/галочку напротив параметра Flip Vertically, отвечающем за переворот/зеркальное отображение экспортируемого изображения по вертикали. Осталось лишь кликнуть на кнопке “Export”, открыть окно стандартного сохранения файлов, в котором вам останется лишь выбрать папку, в которую вы хотите сохранить карту высот, и имя файла карты высот, после чего – нажать кнопку “Ok”.
Автор: Максим «MANMANA» Голдобин
Источник статьи: http://www.3dbuffer.com/articles/landshaft-v-unity3d-chast-1-sozdanie-terreyna-v-unity-3d-i-eksport-kartyi-vyisot-iz-unity-3d/