Привет! Это первая обучающая статья на моем канале, поэтому буду ждать ваших комментариев, советов, критики и иных высказываний. Я надеюсь, что вам поможет данный урок в реализации тех или иных механик в ваших текущих или потенциальных проектах. Ссылку на репозиторий прикреплю в конце статьи.
Давайте заранее разобьем всю суть структурно по главам и будем поэтапно проходиться по ним:
- Кто такой Кен Перлин?
- Что такое шум Перлина и где он используется?
- Реализация шума Перлина при помощи C#;
- Практическое применение шума Перлина в Unity;
- Игры, где использовался шум Перлина;
- Итоги;
- Рекомендации.
Кто такой Кен Перлин?
Кен Перлин - профессор факультета компьютерных наук Нью-Йоркского университета, директор-основатель лаборатории исследований СМИ в Нью-Йоркском университете, директор лаборатории будущей реальности в Нью-Йоркском университете и директор Института игр для обучения.
Source: Wikipedia.
Автор шума Перлина (Perlin noise), квикврайтинга (Quikwriting) и шума симплекс (simplex noise).
Что такое шум Перлина и где он используется?
Шум Перлина - математический алгоритм по генерированию процедурной текстуры псевдо-случайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использоваться для генерации эффектов дыма, тумана и т. д.
Шум Перлина — это градиентный шум, состоящий из набора псевдослучайных единичных векторов (направлений градиента), расположенных в определенных точках пространства и интерполированных функцией сглаживания между этими точками. Для генерации шума Перлина в одномерном пространстве необходимо для каждой точки этого пространства вычислить значение шумовой функции, используя направление градиента (или наклон) в указанной точке.
Функция «Perlin noise» проводит генерацию текстур методом генерации псевдослучайных чисел, однако все визуальные детали текстуры имеют одинаковый размер. Это свойство делает шум Перлина легко управляемым; множество масштабированных копий шума Перлина могут быть вставлеными в математические выражения для создания самых разнообразных процедурных текстур.
Алгоритм шума Перлина можно масштабировать одно-, двух- и трёхмерного вида. Более того, в алгоритм можно ввести четвёртое временно́е измерение, позволяя алгоритму динамически изменять текстуры во времени.
Шум Перлина создан Кеном Перлином (англ.) в 1983 году и впоследствии был назван в честь своего создателя. Перлин создал алгоритм, работая в Mathematical Applications Group, Inc. (англ.). В 1997 году Кен Перлин получил награду Academy Award for Technical Achievement (англ.) от Американской Академии кинематографических искусств и наук за вклад в создание фильма «Трон» (1982).[1]
Шум Перлина широко используется в двухмерной и трёхмерной компьютерной графике для создания таких визуальных эффектов, как дым, облака, туман, огонь и т. д. Он также очень часто используется как простая текстура, покрывающая геометрическую модель. В отличие от растровых текстур, шум Перлина является процедурной текстурой, и поэтому он не занимает память, но вместе с тем исполнение алгоритма требует неких вычислительных ресурсов. Использование шума Перлина очень распространено в демосцене, участники которой используют его в демках.
Source: Wikipedia.
Реализация шума Перлина на C#
С введением закончили, общая теория у нас есть. Давайте приступ к практическому применению в виде написания кода. У нас будет всего два модуля, которые можно будет легко интегрировать в любой проект и пользоваться в различных ситуациях, а при необходимости - легко изменять и оптимизировать.
C# в данной статье используется в связке с игровым движком Unity. По этой причине часть кода может потребоваться изменить под вашу платформу или целевое ПО.
Первый - сам скрипт, логика реализации шума.
Второй - отрисовка окошка в Unity, что не является обязательным, но выглядит удобнее для людей, не связанных с программированием. Написание этой части будет опущено в силу оффтопа статьи.
1. Подготовка скрипта
Для начала создадим новый файл .cs и назовем его PerlinNoiseGenerator (вы можете назвать или, если используете мой репозиторий, переименовать как вам удобно). Далее закомментируем нужные участки кода для абстрактной архитектуры примерной потенциальной работы и заготовим нужные поля, переменные и свойства:
2. Реализация просчета цвета для каждого пикселя
3. Реализация генерации шума Перлина
На этом работа с кодом закончена. Постарался написать комментарии понятно и кратко к каждой строчке, чтобы программист любого уровня мог разобраться в написанной логике.
Практическое применение шума Перлина в Unity.
В игровом движке Unity есть множество случае и идей, где можно использовать написанный нами модуль. Для первого примера посмотрим, что у нас вообще получилось:
А теперь давайте сгенерируем карту из кубов на основе получившейся карты:
Таким образом мы получаем террейн, напоминающий нам карту из Minecraft.
Естественно тут можно много чего изменить и добавить. Например чтобы кубы на определенной высоте были с текстурой травы, а ну другой высоте текстуры камня или земли.
Игры, где использовался шум Перлина
В данном этапе мы просто перечислим игры, где использовался алгоритм генерации шума Перлина:
- Как генерируется мир в Minecraft (Яндекс.Дзен);
- Sid Meier's Civilization;
- Terraria;
- Hades;
- Rim World.
И многие другие. Шум перлина в играх используется не только для генерации карт, но и для разнообразных механик. Об этом можете почитать здесь (Skillbox).
Итоги
Резюмируя написанную статью, мы разобрались в теории работы шума Перлина, узнали немного про автора алгоритма, научились генерировать шум перлина на С# и террейн из кубов в Unity. Мы также увидели примеры использования данного алгоритма в других играх в самых разных механиках.
В целом общий алгоритм реализации шума Перлина на всех языках практически идентичен, не считая уникальные моменты, такие как используемые структуры и типы данных.
Если у вас есть, чем дополнить этот урок или остались вопросы без ответов - прошу в комментарии, с радостью на все отвечу!
Рекомендации
- PERLIN NOISE in Unity - Procedural Generation Tutorial (YouTube. Brackeys);
- Шум Перлина (Хабр);
- Нечёткий мир шума Перлина (Хабр).