Создание ландшафта на Unity за 24 часа


Оглавление (нажмите, чтобы открыть):

Создание ландшафта на Unity за 24 часа

barbos 03 июн 2014, 10:00

Делаю RTS проект на Unity3D. До этого никого опыта в геймдеве, и вообще в 3D не было.

Сделал террейн стандартными средствами Unity3D, нанес на него текстуры грунта и травы. Потом, для создания дорог, тротуаров, бордюров и спортплощадок, создал эти объекты в отдельных mesh-ах, натянул на них соответствующие текстуры (бетон, асфальт, брусчатка, гравий и т.п.) и «вымостил» этими примитивами мой terrain.

Главный минус данного подхода — при удалении камеры от земли, текстура травы начинает просвечивать (flickering, не знаю как правильно перевести) сквозь асфальт/брусчатку/прочее. Это происходит из-за недостаточной точности float-координат, которая начинает проявляться на больших расстояниях от камеры.

Как я понимаю, правильный способ создания больших ландшафтов — это создание модели ландшафта в 3D-редакторе(3DMAX, Blender, Mudbox и т.п.) с редактированием полигональной сетки. При этом все «плоские» элементы ландшафта были включены в полигональную сетку ландшафта. Затем, нужно создать UV-map, в котором будут текстуры для всех элементов ландшафта — земля, трава, камни, кусты, асфальт, бетон, брусчатка и т.д., и применить эту текстуру к terrain-у. Правильный ли это подход?

Re: Правильное создание ландшафта

Badger_ 03 июн 2014, 21:02

Для стратегий, если это 3D то используйте террайн. Даже в Батлфилде дорога сделана таким методом:

Простая текстура на террайне.

Высоты для ландшафта сгенерировать можно в такой программе (DICE её использовала для создания ландшафтов Bad Company):

Re: Правильное создание ландшафта

Diab10 03 июн 2014, 21:59

Это не может быть простым текстурированием ландашфта. Скорее всего дорога там сделана мешем, возможно с полупрозрачными краями для более плавного перехода в ландшафт.
Если нет, то подскажите технологию, как такую дорогу сделать при помощи террейна(на примере террейна Unity)?

Re: Правильное создание ландшафта

bwolf88 03 июн 2014, 23:20

Re: Правильное создание ландшафта

Diab10 03 июн 2014, 23:30

При чём тут это? Я про то, что текстура дороги лежит вдоль дороги, изгибается — повороты дороги есть, разметка. Попробуйте террейн так же покрасить обычной текстурой — не выйдет, т.к. покраска террейна, если говорить упрощённым языком — это просто сетка, к примеру, 1024х1024 с точками текстур в её узлах. Т.е. текстуры могут быть наложены по сетке, тайлингом. Просто так извилистую дорогу получить не получится

PS: я говорю именно про асфальтную дорогу.
Там в начале видео есть дорога гравийка -такую можно текстурированием сделать, но это не дорога, а фигня. И то, даже по этой гравийке вдоль дороги есть полосы по дороге — их тоже текстурированием не сделать, т.к. они изгибаются.

Re: Правильное создание ландшафта

Neyl 04 июн 2014, 00:41

Re: Правильное создание ландшафта

bwolf88 04 июн 2014, 02:34

Re: Правильное создание ландшафта

Diab10 04 июн 2014, 07:54

Аа, ну это почти то же самое — всё равно при помощи меша.
Почему тоже не побороли? В BF и Cry дороги просвечивают?
Побороть можно — просто порядок отрисовки у дороги изменить в шейдере, не будет просвечивать.

Гвозди бульдозером забивать?
Не лучшее решение. Для этого есть специальные инструменты, которые именно для дорог и созданы

Re: Правильное создание ландшафта

waruiyume 04 июн 2014, 08:20

Re: Правильное создание ландшафта

barbos 04 июн 2014, 11:35

Вот, я как раз об этом. О тех участках terrain-а — асфальт с разметкой, тротуар с брусчаткой, бетонка, спортплощадки — в которых важно направление текстуры. Разделительная полоса на дороге должна быть ровной и изгибаться вместе с дорогой, а не пересекать асфальт поперек, и т.п.

Поэтому и задаюсь этим вопросом — а как вообще принято реализовывать такие ландшафты? Я вижу 2 варианта:
1) Сделать все эти элементы(участки асфальтовых дорог, перекрестки, развилки, тротуары, грунтовки, спортплощадки) в виде отдельных текстурированных примитивов. Затем импортировать их в Unity3D. Этот способ трудоемок, потому что надо будет делать все неповторящиеся элементы — пререкрестки, изгибы дорог, участки тротуаров. Затем, в Unity3D нужно будет собирать из этих элементов участки дорог, подгонять их под особенности рельефа на terrain-е (это тоже нужно учесть при моделировании примитивов), как-то бороться с flickering еа стыках примитивов.

2) Сделать ландшафт не во встроенном в Unity3D редакторе, а во внешнем инструменте. Там можно будет детально редактировать полигональную сетку, вывести все дороги и прочие нужные участки. Вопросов возникает два. Первый — как текстурировать такой terrain? Делать для него UV-map? Второй — как после импорта в Unity3D, «засеять» этот ландшафт травой, кустарником, деревьями? Поддерживает ли встроенный Terrain Editor работу с импортированными mesh-ами?

Re: Правильное создание ландшафта

Badger_ 04 июн 2014, 14:18

Создание террейна в Unity3d для абсолютных новичков

Создание террейна в Unity 3D

Введение

В данном уроке рассказывается о том, как создать ландшафт в Unity3D.

Unity — мощный инструмент для создания игр и визуализаций.

Отличительной чертой Unity является его гибкость, адаптивность к разработке как небольших 2D-паззлов или аркад, так и к разработке больших-серьезный стратегий, RPG или игр других жанров. В то же время, одной из парадигм Unity является простота освоения и удобство работы.

Создание ландшафта в Unity сравнимо с работой в редакторе ландшафта Warcraft 3. Немногим сложнее, зато предоставляются возможности по созданию действительной красивых ландшафтов.

Часть первая. С чего начать?

Начать следует, конечно, с установки и запуска редактора.
Процесс установки пропустим, так как он не вызовет затруднений ни у кого.
Итак, редактор запущен. Создаем или загружаем проект, в котором предстоит делать ландшафт. Если вы уверены, что не используете никаких ассетов с графикой, то следует выбрать ассет *Environment* из стандартной комплектации.
Следующее действие — добавить в проект этот самый «террейн», который будем создавать.
Для этого в верхнем (главном) меню выбираем GameObjects — > 3D Objects — > Terrain.

Появляется непонятный грязновато-белый квадрат с сеткой.
Выбираем новосозданный террейн на панели иерархии сцены (слева). Там же его можно переименовать, копировать, или удалить, но это не то, что нам нужно для создания. Итак, после этого в инспекторе (панель справа от сцены или вкладка. Кстати, её можно перетаскивать, чтобы расположить так, как вам удобно) появится символическое изображение стилизованного кубика как земля в майнкрафте с подписью террейн и несколькими инструментами.

Часть вторая. И что это за кнопки?

Первый инструмент, на иконке которого изображены горы со стрелочкой вверх (и который выделен на рисунке бирюзовым)- это создание неровностей. Им можно создавать возвышения (кликнув на террейне в нужном месте) или впадины (то же самое, но с зажатым шифтом).
Обратите внимание , что для получения эффекта нужно настроить кисть — её форму, размер и «силу» (Opacity — непрозрачность).
Обратите внимание также, что для создания полноценных впадин террейн нужно сначала поднять. В противном случае ландшафт лишь выровняется до минимального уровня.
В этом уроке не будет рекомендаций по созданию _красивого_ ландшафта. Не будет даже советов по использованию созданного ландшафта. Цель урока — помочь освоиться с базовыми функциями редактора и, может быть, помочь преодолеть так называемый «ступор незнакомого интерфейса», возникающий у многих людей при запуске незнакомой программы или знакомой с изменившимся интерфейсом.

Наверняка после недолгих экспериментов вы получили некие резкие перепады высот, которые смотрятся «не очень». Для их устранения нам поможет Smooth terrain, расположенный справа через одну. Выглядит он как всё та же горка с каплей воды рядом (На рисунке выделен желтым). Это отнюдь не создание воды, как может показаться. Это _сглаживание_.
Левее, кстати, расположен инструмент для создания плато ( выделен зеленым ) — он выравнивает высоту. Для захвата необходимой высоты зажимаем Shift, после чего «рисуем» плато без зажатого шифта.
Следующие инструменты позволяют наложить на ландшафт текстуры, расположить деревья и декорации. Последняя кнопка на этой панели — настройки.

Для добавления текстуры (иконка — кисть, выделена красным ), нужно сначала добавить тайлы. Ниже настроек кистей будет панель текстур. Нажимаем Edit textures — > Add texture и подбираем нужную (и как Normal, и как Smoothness) из списка предложенных (к слову, их можно добавлять самостоятельно, но об этом в другой раз). Для наглядности можно создать первой текстурой _GrassRockyAlbedo_, а второй — GrassHillAlbedo, после чего поэкспериментировать с настройками кисти и текстуры, порисовав травой.
+Преимуществом+ Unity является обилие кистей и довольно высокая гибкость их настроек, что после небольшой практике позволяет с легкостью создавать интересные ландшафты с минимумом усилий.

Инструмент размещения деревьев (выделен фиолетовым), располагающийся левее текстурирования, работает схожим образом. Добавляем деревья и. немного больше настроек. Указывается плотность расположения деревьев, их высота, которая может быть автоматически рандомизирована для каждого, привязка ширины к высоте (или её рандомизация) и автоматическая рандомизация поворота деревьев. К слову, в изначальной поставке деревьев не то, чтобы много.
Зажатие шифта, как водится. позволяет стирать деревья с террейна.

Также, на панельке можно найти кнопку » Mass Place Trees«, которая позволяет заполнить весь террейн указанным количеством деревьев.
Последний инструмент ( выделен синей рамкой) — расположение деталей, то есть всяческих украшений, вроде травы. Опять же, в изначальной поставке их не то, чтобы много.
К примеру, выбираем Edit Details -> Add Grass Texture и выбираем текстуру _GrassFrond01AlbedoAlpha_ после чего испытываем её кистью.

Заключение

Создание ландшафта в Unity3D — это не трудно. Конечно, использование Unity не гарантирует запредельный уровень графики без приложения каких-либо усилий, да и модели и текстуры, вероятно, придется делать самостоятельно или с привлечением художников и 3D-артистов, искать в сети, либо покупать. Охватить все тонкости в рамках одной статьи решительно невозможно. Более того, статья рассматривает лишь одну грань работы с Unity.

Надеюсь, что она помогла абсолютным новичкам немного разобраться с интерфейсом и возможностями Unity.

Инструменты ландшафтного движка Unity

Unity — это мультиплатформенный игровой движок, разработанный Unity Technologies, который используется для создания видеоигр и приложений для множества устройств (ПК, консолей, мобильных устройств и даже веб-сайтов). Основными преимуществами Unity являются его надежность и мобильность; Unity нацеливается на несколько известных API, таких, как Direct3D, OpenGL, OpenGL ES и недавний Vulkan.

Благодаря вышеупомянутым характеристикам Unity становится все более популярным среди компаний разработчиков программного обеспечения уровня AAA и начинающих программистов.

Unity поддерживает несколько технологий и компонентов. Одним из ключевых компонентов системы является ландшафтный движок. Система ландшафтов Unity позволяет создавать обширные ландшафты для ваших игр или приложений. Вы можете использовать набор инструментов для создания ландшафтов легко и быстро.

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

Необходимые условия

Во-первых, убедитесь, что у вас установлена ​​последняя версия Unity. В этом уроке мы используем версию 5.6. Убедитесь, что вы используете последнюю версию Unity; В противном случае вы можете найти небольшие различия во время прохождения урока и использования физических соединений.

Для этого урока вы не будете использовать стартовый файл. Цель состоит в создании нового проекта и выполнении всего урока.

Инструменты ландшафта

Первый шаг — это создать новый проект Unity. Теперь добавьте новую сцену (File > New Scene). Новая сцена была создана с двумя игровыми объектами, Main Camera и Directional Light (Unity 5 автоматически добавит skybox в сцену).

Теперь, чтобы добавить игровой объект terrain, перейдите в меню GameObject и выберите 3D Object > Terrain. Это добавит плоскую поверхность (называемую Terrain) в вашу сцену. Эта поверхность является сеткой, которую мы собираемся сделать для создания на этом уровне ландшафта.

Если вы проверите свой каталог Assets (в нижней части интерфейса Unity), вы увидите, что был создан файл New Terrain.

Выберите Terrain и посмотрите вкладку Inspector. Вы увидите, что terrain имеет три компонента: Transform, Terrain script и компонент Terrain Collider.

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

Если вы выберете любую кисть под компонентом Terrain и наведите указатель мыши на поверхность, вы увидите синюю область, проецируемую на этой поверхности. Это позволяет узнать область ландшафта, на которую повлияет ваша кисть.


Как вы, возможно, уже поняли, объект Terrain довольно большой. Для навигации по Scene (сцене) вы можете использовать мышь и клавиатуру. Внутри вкладки Scene нажмите и удерживайте правую кнопку мыши (курсор должен измениться на глаз).

Удерживая кнопку мыши:

  • Вы можете изменить угол обзора, перемещая мышь.
  • Используйте клавиши W, S, A, D для перемещения по 3D-сцене.

Прежде чем приступать к изучению инструментов ландшафта, давайте посмотрим на свойства Terrain. Последняя кнопка на компоненте Terrain (внутри вкладки Inspector) покажет вам базовые параметры объекта terrain.

Свойства делятся на разделы:

  • Base Terrain
  • Tree & Detail Objects
  • Wind Settings for Grass
  • Resolution
  • Heightmap

Внутри первой секции Base Terrain вы найдете несколько свойств и параметров.

Опция Draw включает или выключает рендеринг ландшафта. Pixel Error представляет значение точности преобразования между картами terrain’а (например, текстур, heightmaps и самого сгенерированного terrain’а). Более высокие значения представляют меньшую точность, а меньшие значения будут приводить к излишней обработке. Вы обязаны сбалансировать это значение, чтобы создать хорошее, насыщенное окружение.

Base Map dist. — максимальное расстояние, на котором текстуры ландшафта будут отображаться с полным разрешением. Вы можете включить или отключить тени, выбрав Cast Shadows.

Затем у нас есть Material. Здесь вы устанавливаете материал, который будет использоваться для рендеринга ландшафта. Это повлияет на то, как интерпретируются цветовые каналы текстуры ландшафта. Вы можете выбрать:

  • Built In Standard представляет материал, основанный на физическом рендеринге, который был введен в Unity 5. Если выбран этот параметр, для каждого слоя наложения можно использовать одну текстуру для альбедо и сглаживания, одну текстуру для нормали и одно скалярное значение для сдвига металла. Имейте в виду, что если проверяется «Overwrite Smoothness», вместо того, чтобы читать из текстурных карт, ровность всего terrain’а будет контролироваться только значением Smoothness.
  • Built In Legacy Diffuse представляет собой устаревший встроенный материал ландшафта из предыдущих релизов Unity (Unity 4 и более ранних). Он использует модель освещения Ламберта и имеет дополнительную поддержку обычной карты.
  • Built In Legacy Specular использует модель освещения Blinn-Phong (пожалуйста, обратитесь к этому предыдущему Unity 5 уроку по освещению) и имеет дополнительную поддержку обычной карты. Этот параметр также позволяет задать общий цвет отражения и блеск для ландшафта.
  • Опция Custom использует настраиваемый материал для вашего ландшафта. Этот материал должен быть шейдером, который ориентирован для рендеринга ландшафта. Это вариант, который я рекомендую только продвинутым пользователям. Однако, если вы хотите попробовать, взгляните на исходный код некоторых встроенных шейдеров и внесите изменения одного из них.

Вы можете также установить Reflection Probes (оптические датчики) для некоторых материалов, но они будут использоваться только при использовании встроенного стандартного материала или пользовательского материала,который поддерживает рендеринг с отражением. Возможные варианты reflection probes:

  • Off: Reflection probes отключены, и для отражения будет использоваться только skybox.
  • Blend Probes: Reflection probes включены. Смешивание происходит только между датчиками. Если поблизости нет датчиков отражения, то будет использоваться отражение по умолчанию, но между отражением по умолчанию и датчиком не будет никакого смешивания.
  • Blend Probes And Skybox: Reflection probes включены. Смешивание происходит между датчиками или датчиками и отражением по умолчанию.
  • Simple: Reflection probes включены, но между датчиками не происходит смешивания, если имеется два перекрывающихся объема.

Наконец, последний параметр в этом разделе — Thickness. Это значение указывает, насколько объем столкновения terrain’а должен простираться вдоль отрицательной оси Y. Считается, что объекты пересекаются с ландшафтом от поверхности до глубины, равной толщине. Это помогает предотвратить проникновение высокоскоростных движущихся объектов в ландшафт без дорогостоящего непрерывного обнаружения столкновения.

Следующий раздел настроек — Tree & Detail Objects.

Мастер Йода рекомендует:  Разработчик PythonGo (Security)

Первая опция — Draw. Здесь можно настроить прорисовку деталей. В основном, это говорит движку, хотите ли вы, чтобы деревья и трава рисовались или нет. Затем у вас есть Bake Light Probes для деревьев. Если вы включите эту опцию, Unity создаст световые датчики в позиции каждого дерева. Затем датчики будут применены к рендерингу деревьев. Если отключить этот параметр, на деревья по-прежнему будут влиять датчики группы источников света. Обратите внимание, что этот параметр доступен только для деревьев, на которых установлены световые датчики на их префабах.

Detail Distance — это расстояние от камеры, после которого детали будут отсекаться. Detail Density представляет количество объектов деталей/травы в данной условной единице площади. Tree Distance представляет собой расстояние от камеры, за которым деревья будут отсекаться. Billboard Start — это расстояние от камеры, начиная с которого 3D деревья начнут заменяться на спрайтовые изображения. Fade Length представляет собой расстояние перехода деревьев из 3D объектов в плоские спрайты. Наконец, Max Mesh Trees — максимальное количество видимых деревьев, которые будут представлены в качестве полноценных 3D мешей.

Идем дальше, вы увидите параметры Wind Settings for Grass

Speed определяет скорость обдувающего траву ветра. Size представляет собой размер ряби на травянистых участках. Bending позволяет определить степень, наклона объектов травы под действием ветра. Grass Tint позволяет выбрать общий оттенок цвета, применяемый к объектам травы.

В разделе Resolution вы найдете несколько свойств разрешения, а именно: Terrain W >

Detail Resolution позволяет определить разрешение карты. Чем выше разрешение, тем меньше и более детальны будут участки травы. Detail Resolution per Patch устанавливает длину и ширину квадрата островков, отрендеренного за один вызов рисования. Control Texture Resolution — разрешение карты splat, которая контролирует смешивание разных текстур terrain’а. Наконец, Base Texture Resolution разрешение композитной текстуры, используемой на terrain’е когда вы смотрите на него с расстояния, большего чем значение base map distance.

Последний раздел — Heightmap. Здесь вы можете импортировать исходный файл heightmap в raw формате или экспортировать текущий terrain в файл изображения в RAW формате. Это может быть очень полезно, если вы хотите использовать внешнее стороннее программное обеспечение для взаимодействия с вашим приложением или игрой.

Инструменты для изменения высоты

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

Первыми тремя инструментами на панели инструментов Terrain Inspector являются инструменты изменения высоты. Эти инструменты используются для рисования изменений высоты на поверхности.

Они предоставляют набор «кистей» с настройками Brush Size и Opacity; Эти инструменты очень похожи на инструменты рисования из любого редактора изображений. Они позволяют рисовать детали ландшафта, как если бы вы рисовали изображение.

Если вы переместите курсор на вкладку Scene, вы увидите синюю область, проецируемую на поверхности. Это позволяет узнать область ландшафта, на которую повлияет ваша кисть.

Первым инструментом является Raise / Lower Height. При рисовании с помощью этого инструмента высота ландшафта будет увеличиваться пока вы водите мышкой с зажатой левой кнопкой по terrain’у. Если удерживать мышь в одной конкретной области, высота будет суммироваться. Такой эффект визуально изображен на следующем рисунке.

Чтобы опустить ландшафт, просто удерживайте клавишу Shift во время рисования инструментом, и это уменьшит высоту вашего ландшафта.

Второй инструмент в редакторе ландшафта — Paint Height. Этот инструмент используется для установки целевой высоты для области ландшафта.

Он работает аналогично инструменту Raise/Lower, но имеет дополнительное свойство для установки целевой высоты Height. Вы можете выбрать желаемую высоту Height, изменив значение параметра Height. Кнопка Flatten рядом с свойством height, которая просто устанавливает высоту у всего terrain’а в заданное значение Height.

Наконец, третий инструмент — Smooth Height. Этот инструмент не будет резко увеличивать или уменьшать высоту terrain’а; Вместо этого он смягчит ландшафт и уменьшит появление резких изменений. Вы могли бы использовать этот инструмент, например, когда вы нарисовали деталь используя одну из «шумящих» кистей из доступного набора, поскольку эти кисти созданы для привнесения острых, скалистых камней в ландшафт и вы можете использовать этот инструмент, чтобы смягчить их.

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

Инструмент для создания текстур

Ландшафт создан теперь пора текстурировать его.

Прежде чем двигаться дальше, вам нужно импортировать aссеты окружающей среды, доступные в Unity 5. Для этого выберите Assets > Import Package и выберите Environment. Нажмите Import, чтобы импортировать все относящийся к окружающей среде ассеты.

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

Как вы могли заметить на вкладке Inspector, инструмент Paint Texture имеет несколько кистей и позволяет вам изменять Brush Size, Opacity и Target Strength.

В первый раз, когда вы используете инструмент для рисования Texture Tool, на нем не будет текстур. Первое, что вам нужно сделать, это добавить новую текстуру в палитру. Для этого нажмите кнопку Edit Textures и выберите Add Texture. Появится новое окно.

Как можно видеть, в этом окне можно выбрать Select нужную текстуру и ее обычную карту, если такова имеется. Нажмите на квадрат под текстурой и выберите текстуру. Появится окно, позволяющее выбрать текстуру. Выберите текстуру SandAlbedo и нажмите Add.

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

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

  1. SandAlbedo
  2. GrassHillAlbedo
  3. GrassRockAlbedo
  4. MudRockyAlbedo
  5. CliffAlbedo

Все они являются частью импортированных ассетов и могут быть найдены так же, как и текстура SandAbedo. Продолжайте и импортируйте их все.

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

Когда вы удовлетворены результатом, перейдите к следующему разделу.

Инструмент для создания деревьев

Теперь, когда вы нарисовали свой ландшафт, пришло время добавить к нему несколько деревьев. Unity 3D позволяет размещать деревья на вашем ландшафте так же, как вы рисовали текстуры. Используя настройки спрайтов для удаленных деревьев, Unity поддерживает хорошую производительность для рендеринга, так что вы можете иметь плотно засаженные леса с тысячами деревьев.

Чтобы начать рисовать деревья, выберите Terrain на вкладке Hierarchy и на вкладке Inspector выберите пятую кнопку.

Аналогично текстурам, необходимо также добавить деревья. Щелкните Edit Trees > Add Tree.

Unity предложит вам префаб дерева, которое вы хотите использовать. Нажмите на маленький круг, и появится другое окно. На этот раз оно покажет вам все готовые префабы, которые у вас есть в вашем проекте.

Выберите префаб дерева Broadleaf_desktop и нажмите Add. Это закроет окно prefab и добавит выбранное дерево в проект.

Теперь вы можете выбрать пальму, чтобы нарисовать ее на своем ландшафте.

В разделе Settings вы найдете несколько параметров, которые вы можете настроить, когда размещаете деревья в своей сцене. Brush Size определяет область, где вы будете рисовать, в то время как Tree Density определяет количество деревьев, которые вы будете иметь в нарисованной площади. Высокие значения будут означать больше деревьев. Tree Height позволит определить, как изменяется высота. Можно задать значение в произвольном порядке и использовать интервал значений, или задать определенное значения. Вы можете отключить параметр Lock Width to Height, чтобы сделать их одинаковыми.

В разделе Lighting вы можете установить, как генерируются световые карты для ваших деревьев.

Чтобы нарисовать деревья на поверхности, переместите указатель мыши на сцену. Синяя область представляет собой кисть. Если выбран тип дерева, нажмите левую кнопку мыши на поверхности и начните создавать деревья.

Чтобы удалить деревья из определенной области, нажмите Shift и используйте левую кнопку мыши. Это очистит все деревья в области кисти. Если вы просто хотите стереть определенный тип дерева, удерживайте Control вместо Shift. Это очистит только выбранный тип дерева.

Вы всегда можете изменить или удалить тип дерева, выбирая его и нажав кнопку Edit Trees. Чтобы изменить дерево, нажмите кнопку Edit Tree и, чтобы удалить его, нажмите кнопку Remove Tree.

Наконец, вы заметите, что внутри компонента Terrain Collider у вас есть поле с именем Enable Tree Colliders. При выборе этого параметра можно включить коллизии между другими игровыми объектами и деревьями.

Если вы не хотите вручную рисовать деревья, вы можете использовать кнопку Mass Place Trees. Если вы нажмете ее, появится новое окно. Затем Unity попросит вас создать несколько деревьев. Установите Number of Trees и нажмите Place. Затем Unity рандомно размещает деревья на поверхности.

Следующий шаг — творческое заполнение ландшафта деревьями. Чтобы создать разные деревья, вы также можете добавить новые деревья, такие как Palm_Desktop, Broadleaf_Mobile и Conifer_Desktop. Для этого используйте параметр Edit Trees в меню Trees (на вкладке Inspector).

Вы можете создать что-то вроде этого изображения (или что-то совершенно другое).

Когда вы будете готовы, можете переходить к следующему шагу.

Инструмент для создания других элементов

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


Чтобы добавить детали в ландшафт, выберите свой ландшафтный объект из иерархии. На вкладке Inspector нажмите на шестую кнопку, ту, которая с цветами.

Как можно видеть, у вас теперь есть аналогичный интерфейс, как и у Height Tools. Здесь также имеется набор кистей, которые можно выбрать, чтобы нарисовать список деталей.

Поскольку вы не выбрали какие-либо детали объекта, добавим их, нажав Edit Details > Add Grass Texture.

Откроется окно, в котором можно задать несколько свойств для травы. Detail Texture позволяет вам определить текстуру, которая будет использоваться для травы. Вы также можете установить несколько свойств, таких как Max Width, Min Width, Max Height, Min Height, Noise Spread, Healthy Color, Dry Color и Billboard. Все эти свойства определят, как будет выглядеть ваша трава.

Для этого урока вы можете оставить параметры по умолчанию или изменить их по своему желанию.

Нажмите на круг перед полем Detail Texture. Это откроет новое окно. Найдите GrassFrond01AlbedoAlpha, выберите его и нажмите Add.

Как и для деревьев, вы можете использовать несколько кистей для рисования травы. Вы можете установить различные размеры Brush Sizes, изменить Opacity и Target Strength.

Настало время быть креативным, и покрасить ландшафт травой.

Если вы хотите добавить меши, чтобы нарисовать детали на вашем ландшафте, например камни, вам нужно повторить тот же процесс, что вы делали с импортом травы. Однако на этот раз при нажатии кнопки Edit Details выберите Add Detail Mesh. Откроется окно, где можно задать несколько параметров для мешей деталей, очень похожее на то, которое использовалась для импорта травы.

К сожалению, ассеты окружающей среды не включают в себя префаб камень, поэтому вы не сможете сразу рисовать камни. Тем не менее, вы можете искать некоторые камни в Unity Asset Store, так как это отличное место для поиска бесплатных ассетов.

Заключение

На этом заканчивается руководство по инструментам ландшафтного движка Unity. Вы узнали о нескольких инструментах и ​​конфигурациях ландшафта. Благодаря этим знаниям вы можете создавать, изменять и улучшать текущие или новые ландшафты для своей новой передовой игры или приложения.

Unity имеет активную экономику. Существует много других продуктов, помогающих построить проект. Характер платформы также делает ее великолепным вариантом, благодаря которому вы можете улучшить свои навыки. В любом случае, вы можете видеть все, что у нас есть на Envato Marketplace.

Если у вас есть вопросы или комментарии, как всегда, не стесняйтесь писать в разделе для комментариев.

Unity5. Создание ландшафта реальной местности

Создаем ландшафт реальной местности.

Создание ландшафтной местности в игровых движках всегда требует большого объема работ и затрат времени, тем более если вы пытаетесь создать ландшафт с какой-нибудь реальной местности. Для упрощения этих работ в Unity5 есть функция импорта ландшафтной местности из других программ. Давайте попробуем создать ландшафт реальной местности при помощи сайта terrain.party и программы GeoControl v2.

Делаем карты высот.

Для на чала перейдем на сайт и сохраним участок какой-нибудь местности.

Выберете участок местности и увеличьте масштаб до максимума, далее уменьшите размеры квадрата до минимальных (8 км) и нажмите на облачко.

Сохранится архив с несколькими текстурами разного качества, в дальнейшем нам нужна будет только текстура высокого качества.

Далее установите программу GeoControl v2. Настройки установки программы можно оставить стандартные. Запустите программу, потребуется ввести имя Team GRB и затем ключ 323825dc6fe6784994206bf8b9db2b45.

Теперь нам нужно импортировать нашу текстуру в эту программу, сделать это очень просто нажмите Generation — Terrain import — Image import .

Выберете нашу текстуру и посмотрите какая карта высот у вас получилась.

Осталось только экспортировать все это в Unity. Нажимаем Generation — Terrain export — Raw(16bit)fot Carrara, напишем имя и укажем место сохранения.

Открываем Unity5 и создаем террейн (если у он вас еще не создан). переходим в настройки Terrain и в самом низу нажмем import raw. Выберите ту карту высот которую мы сохранили и нажмите Import.

При сохранении карты высот в программе GeoControl v2 были указаны размеры карты 2048 х 2048, по этому и в настройках terrain в Unity желательно указать такие же параметры (тут на ваше усмотрение я указал размер карты 3000 х 3000)

Наш ландшафт получился приблизительно похож на реальную местность, конечно точного сходства нет и есть массу отличий в размерах вершин и впадин, но это можно по желанию исправить уже инструментами Unity 5.

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

Инструкция по созданию демо-ландшафта в Unity за 24 часа

    Цукерберг Позвонитsiliconrus.comрынок игр
  • Настрочить жалобу в спортлотоautoRSS
  • Распечатать

Похожие публикации

Программная генерация игровых 2D-миров в Unity — описание алгоритма

Вместе с Unity ЦП публикует истории разработки игровых проектов, созданных на базе популярной технологии. Расскажите о своём кейсе, чтобы попасть в рубрику.Игровой разработчик из Кэмбриджа Джош Ньюман написал для издания Gamasutra колонку о том, как при помощи движка Unity можно создавать

История создания King of Bugs: От ИТ-бизнеса к разработке игр

Вместе с Unity ЦП публикует истории разработки игровых проектов, созданных на базе популярной технологии. Расскажите о своём кейсе, чтобы попасть в рубрику.Менеджер King of Bugs, сооснователь компании S Media Link Дмитрий Григоренко написал для рубрики Unity колонку о том, как создалась игра «Карл

История разработки мобильного гоночного раннера Traffic Nation на движке Unity

Вместе с Unity ЦП публикует истории разработки игровых проектов, созданных на базе популярной технологии. Расскажите о своём кейсе, чтобы попасть в рубрику.Сегодня в Unity — рассказ ведущего разработчика студии LaikaBOSS Games о процессе создания гоночного раннера Traffic Nation.

Конференция Unite 2015: основные анонсы и нововведения игрового движка Unity

Вместе с Unity ЦП публикует истории разработки игровых проектов, созданных на базе популярной технологии. Расскажите о своём кейсе, чтобы попасть в рубрику.Сегодня в рубрике — краткий обзор прошедшей в Амстердаме конференции для игровых разработчиков Unite 2015 от представителей компании Unity.

Джеси Фриман, Amazon: Что лучше для разработчика игр — HTML 5 или Unity

Евангелист компании Amazon Джеси Фримен рассказал о двух популярных платформах для разработки игр — Unity и HTML5. Фримен сравнивает их по трем критериям: легкость установки, разработки и публикации (сборки под разные платформы в случае c Unity). ЦП публикует перевод материала с комментариями

Разработчика игровых технологий Unity оценили в $2 млрд

Руководство создателя игровых движков Unity Technologies рассматривает возможность продажи компании за $1-2 млрд. Об этом сообщают источники Venturebeat.

Создание ландшафта на Unity за 24 часа

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

Думаю все заметили, что сейчас стало появляться множество всяких бродилок с выживанием в стиле Minecraft. Сделать такую решился и я. Начало было лёгким — Unity3d имеет огромный функционал для сознания простеньких игр (и не только). Персонаж, игровые объекты, в общем основу сделать быстро. Но какой minecraft без рандомно генерируемого мира? Это стало первой трудной задачей. И думаю не только для меня. Просмотрев весь гугл и потратив кучу времени на эту бесполезную вещь я решил написать эту статью дабы сократить страдания других.

Дальше вас ждёт описание алгоритмов (и код) создания более менее реалистичных ландшафтов. Уточню, что все примеры на C#.

Для начала хорошо бы было разобраться, что подразумевается под генерацией ландшафта:

    Генерация карты высот. Это самая главная часть, по карте высот строится terrain (или mesh). Её можно также использовать для окрашивания terrain в зависимости от высоты

Мастер Йода рекомендует:  Создаём приложение с чистой архитектурой на Java 11

и для расстановки игровых объектов.
Построение ландшафта. Есть два способа выполнения этого пункта, в зависимости от того не хотите ли вы сложностей и используете ли вы unity3d, или же вам плевать на производительность, но вам важно, чтоб было красиво. В первом случае советую использовать встроенный в unity3d редактор ландшафта (terrain).

Простенький код для этого:

Terrain terrain = FindObjectOfType (); // Находи наш terrain
float[,] heights = new float[resolution,resolution]; // Создаём массив вершин

// .
// Делаем с heights всё, что хотим
// .

terrain.terrainData.size = new Vector3(width,height,length); // Устанавливаем размер нашей карты
terrain.terrainData.heightmapResolution = resolution; // Задаём разрешение (кол-во высот)
terrain.terrainData.SetHeights(0, 0, heights); // И, наконец, применяем нашу карту высот (heights)

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

Shader «Custom/TerrainShader» <
Properties <
_HTex («heightMap texture», 2D) = «white» <>
_GTex («grass texture», 2D) = «white» <>
_RTex («rock texture», 2D) = «white» <>
>
SubShader <
Tags < "RenderType"="Opaque" >
LOD 2048

CGPROGRAM
#pragma surface surf Lambert
sampler2D _GrassTex;
sampler2D _RockTex;
sampler2D _HeightTex;
struct Input <
float2 uv_GTex;
float2 uv_RTex;
float2 uv_HTex;
>;

void surf (Input IN, inout SurfaceOutput o) <

float4 grass = tex2D(_GTex, IN.uv_GTex);
float4 rock = tex2D(_RTex, IN.uv_RTex);
float4 height = tex2D(_HTex, IN.uv_HTex);

o.Albedo = lerp(grass, rock, height);

Здесь мы получили на вход 3 текстуры: карта высот, текстуры травы и камня. Далее мы смешиваем текстуры камня и травы по карте высот, используя функцию lerp(). И на выход мы подаём нашу карту высот но окрашенную в нужные текстуры.

Итак, поняв общий план действий, надо приступать к делу.


С самого начала я думал, что всё будет очень просто и для рандомной генерации ландшафта можно обойтись обычной функцией Random(). Но это самый неправильный способ. Его результат это вовсе не красивая карта, а расчёска в приближении.

Существуют множество способов создания карты высот, но почти все они схожи в одном — использование шумов. Самый первый алгоритм, который мне попался это метод с использованием шума Перлина

Perlin noise (Шум Перлина, также иногда Классический шум Перлина) — математический алгоритм по генерированию процедурной текстуры псевдо-случайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использоваться для генерации эффектов дыма, тумана и т.д.

Думаю многих испугала приставка псевдо, но от неё легко избавиться. Далее представлен способ реализации шума в Unity3d:

using UnityEngine;
using System.Collections;

public class PerlinNoisePlane : MonoBehaviour <
public float power = 3.0f;
public float scale = 1.0f;
private Vector2 startPoint = new Vector2(0f, 0f);

void Start () <
MakeNoise ();
>

void MakeNoise() <
MeshFilter mf = GetComponent (); // Ищем mesh
Vector3[] vertices = mf.mesh.vertices; // Получаем его вершины
for (int i = 0; i private int height=2048;
private float WH;
private Color32[] cols;
private Texture2D texture;

void Start ()
<
int resolution = width;
WH = (float)width+height;

// Задаём карту высот
Terrain terrain = FindObjectOfType ();
float[,] heights = new float[resolution,resolution];

// Создаём карту высот
texture = new Texture2D(width, height);
cols = new Color32[width*height];
drawPlasma(width, height);
texture.SetPixels32(cols);
texture.Apply();

// Используем шейдер (смотри пункт 3 во 2 части)
material.SetTexture («_HeightTex», texture);

// Задаём высоту вершинам по карте высот
for (int i=0; i float newHeight = h * 0.5f;

if (w >
else
<
float m > float edge1 = (c1 + c2) * 0.5f;
float edge2 = (c2 + c3) * 0.5f;
float edge3 = (c3 + c4) * 0.5f;
float edge4 = (c4 + c1) * 0.5f;

if(!FLAT) <
if (m > <
m > >
else if (middle > 1.0f)
<
m > >
>
divide(x, y, newWidth, newHeight, c1, edge1, middle, edge4);
divide(x + newWidth, y, newWidth, newHeight, edge1, c2, edge2, middle);
divide(x + newWidth, y + newHeight, newWidth, newHeight, middle, edge2, c3, edge3);
divide(x, y + newHeight, newWidth, newHeight, edge4, middle, edge3, c4);
>
>
>

Создание и редактирование terrain’ов

Вы можете добавить объект terrain’а в сцену, выбрав GameObject > Create Other > Terrain из меню (это также добавит соответствующий ассет terrain’а в окно Project). При этом, ландшафт изначально будет ничем иным, как просто большой, плоской равниной. Однако, если вы посмотрите на инспектор при выделенном объекте terrain’а, вы увидите, что там представлен ряд инструментов, которые вы можете использовать для создания любых нужных вам ландшафтов.

Инструменты редактирования terrain’а, появившиеся в инспекторе

За исключением инструмента размещения деревьев и панели настроек, все остальные инструменты на панели инструментов обеспечивают набор “кистей” и настроек для размера и прозрачности кисти. То что, эти кисти похожи на кисти из графических редакторов — не совпадение, т.к. именно так создаются детали у terrain’а, с помощью их “рисования” на ландшафте. Если вы выберете первый слева инструмент на панели инструментов (Raise/Lower Terrain) и передвинете мышь над terrain’ом в окне Scene, вы увидите, что курсор напоминает прожектор на поверхности. Кликая кнопку мыши, вы можете нарисовать постепенные изменения в высоте ландшафта в точке расположения мышки. Вы можете менять форму кисти в панели Brushes. Опции Brush Size и Opacity влияют на область кисти и силу “нажима” соответственно.

Подробное описание для каждого из инструментов можно найти в соответствующих разделах. Однако, все они основаны на концепте рисования деталей и, за исключением инструмента размещения деревьев, все они имеют одинаковые настройки кистей, размер кисти и “нажим”. Инструменты можно использовать для изменения высоты terrain’а, для добавления окраски, для размещения растительности и других объектов.

Быстрые клавиши terrain’а

Вы можете использовать следующие сочетания клавиш в инспекторе terrain’а:-

  • Нажатия на клавиши от Q до Y с зажатой клавишей shift выбирают соответствующий инструмент (например, Shift-Q выбирает инструмент Raise/Lower).
  • Запятая (,) и точка (.) циклично переключают доступные кисти.
  • Shift-запятая ( ) циклично переключают доступные объекты для деревьев, текстур и деталей.

Кроме того, стандартная клавиша F работает несколько иначе для terrain’ов. Обычно, она показывает в кадре окна Scene выбранный объект, если мышка располагается в окне Scene. Однако, так как terrain’ы обычно очень крупные объекты, нажатие F будет фокусировать вид окна Scene на области terrain’а, над которой в данный момент находится мышь/кисть. Это обеспечивает очень быстрый и интуитивный способ перепрыгивания к области terrain’а, которую вы желаете отредактировать. Если вы нажимаете F, когда мышка удалена от объекта terrain, клавиша работает в обычном режиме, как описано выше.

Информационный портал по безопасности

Загрузка реальных ландшафтов в Unity 3D

Автор: admin от 23-05-2020, 13:50, посмотрело: 1401

Введение

Тема генерации ландшафтов путем применения разнообразных хитроумных алгоритмов достаточно широко освещалась на хабре ( раз , два , три и продолжать можно до бесконечности). Перечисленные примеры касаются случайной генерации некой абстрактной местности для повышения реализма в конечных игровых продуктах. А как быть, если требуется смоделировать некую реальную местность?

По этой теме тоже довольно много разного рода публикаций в сети. Однако, многие из них опираются на использование платных приложений или расширений для Unity. Существуют описания и «дешевых» методов, но основная масса их ориентирована на получение так называемых heightmap — черно-белых квадратных изображений местности, где градациями серого определяется относительных уровень высот в данной точке. Существует ряд способов генерации подобных карт высот с использованием например инструментария GDAL . И такой подход не лишен недостатков, связанных с достаточной громоздкостью процедуры создания карты высот и последующей привязкой к полученной местности. Поэтому, в данной статье будет изложен некий альтернативный подход и интересующиеся приглашаются под кат.

1. Добыча геоданных

Тут всё уже давно изобретено до нас, за что следует благодарить NASA, выполнивших в свое время программу SRTM (Shuttle Radar Topography Mission) по радиолокационному картонированию земной поверхности. Данные, полученные в ходе миссии находятся в открытом доступе вот здесь . Идем по этой ссылке и наблюдаем

наш родной «шарик» поделенный на зоны. Для демонстрации описываемой методики выберем район «крыши мира», гору Эверест. Для этого щелкаем по нужному куску карты и жмем кнопку «Download».

Распаковываем скачанный архив, и находим там среди прочего файл srtm_54_07.tif в формате GeoTIFF. GeoTIFF — открытый стандарт хранения картографической информации. Анализируя данный файл можно получить данные по высотам точек земной поверхности. Так как формат открытый, организовать непосредственную работу с ним, скажем из Unity будет несложно, но мы, пока, для упрощения, пойдем более коротким путем и воспользуемся маленькой но полезной программкой 3DEM . Это софтинка бесплатна и легко качается с официального сайта. Качаем её и открываем в ней добытый нами GeoTIFF района Эвереста. При открытии нас попросят выбрать формат геоданных, выбираем GeoTIFF

после чего выбираем вышеупомянутый файл и видим такую картину

Показанный район довольно велик. Прямоугольником по центру показан интересующий нас район горы Эверест. Чтобы вырезать нужный кусок жмем F8, выбираем интересующую нас область и жмем Enter. Нам предложат уточнить границы участка по широте и долготе.

Уточняем если нужно и нажав ОК получим интересующий нас район на экране

Если надо, повторяем эту процедуру. В конце концов мы выберем нужный район, а затем идем в главное меню по пути File -> Save Terrain Matrix. Нам предложат выбрать формат сохраняемых данных

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

  • everest.hdr — текстовый файл с описанием сохраненного участка и формата хранения данных
  • everest.bin — сами данные, которые есть просто двухмерный массив высот в формате с плавающей запятой одинарной точности

3. Описание формата хранения геоданных

Его нетрудно получить из pdf-документа, идущего вместе с 3DEM. Главная информация находится в *.hdr-файле и выглядит она так

file_title = everest
data_format = float32
map_projection = Lat/Lon
left_map_x = 86.859001
lower_map_y = 27.899000
right_map_x = 87.014999
upper_map_y = 28.046000
number_of_rows = 177
number_of_columns = 188
elev_m_unit = meters
elev_m_minimum = 4574
elev_m_maximum = 8794
elev_m_missing_flag = -9999

Опишу самые важные для нашей задачи поля

  • file_title — имя *.bin-файла с данными
  • data_format — формат представления данных
  • left_map_x, lower_map_y — долгота и широта левого нижнего угла участка (считаем что верх этого условного «прямоугольника» смотрит на север), в градусах
  • right_map_x, upper_map_y — долгота и широта правого верхнего угла участка, в градусах
  • number_of_rows — число строк в матрице данных. Каждая строка описывает высоты на фиксированной широте из указанного координатами углов диапазона с равным шагом.
  • number_of_columns — число столбцов в матрице данных
  • elev_m_unit — единицы измерения высот
  • elev_m_minimum — минимальная высота над уровнем референсного эллипсоида (для простоты — уровнем моря) на данном участке
  • elev_m_maximum — максимальная высота над уровнем референсного эллипсоида

Таким образом, становится понятно как читать бинарный файл — он просто поток float’ов, записанных в файл построчно. Эта матрица, в нашем случае хранит высоты в 177 х 188 = 33276 точках на выбранном участке, ограничения по долготе и широте для которого нам известны. Так же нам известен и диапазон высот на данном участке.

3. Хранение данных о высотах в Unity

Класс Terrain в Unity имеет публичное поле terrainData, через которое можно получить доступ к следующим полям

  • heightmapResolution — разрешение карты высот. Оно кратно степени двойки, выбирается из ряда 128, 256, 512… с добавлением единицы. По умолчанию оно равно 513 х 513
  • size — реальный размер террейна в условных единицах Unity. Это поле имеет тип Vector3, и задает размер террейна сразу по всем осям.
  • SetHeights(int xBase, int yBase, float[,] heights) — метод для загрузки данных карты высот. xBase, yBase — индексы, начиная с которых карта высот читается движком из массива heights.

Карта высот — квадратный массив вполне определенного размера. Матрица геоданных — массив прямоугольный. Вычитать её из файла дело техники, и подобный код настолько прост, что специально приводить его не имеет смысла. Главная сложность, преобразовать данные GeoTIFF к карте высот, удовлетворяющей следующим требованиям

  • квадратная матрица, размером кратным степени двойки + 1
  • высоты, хранимые в матрице, нормированы в диапазоне от 0.0 до 1.0

4. Преобразование геоданных в карту высот

Нормировать высоты достаточно просто

где level[i,j] — нормированная высота; h[i,j] — высота в точке (i,j); h_min, h_max — минимальная и максимальная высота на участке. Для приведения размера матрицы к выставленным требованиям нужна аппроксимация высоты в зависимости от координаты. Воспользуемся простейшей линейной аппроксимацией. Пусть высота есть функция координат точки на участке

, совпадающую с одним из узлом заданной координатной сетки и разложим эту функцию в ряд Тейлора

При кажущейся сложности, формула легко реализуется кодом на C#

Пользуясь этой функцией легко формируем матрицу для карты высот

5. Плагин для редактора Unity

Чтобы облегчить жизнь мной был написан небольшой плагин для редактора движка UnityGeoDataLoader , позволяющий решать поставленную задачу. Этот продукт и его исходный код распространяются по лицензии GNU GPL v2.0. По указанной ссылке можно получить и то и другое. Там же есть и инструкция по использованию данного инструмента.

Плагин встраивается в редактор и добавляем в главное меню пункт «Tools -> Load GeoData». Выбрав террейн в инспекторе, жмем этот пункт меню, указываем путь к файлу *.hdr (рядом с которым лежит и файл *.bin с данными) и вуаля — лицезреем гору Эверест в редакторе Unity

Дальше с этим террейном делаем всё что душе угодно — текстурируем, применяем шейдеры, расставляем другие объекты. Это уж на ваше усмотрение.

Заключение

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

Дорого ли обходится бесшовный мир в Unity3D?

Имею ввиду вычислительные затраты.


Вычитал тут на одном форуме:

Но не совсем понял: что значит разбить? имеется ввиду расположить несколько небольших террейнов впритык друг к другу? А если так, то почему это будет легче обрабатываться?

В общем, нужны ваши советы.

sio666
> Но не совсем понял: что значит разбить? имеется ввиду расположить несколько
> небольших террейнов впритык друг к другу?
Вроде да.

sio666
> А если так, то почему это будет легче обрабатываться?
Можно отсечь невидимые куски и не рисовать их. Но вообще любой нормальный движок должен сам разбивать ландшафт или ещё как-то оптимизировать его отрисовку. Я очень удивлюсь, если Юнити не делает таких оптимизаций.

> Террейны, больше 2 х 2 км. сильно тормозят. Если нужно 32 х 32 км. то необходимо разбить такой террейн на сетку по 2 х 2 то есть : 324 «небольших» террейна.
sio666, а чего ты ждал от людей, которые не могут даже верно посчитать количество квадов 2*2 внутри массива 32*32 ? )))

sio666
> Вычитал тут на одном форуме:
Фиг знает, я создавал, ничего не тормозит. Ландшафты в юнити и так нормально сделаны.

Сейчас создал ландшафт размером 36000х36000 (1 метр равен 1.0 — не самое лучшее решение из-за размера флоата, нужно бы меньше брать флоат, например метр равный 0.01,но для теста пойдет). Поставил камере Far в 36000 чтобы она ничего не обрезала, накидал текстур. Побегал. Ничего не тормозит — 15 DIP в кадр. Всего 5 МБ vram.

Когда-то я смотрел пиксом — все там есть и лоды, и разбиение на куски через квадтри, и отбрасывание невидимых кусков фрустумом.

Возможно тормозит на мобилках, ну так и нечего еще такое от них требовать

Я вангую что человек это написавший захотел сделать ландшафт в 200 км. При этом также за 1 метр взял 1 флоат. Ну и нарвался на превышение переменной. Тогда да, оно все начинает жутко лагать. Но не из-за ландшафта, а потому что юнити пытается остаться работоспособным. К сожалению юнитеки догадались в гуи вывести это сообщение (в инспекторе), но не догадались его вывести в логе (например если какая-нибудь позиция выехала за пределы размера флоата через скрипт). Это никак прямо не исправить пока юнитеки не перейдут на двойную точность позиций

> например если какая-нибудь позиция выехала за пределы размера флоата через скрипт
war_zes, это какая? x = 200 квадрильонов? )))

slava_mib
в юнити это так (200 км, при 1 метре на 1 флоат — это всего лишь 200000):

И оно при запуске начинает дико лагать и графические артефакты

Вообще если честно, я не силен в этой теме (сам столкнулся неожиданно). Поэтому даже не знаю как это правильно зовется. Просто видел что в логах обновлений unigine и UE4 была новость про переход на двойную точность (опять же может не правильно называю/перевожу этот термин) чтобы делать мир большим, так как обычной float точности для очень больших миров (в основном нужны только в симуляторах) не хватает

war_zes
> Это никак прямо не исправить пока юнитеки не перейдут на двойную точность
> позиций
А перейдут ли? В описании одной из видеокарт вычитал вот что:

Разница в производительности в 8 раз как бы намекает.

sio666
> Разница в производительности в 8 раз как бы намекает.
Я где-то слышал про 2 раза — это у AMD что ли?

А вообще можно использовать двойную точность при расчётах на CPU, а в шейдеры уже передавать в каком-нибудь другом пространстве.

Мастер Йода рекомендует:  Что делать после изучения основ HTML

Создание реалистичных виртуальных ландшафтов

3D-художник Алиреза Хаджехали – настоящий мастер ландшафтного дизайна. Он создал бесчисленное количество виртуальных локаций, полностью играбельных в UE4. В этом интервью она описал свой рабочий процесс и рассказал о том, как WorldMachine и Megascans помогают ему конструировать большие и реалистичные цифровые миры.

Это не туториал, а интервью, которое поможет представить рабочий процесс. Обучающая статья заняла бы более десяти страниц.

С оригинальным материалом можно ознакомиться тут.

Введение

Всем привет! Меня зовут Алиреза Хаджехали, и я здорово подсел на реализм. В данный момент я получаю степень бакалавра по специальности «Программирование», и мой выпуск должен состояться примерно через 8 месяцев. Что касается 3D-графики, то здесь я самоучка, и эта область знаний для меня – настоящая страсть. Именно она и помогает мне двигаться вперед.

Все началось с того, когда я обнаружил, что у моего Crysis 1 есть редактор, который можно открыть двойным кликом мышки и тут же стать игровым разработчиком. «Никогда не говорите ребенку, что посадить пару деревьев – это непосильная задача!» Вскоре вышел CryENGINE 3 Free SDK, после чего моей основной деятельностью стали создание сцен и помощь маленьким инди-проектам, плюс я несколько лет проводил кучу свободного времени за бесплатной работой и в один прекрасный момент смог, наконец, представить себя как художника окружения с солидным портфолио.

Из того, что я делал недавно, можно выделить LawBreakers, где я делал природные фоны для уровней. Работая над Chronicles of Elyria, я был в позиции универсала, то есть создавал и игровые уровни, и рекламные шоты. Кроме того, я делал ландшафт в Squad и сейчас работаю с друзьями над Our Ghosts of War, это личный проект.

Я думаю, каждый художник окружения мечтал заниматься этим с самого детства. К примеру, когда мне было 4-5 лет, то я всегда, смотря фильмы, думал о том, как бы я оформил декорации, доверь они это дело мне. Мне всегда нравилось комбинировать вещи таким образом, чтобы они отлично смотрелись друг с другом – именно это я и делал в CryENGINE 2 в свои моддеррские деньки.

Переход от маленьких сцен к обширным пространствам произошел, когда я впервые увидел Battlefield 3. Я был очень впечатлен этими огромными пейзажами и особенно – работой Эндрю Гамильтона. Он собаку съел на всем, что касается открытых локаций, поэтому в его работе все детали изумительны и находятся в полной гармонии друг с другом. В общем-то, в этом и есть секрет хороших открытых ландшафтов. «Не нужно недооценивать что-либо, исходя из размера. Даже маленькая галька на земле так же важна, как и огромные горы!» На тот момент я по-прежнему пользовался CryENGINE 3, но из-за недостатка инструментов для создания больших открытых пространств я таки бросил его и перешел на UE 4.0.1.

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

Процесс создания

Работа над каждой сценой начинается с идеи, родившейся в голове, или с картинки-референса. К примеру, недавно я создал кусочек Исландии, и этот проект начался с того, что я случайно увидел классные фотки полуострова Рейкьянес. Локация, которую я сделал после, была вдохновлена сценой из фильма «Безумный Макс: Дорога Ярости».

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

Генерация ландшафта

Как правило, для генерации карты высот я использую WM2 (World Machine 2). Далее беру карты высот и несколько масок, с их помощью делая карту веса (splat map). Использование карты веса для ландшафтов – это старый, но по-прежнему самый лучший метод. Я также экспортирую карту высот в сетку, а затем использую эту сетку для дизайна фонов локации. Для этого я сначала упрощаю сетку, а затем запекаю высокополигональную модель в низкополигональную, чтобы у меня был низкополигональный ландшафт и карта нормалей, которые можно разместить за пределами локации и тем самым создать видимость, что локация больше, чем на самом деле. Вот две картинки, показывающие разницу с фоновыми моделями и без них:

Затем я использую 3ds Max и ZBrush для создания вспомогательных объектов для окружения. К примеру, камни. Чтобы «распластать» камни по UV-плоскости, я использую программу Unfold3D. Она, к слову, очень быстрая. Затем я делаю плиточные текстуры в UE4 при помощи нода Object Radius, чтобы плотность текселей оставалась одинаковой, как бы я не менял масштаб камня.

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

Дополнительная работа в UE4

Самое интересное начинается после того, как я импортирую в UE4 карту высот и начинаю играться с материалами, функциями, освещением, атмосферой и т.д. Я делаю кучу поправок, постоянно все меняя, пока не поймаю настроение локации.

Я использую, как правило, 4-6 материалов на один пейзаж, и конечный результат, который можно видеть на картинках, как правило, требует 3 Гб памяти RAM (4K-текстуры) и бегает с частотой от 60 до 100 кадров в секунду на моей 970, что неплохо для мира площадью в 64 квадратных километра, с динамическим глобальным освещением (при помощи LPV) и включенной тесселляцией (от англ. «tessellation»; это технология, разбивающая полигоны на мелкие части, которые затем можно использовать для улучшения качества картинки), меняющейся в зависимости от расстояния.

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

А вот еще одна функция, которая в качестве входной информации использует траву и на ее основе позволяет создавать бесконечное количество вариаций – не генерируя новые текстуры, а просто по-другому окрашивая траву. Впрочем, иной раз для того, чтобы пространство не выглядело однообразно, достаточно лишь одного типа травы, безо всяких вариаций.

Геометрия

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

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

К сожалению, при создании карты высот в WM2 трудно уловить чувство масштаба, и эта программа больше не обновляется. Поэтому я просто импортирую карту высот в UE4 и немного бегаю туда-сюда, чтобы понять, правильный ли получился масштаб. Потом вы немного привыкаете к этому масштабу и далее просто доверяете своему выбору.

Текстуры

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

Теперь к важному. Вы об этом не спрашивали, но, как мне кажется, этим стоит поделиться. Неважно, Megascans это или нет, но когда вы импортируете текстуру в движок, она начинает выглядеть посредственно. В библиотеке Megascans поверхности отрендерены в миллионы полигонов. Мельчайшая детализация, все в 3D, поддержка теней и генерация AO. Но совсем другое дело, когда вы импортируете эти материалы в игровой движок. В игровых движках поверхности выполнены с небольшим количеством полигонов – как правило, 2 треугольника на один квадратный метр. Но есть способы это обойти. Среди художников окружения есть расхожее мнение, что на PBR-движке металлическим материалам не нужна карта отражений. Также многие ошибочно думают, что на карте альбедо не должно быть теней. Согласиться с этим категорически не могу.

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

Если удалить эти тени с карты альбедо, то игровой движок их реконструировать не сможет – независимо от того, используете ли вы отдельную карту для AO или нет. AO-карты никак не повлияют на текстуру, если поверхность находится под освещением, т.к. они работают, только если поверхность покрыта тенями. Так что эти микротени нужно добавлять на карты альбедо. Некоторые люди зачем-то удаляют эти тени, затем используют отдельную AO-карту, а затем объединяют ее с картой альбедо в редакторе материалов, но я не понимаю, зачем удалять тени, а затем снова их добавлять ценой дополнительной AO-карты.

Эти микротени представляют собой трещины и дыры в поверхности, и они, как правило, всегда темные, потому что свет от них почти не отражается. Но есть один момент. Если у вас за отражение отвечает одно и то же значение, это значит, что вся поверхность отражает свет одинаково, и это, если принять во внимание пример выше, неправильно, потому что от этих дыр и трещин света практически не отражается, поэтому значение отражения для этих дыр и трещин должно быть меньше, чем для плоской поверхности.

Я не использую для этого отдельную карту отражений, т.к. это лишняя трата вычислительных ресурсов. Но я могу задействовать карту отражений на карте альбедо, добавив нод Clamp (он ограничивает заданное значение в пределах определенного диапазона) с минимальным значением «0» и максимальным «0,5» («0,5» – это отражение на большинстве неметаллических поверхностей). Чтобы добавить вариативности на получившуюся карту отражений и сделать поверхность более интересной, мы можем пропустить ее через нод Power (он берет заданное значение и умножает его на себя определенное количество раз), чтобы сделать более контрастной перед тем, как за работу примется нод Clamp. Это позволяет сделать поверхность более правдоподобной, поскольку теперь дыры и трещины не отражают свет так же, как и плоская поверхность.

Ниже – пара фотографий, демонстрирующих разницу между обычной текстурой для камня и текстурой, куда я добавил изменения, о которых рассказал выше.

А вот то же самое, но если смотреть только через буфер отражений.

Здесь также можно было бы рассказать об эффекте Френеля, но поскольку этот текст и так превращается в «Войну и мир», то я, пожалуй, воздержусь. Может быть, в следующий раз.

Оптимизация

Способов оптимизировать окружение есть великое множество, и некоторые из них я использую для своих пейзажей. Думаю, самый лучший метод – это укладка в каналы (от англ. «channel packing»; это техника, при которой каналы R, G и B изображения используются для хранения различных данных), он помогает сберечь ресурсы памяти и уменьшить сложность шейдеров. То есть вы можете уложить три монохромные карты альбедо в одну RGB-текстуру, а затем раскрасить каждый канал в редакторе материалов. Я, правда, этим методом не пользуюсь, т.к. стараюсь сохранить оригинальную цветовую информацию. Но что я делаю, так это помещаю карту смещения (displacement map) в синий канал карты нормалей и выставляю тип компрессии на «Masks». Затем я простой математикой реконструирую синий канал карты нормалей в редакторе материалов, что позволяет мне не использовать отдельную карту смещения. Выставление типа компрессии на «Masks» снижает использование памяти примерно на 50%. Я также, бывает, извлекаю карту неровностей из карты альбедо и помещаю ее в альфа-канал карты нормалей, но редко – лишь в случаях, когда нужна уникальная карта неровностей.

Что касается сеток для камней, то я, как правило, не экономлю треугольники, и стараюсь придерживаться уровня примерно в 30 тысяч треугольников на камень – это очень помогает погружению, если игрок вдруг окажется рядом с таким камнем. Кроме того, я использую, как правило, 4 или 5 уровней детализации – чтобы при перемещении игрока объект не дергался. Кроме того, я стараюсь максимально снизить количество треугольников на уровень детализации, при этом сохраняя форму, поэтому у меня не получается так, что на 0-ом уровне детализации я вижу камень, а на 5-ом – базуку.

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

Освещение

Прощу прощения, но этот раздел обещает быть большим. Системам для работы с PBR-материалами нужно физическое освещение. Я имею в виду, что мы должны знать, сколько именно света мы проливаем на наши материалы, иначе смысл в использовании PBR для создания реалистичных ландшафтов, по сути, попросту теряется.

К сожалению, свечение от солнца в UE4 не измеряется в единицах измерения вроде люксов, поэтому мы, в сущности, не знаем, сколько света излучаем на создаваемый мир. Впрочем, есть несколько способов, позволяющих рассчитать эту величину, но результат вряд ли будет таким же удовлетворительным, как с физическим светом. Поэтому я поделюсь с вами собственными находками. Если у вас облачная погода, то вам нужна, собственно, облачная небесная сфера и параметр «Skylight Intensity», выставленный «1». Для солнечно-облачного денька параметр «Sun Intensity» лучше выставить на «3.14», а «Skylight Intensity» имеет смысл немного снизить – для поддержания хорошего контраста между светом и тенью. Если у вас меньше облаков и больше солнца, то для «Sun Intensity» подойдет значение «4» или «5». Для выжженных пустынь с беспощадным солнцем параметр «Sun Intensity» можно выставить на «7».

Но я очень не рекомендую идти выше «7», поскольку материалы начинают выглядеть хуже. Люди часто ставят «10» или даже «12», но это ошибка. В итоге либо ваши текстуры будут недостаточно освещены (они будут темнее, чем должны), либо вы станете жертвой тональной компрессии (от англ. «tone mapping»; это конвертация цветового диапазона из HDR в более «узкий» LDR). В UE4 эта функция ограничивает белый цвет, поэтому поначалу у вас получается очень блеклое изображение, и немного компенсировать это можно, лишь сильно подняв параметр «Sun Intensity». Но в итоге от такого света материалы теряют свою оригинальную детализацию. Чтобы справиться с этим, но не отключая тональную компрессию (поскольку вместе с ней отключится и куча других функций), я создал специальную таблицу – если загрузить ее в Post Processing Volume, это вернет белые цвета обратно к оригинальным позициям, а вы сможете пользоваться полным диапазоном яркости (0-255).

Разобравшись с белыми цветами, можно попробовать увеличить контраст картинки, чтобы сделать ее более интересной, правда из-за этого может пострадать реалистичность. Поэтому, если вы больше склоняетесь к «больше реализма!», чем к «даешь интересно!», то значение для контраста лучше оставить по умолчанию или около того.

Совет

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

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

Следите за тем, чтобы ваши материалы выглядели как надо. Не бойтесь менять материалы (особенно цвета), пока не достигнете полной гармонии.

Делая окружение для открытых локаций, станьте первым, кто по нему пройдется, станьте первым, кто будет судить, подходит ли эта локация хотя бы для 2-3 разных типов геймплея или нет. Будьте первым, кто позаботится о производительности и оптимизации. Упростите работу другим.

Обращайте внимание на мелкую детализацию, не делайте исключений. Камни, трава, галька, горы – не забывайте ни о чем. Не перескакивайте с одного объекта на другой, пока хорошенько его не доделаете. Один хорошо сделанный световой меч заслуживает больше уважения, чем 10 посредственных локаций.

Создавайте модульные функции, которые можно будет использовать повторно. Это здорово экономит время и усилия, попутно улучшая качество.

Не бойтесь делать по несколько проходов. Делайте одну версию, потом еще и еще, пока не поймете, что да – это оно! И учитесь у тех, кто критикует вашу работу.

Если у вас есть какие-то вопросы, можете смело писать мне. Но заранее извиняюсь, если с ответом будут задержки. Бывает, я работаю по 16 часов подряд, забывая даже почесать макушку.

Представительства сайта «80 level» в Twitter и VK.

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