Процедурное генерирование terrain в Unity3D
Недавно я начал изучать Unity. есть небольшой опыт в программирование C#/C++ я генерировал ландшафт рандомным способом в Unity я бы хотел реализовать задачу по сложней.
Есть идея сделать генерацию по картам высот, допустим у меня есть 32-ве разные карты высот с разными рельефами которые между собой гармонично связаны или могут смешиваться под воздействием некого кода на C# в Unity по этим картам надо с генерировать сам ландшафт так что бы при генерации рандомно выбиралась случайная карта высот для очередного фрагмента площади ландшафта.
К примеру с помощью кода генерируется общая площадь Х.500 Y.500 и максимальной высотой Z.250 (1)* сетки по меркам дистанции в Unity, после чего рендомно применяются к полученной площади карты высот из 32-ух штук, затем разделить на чанки .
(1)* предполагаю что будет сгенерирована плоскость с заданным потолком максимальной высоты.
1. Хочу узнать есть ли вообще возможность это реализовать.
2. Если есть такая реализация тогда напишите как реализовать или ссылки.
3. Надеюсь умные люди есть которые не разу не упомянут для примера Minecraft и все ему подобное.
4. Если не понятна тема или хотите задать вопросы для уточнения чего либо пишите в личку что бы не делать лишние посты.
P.S есть проект «Space Engine» уверен о нем знают большинство, по моему мнению в нем применяется примерно такая генерация путем сложного смешивания рельефные карты высот и шумы.
Сам Space Engine меня не интересует он о нем я упомянул только для того что бы мне не упоминал в этой теме.
Вот тут небольшой пример есть http://scrawkblog.com/2013/05/15/simple-procedural-terrain-in-unity/
может быть поможет, там идет генерация ландшафтам и засаживание деревьями из скрипта по шуму перлина, текстуры правда не процедурные, обычные, но покопаться в исходниках любопытно.
Dikoobraz
Спасибо! Это очень хороший материл для изучения.
Dikoobraz
я просмотрел почти все статьи с ужасным переводом от гула)) и нашел одно упоминание о разбиение одной большой карты высот на несколько что бы потом в дальнейшем по ним генерировать ландшафт только в этой статье не пишут о том как саму реализацию а просто то как разбить одну карту высот на десяток маленьких вот ссылка: http://scrawkblog.com/2013/02/18/automated-height-map-splitting-u… -imagemagick/
Скорей всего в коде его проектов есть что то об этом!
Ужасный перевод от гугла по сравнению с твоим рузязом — просто песня! Что здесь делают третьеклассники? о_0
Я делаю так. Создаю карту в 3д редакторе, полученную карту забиваю в массив обьектов типа треугольник. Затем сортирую треугольники так, чтобы они шли слева направо и снизу вверх. При этом нижний левый угол карты будет началом, а верхний правый угол — концом. Для каждого треугольника устанавливаю спец. флаг, который говорит о типе диагонали / или \ , а также флаг, который говорит о том, где этот треугольник находится внутри квадрата: верхний или нижний.
По произвольным координатам нахожу конкретный квадрат, например:
Размер карты 1000 на 1000
x = 200
z = 500
делю на 100 (размер квадрата)
x /=100 = 2
z /=100 = 5
z *= 10 = 50
z + x = 52
итого: 52-й квадрат из 100
По формуле присутствия точки в треугольнике нахожу из пары треугольников 52-го квадрата тот в котором находится точка — верхний или нижний.
Теперь есть четыре условия для поиска высоты точки на треугольнике:
1) диагональ / и нижний треугольник
2) диагональ / и верхний треугольник
3) диагональ \ и нижний треугольник
4) диагональ \ и верхний треугольник
в теле каждого условия свой алгоритм нахождения высоты точки.
Zloten
ты походу ошибся темой тут такое не обсуждают!
programina
вот первую половину я себе представляю так http://lighthouse3d.com/opengl/terrain/index.php?mpd2
а вторую я так понял после того как находишь 52-ой квадрат следует обработка по 4 условиям для поиска высоты — вот вопрос в том что как ты ищешь высоту с помощью определённого алгоритма построенного на математике или проходом по карте высот?
> как ты ищешь высоту с помощью определённого алгоритма
Ну у меня есть найденный прямоугольный треугольник. Я знаю высоты вершин А, B и C.
По этим высотам я нахожу высоту точки, где находится игрок в этом треугольники. Алгоритм сложно обьяснить без картинки. Вечером могу могу загрузить картинку, там по ней всё сразу станет понятно.
programina
понятно. очень интересно буду рад взглянуть.
Источник статьи: http://www.gamedev.ru/code/forum/?id=205697
Генерация ландшафтов в 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
Думаю все заметили, что сейчас стало появляться множество всяких бродилок с выживанием в стиле 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://www.pvsm.ru/algoritmy/62660