Найти тему

Шум Перлина и Unity + C#. Реализация и практическое применение.

Оглавление

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

Давайте заранее разобьем всю суть структурно по главам и будем поэтапно проходиться по ним:

  1. Кто такой Кен Перлин?
  2. Что такое шум Перлина и где он используется?
  3. Реализация шума Перлина при помощи C#;
  4. Практическое применение шума Перлина в Unity;
  5. Игры, где использовался шум Перлина;
  6. Итоги;
  7. Рекомендации.
Кен Перлин
Кен Перлин

Кто такой Кен Перлин?

Кен Перлин - профессор факультета компьютерных наук Нью-Йоркского университета, директор-основатель лаборатории исследований СМИ в Нью-Йоркском университете, директор лаборатории будущей реальности в Нью-Йоркском университете и директор Института игр для обучения.
Source:
Wikipedia.

Автор шума Перлина (Perlin noise), квикврайтинга (Quikwriting) и шума симплекс (simplex noise).

Шум Перлина (GIF)
Шум Перлина (GIF)

Что такое шум Перлина и где он используется?

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

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

Функция «Perlin noise» проводит генерацию текстур методом генерации псевдослучайных чисел, однако все визуальные детали текстуры имеют одинаковый размер. Это свойство делает шум Перлина легко управляемым; множество масштабированных копий шума Перлина могут быть вставлеными в математические выражения для создания самых разнообразных процедурных текстур.

Алгоритм шума Перлина можно масштабировать одно-, двух- и трёхмерного вида. Более того, в алгоритм можно ввести четвёртое временно́е измерение, позволяя алгоритму динамически изменять текстуры во времени.

Шум Перлина создан Кеном Перлином (англ.) в 1983 году и впоследствии был назван в честь своего создателя. Перлин создал алгоритм, работая в Mathematical Applications Group, Inc. (англ.). В 1997 году Кен Перлин получил награду Academy Award for Technical Achievement (англ.) от Американской Академии кинематографических искусств и наук за вклад в создание фильма «Трон» (1982).[1]

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

Source: Wikipedia.

C# - язык программирования от Microsoft, используемый для различного ПО
C# - язык программирования от Microsoft, используемый для различного ПО

Реализация шума Перлина на C#

С введением закончили, общая теория у нас есть. Давайте приступ к практическому применению в виде написания кода. У нас будет всего два модуля, которые можно будет легко интегрировать в любой проект и пользоваться в различных ситуациях, а при необходимости - легко изменять и оптимизировать.

C# в данной статье используется в связке с игровым движком Unity. По этой причине часть кода может потребоваться изменить под вашу платформу или целевое ПО.

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

1. Подготовка скрипта
Для начала создадим новый файл .cs и назовем его PerlinNoiseGenerator (вы можете назвать или, если используете мой репозиторий, переименовать как вам удобно). Далее закомментируем нужные участки кода для абстрактной архитектуры примерной потенциальной работы и заготовим нужные поля, переменные и свойства:

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

2. Реализация просчета цвета для каждого пикселя

-7

3. Реализация генерации шума Перлина

-8

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

Практическое применение шума Перлина в Unity.

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

Получившаяся текстура шума Перлина, перенесенная на 2D Sprite на сцену
Получившаяся текстура шума Перлина, перенесенная на 2D Sprite на сцену

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

Параметры генерации
Параметры генерации

Таким образом мы получаем террейн, напоминающий нам карту из Minecraft.

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

-12

Игры, где использовался шум Перлина

В данном этапе мы просто перечислим игры, где использовался алгоритм генерации шума Перлина:

  1. Sid Meier's Civilization;
  2. Terraria;
  3. Hades;
  4. Rim World.

И многие другие. Шум перлина в играх используется не только для генерации карт, но и для разнообразных механик. Об этом можете почитать здесь (Skillbox).

Итоги

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

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

Если у вас есть, чем дополнить этот урок или остались вопросы без ответов - прошу в комментарии, с радостью на все отвечу!

Репозиторий на GitHub.

Рекомендации