Процедурная генерация ландшафтов

Введение

Изучением алгоритмов процедурной генерации карт и написанием своих программ, которые реализуют эти алгоритмы я увлекся еще на первых курсах университета. Это занятие, с одной стороны сродни рисованию (многие люди по всему миру рисуют карты вручную, что для реальных мест на Земле, что и для выдуманных), а с другой стороны, требует знания математики, алгоритмизации, умения составлять и использовать компьютерные алгоритмы.

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

Процедурная генерация находит массу применений в кинематографе, трехмерной графике, компьютерных играх. В современные системы 3D-моделирования включаются средства параметризованной процедурной генерации объектов и текстур. Они позволяют сэкономить время для художника, способствуют быстрой итерации изменений. В кинематографе процедурные системы применяются, например, для создания сцен с большим количеством объектов, ручное моделирование которых оказалось бы нецелесообразно. Компьютерные игры, такие как No Man’s Sky и Minecraft, используют методы процедурной генерации ландшафтов для создания уникальных игровых миров.

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

Генерация карты высот

Процедурная генерация карты происходит в несколько этапов, самым первым из которых является построение базовой формы изображаемой земной поверхности [1]. Она позже будет изменяться и модифицироваться, например при расчете эффекта водной эрозии на геометрию почвы.

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

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

Клеточные автоматы

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

Но начнем с того, что же такое клеточный автомат. Наиболее известным представителем этого класса систем является игра Жизнь Дж. Конвея. В этой системе мир состоит из клеток в прямоугольной решетке, которые могут находиться в двух состояниях: быть живыми или мертвыми. Игра Жизнь описывает правило, по которому клетки изменяют свое состояние в зависимости от состояния соседних клеток. В результате итеративного применения этого правила ко всем клеткам можно обнаружить множество интересных закономерностей, которые, увы, выходят за рамки этой статьи.

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

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

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

Переходы клеточного автомата
Рисунок 1 — Переходы клеточного автомата

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

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

Результаты работы клеточного автомата
Рисунок 2 — Результаты работы клеточного автомата

Результат работы клеточного автомата сам по себе слабо похож на карту. Во-первых, получившиеся изображения очень маленькие; во-вторых, видно что сгенерированные побережья состоят исключительно из горизонтальных и вертикальных отрезков. Это можно исправить переходом от растровой графике к векторной и искажением формы границ. Переход к векторной графике можно выполнить, например, с помощью алгоритма марширующих квадратов [3].

Векторизация областей алгоритмом марширующих квадратов
Рисунок 3 — Векторизация областей алгоритмом марширующих квадратов

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

Карта, сгенерированная с помощью клеточного автомата
Рисунок 4 — Карта, сгенерированная с помощью клеточного автомата

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

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

Использование шумов

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

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

Одним из алгоритмов генерации такого вида текстуры является Шум Перлина [4], предложенный Кеном Перлином в 1983 году. Этот алгоритм генерирует псевдослучайные числа путем интерполяции между единичными векторами, расположенными в некоторых предопределенных точках. В результате получается непрерывная функция одной, двух, трех или более переменных.

Шум Перлина
Рисунок 5 — Шум Перлина

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

Шум Перлина с различным количеством октав
Рисунок 6 — Шум Перлина с различным количеством октав

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

Комбинация шума Перлина и производной функции
Рисунок 7 — Комбинация шума Перлина и производной функции

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

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

Представление карты

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

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

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

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

(1)
(2)

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

Чтобы избежать такого эффекта можно применить специальный алгоритм — алгоритм Ллойда (иногда — релаксация Ллойда). Он подразумевает итеративное вычисление разбиения Вороного и пересчет координат начальных точек как центроидов ассоциированных с ними областей. На рисунке 8 показано как изменяется результат генерации с увеличением числа итераций.

Итерации алгоритма Ллойда
Рисунок 8 — Итерации алгоритма Ллойда

После генерации разбиения и построения графа, каждому центроиду области, можно присвоить значение функции Перлина в точке с соответствующими координатами.

Существует еще один способ представления карты — в виде множества вокселей или полигональной сетки. Он редко применяется для генерации карт местности, но, тем ни менее, позволяет добиться лучшего результата. Шум Перлина может быть как двумерным, так и трехмерным. Если каждой точке пространства присвоить значение шума, то такое пространство можно будет разделить на две непересекающиеся области: область в которой значение больше некоторого порогового значения, и область в которой значение меньше этого значения (точки, в которых значение равно можно отнести к любой из областей). Тогда одну из этих областей можно считать воздухом, а вторую — землей. Такое разбиение дискретизируется с помощью воксельного дерева или построением полигональной сетки. Этот подход хорошо применим для генерации пещер и прочих подземных/подводных естественных образований [3].

Обработка карты высот

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

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

Эрозия

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

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

Алгоритм подразумевает итеративное изменение карты высот. На каждой итерации для клеток карты вычисляется показатель эрозии (erosion rate) — число, характеризующее то, насколько сильно эрозия повлияет на высоту данной клетки. Затем высота клетки изменяется на высоту, пропорциональную показателю эрозии (с ограничением на максимальное изменение на некоторой итерации).

Для вычисления показателя эрозии требуется вычисление ряда параметров.

Величина водного потока (water flux). Для каждой клетки суши происходит поиск маршрута до ближайшего водоема движением по градиенту высоты. Для всех клеток этого маршрута значение величины водяного потока увеличивается на 1. Этот параметр определяет то, сколько воды будет проходить через этот участок, и он напрямую влияет на то, сколько породы будет перенесено с этого участка.

Наклон поверхности. Для того, чтобы рассчитать наклон поверхности в точке можно воспользоваться простыми положениями линейной алгебры. Наклон вычисляется как арккосинус аппликаты нормали. Поскольку после применения алгоритма Ллойда, области имеют форму, близкую к правильному многоугольнику, нормаль поверхности можно рассчитать как среднее значение нормалей всех границ области. Известны координаты и высота центров двух областей, разделяемые границей, а следовательно, нормаль можно рассчитать по следующей формуле:

(3)

Расчет самого показателя эрозии можно вычислить следующим образом:

(4)

Один из недостатков этого алгоритма можно увидеть, если рассмотреть то, как рассчитывается величина водного потока. Из любой точки суши необходимо иметь возможность, двигаясь по градиенту, достичь берега. Любой локальный минимум функции высоты не позволит корректно рассчитать величину потока по описанному выше алгоритму. Для того чтобы избежать подобной ситуации можно воспользоваться алгоритмом Planchon-Darboux, который заполняет все низменности на карте. Хоть использование алгоритма и легко в реализации, для него нельзя провести аналогию с реальным геологическим процессом, а следовательно он не является реалистичным.

Результаты моделирования водной эрозии для разного числа итераций показаны на рисунке.

Вычисление водной эрозии
Рисунок 9 — Вычисление водной эрозии

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

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

Генерация рек

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

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

Воды рек оказывают значительное влияние на геометрию ландшафта. Реки могут переносить значительные объемы горных пород, формируются разнообразные образования. Нередко река может изменять свое русло и, например, образовывать пойменные озера, или старицы. Эти особенности необходимо учитывать при создании системы реалистичной процедурной генерации ландшафтов [7].

Определение природных зон

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

Пожалуй, простейшей такой моделью является выбор природной зоны на основании высоты над уровнем моря. Она дает хорошие результаты для генерации небольшой карты местности, однако карты получаются однообразны. Высоту над уровнем моря можно рассматривать вместе с влажностью (как функцией расстояния до источников воды) [8].

Гораздо лучшим подходом будет использование географически обоснованной модели распределения природных зон, например, классификации Р. Уиттекера [9]. Эта классификация устанавливает связь между природной зоной (биомом) и значением двух параметров: годового выпадения осадков и средней температурой.

Классификация Р. Уиттекера
Рисунок 10 — Классификация Р. Уиттекера

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

Добавление объектов на карту

Зачастую, кроме природных образований на карту также добавляются и техногенные объекты: города и поселения, дороги, границы административно-территориальных единиц государств и т. д. В [11] описывается один из возможных алгоритмов расположения таких объектов.

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

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

На рисунке показан пример карты, сгенерированный программой [12], использующей этот алгоритм.

Карта с нанесенными поселениями
Рисунок 11 — Карта с нанесенными поселениями

Другие применения процедурной генерации

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

Системы Линденмайера

При решении задачи генерации растений зачастую обращаются к помощи так называемых систем Линденмайера, или, сокращенно, L-систем [13]. Под L-системой понимается система, которая производит итеративную замену символов строки, которую называют аксиомой, по некоторому набору правил. Формальное описание системы Линденмайера представляет собой особую форму контекстно-свободной грамматики.

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

На рисунке показан пример работы L-системы для нескольких итераций.

Примеры систем Линденмайера
Рисунок 12 — Примеры систем Линденмайера

Как видно по рисунку, L-системы хорошо подходят для описания фракталов, что в свою очередь, полезно для процедурной генерации растений, ведь в растительной природе часто встречается явление самоподобия. L-системы были успешно адаптированы для генерации как двумерных, так и трехмерных растений различных видов [14].

Несмотря на критику о чрезмерной сложности и скрытии сути процесса генерации за формализмом систем Линденмайера [15], они нашли применение и при генерации других объектов, например архитектурных сооружений [16].

Цепи Маркова

Вопрос процедурной генерации текста встает достаточно часто. Например, генерация текста может использоваться для нанесения меток на карту: именования территорий, городов и прочих объектов.

Цепи Маркова — классический подход в этой области. Сама цепь Маркова представляет собой недетерминированный конечный автомат, изменение состояния которого происходит согласно заранее определенных вероятностей [17]. Модель цепи Маркова может быть извлечена из существующего текста простыми статистическими методами. Затем, на этапе генерации, происходит моделирование перехода от начального состояния к конечному с использованием генератора псевдослучайных чисел.

С помощью цепи Маркова может быть сгенерировано как одно слово так и целый абзац текста. В первом случае в качестве состояния используется один символ или n-грамма из символов; во втором случае — слово или словосочетание.

Посмотреть на то, какие результаты можно получить с помощью цепи Маркова можно с помощью онлайн-генератора.

Стоит отметить, что для генерации больших объемов текста хорошо себя показали появившиеся в последние годы рекуррентные нейронные сети [18].

Примеры коммерческих и любительских систем процедурной генерации

Cистемы процедурной генерации

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

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

World Machine поддерживает моделирование различных видов эрозии: термоэрозию, водную эрозию, эрозию побережий и др. Система также позволяет моделировать появление снежного покрова в областях с соответствующим климатом. Карты, сгенерированные в World Machine, можно использовать в других профессиональных системах трехмерной компьютерной графики за счет экспорта карты в виде полигональной сетки, генерации карты нормалей и цветовой текстуры.

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

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

Можно также выделить несколько любительских систем процедурной генерации ландшафтов, примером которых является Azgaar’s Fantasy Map Generator. Эта система не занимается генерацией фотореалистичных ландшафтов. Вместо этого, различные процедуры геологического моделирования, применяются для генерации вымышленных политических карт. У пользователя есть возможность отредактировать результаты работы алгоритма на разных этапах, после чего система выполнит повторную генерацию.

Ресурсы, посвященные теме процедурной генерации

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

Одним из примечательных примеров является блог Here Dragons Abound [19] в котором автор Scott Turner, PhD в области искусственного интеллекта, описывает свои эксперименты в области процедурной генерации карт. При этом, внимание он акцентирует на вопросах визуализации сгенерированных карт в стиле, напоминающем бумажные карты XIX и начала XX вв.

Другим полезным ресурсом является блог Red Blob Games [20], освящающий такие темы как поиск маршрутов, эффективное представление карт с шестиугольными клетками так и темы, связанные с процедурной генерацией и визуализацией: использование шумов, полигональная генерация, визуализация и др.

Работы магистров ДонНТУ

Созданием систем процедурной генерации занимались и магистры Донецкого национального технического университета.

Вивденко Владислав Сергеевич, выпускник ДонНТУ 2018 года писал магистерскую диссертацию на тему Разработка, исследование и программная реализация метода процедурной генерации окружения в игровых приложениях [21]. В автореферате, опубликованном на его персональном сайте рассматривается вопрос генерации комнат для использования в компьютерных играх. В его автореферате приведено описание метода двоичного разбиения пространства, метода походки пьяницы, клеточных автоматов.

Другим магистром, который занимался процедурной генерацией является выпускница 2015 года Лунтовская Анастасия Андреевна. Она писала магистерскую диссертацию на тему Средства разработки динамического игрового окружения для mmorpg игр [22]. В своей работе она делала акцент на практической реализации алгоритмов компьютерной графики с использованием возможностей параллельных вычислений графических процессоров.

Список источников

  1. Sebastian Lague. Procedural Terrain Generation / YouTube // 2016. — [Ссылка]
  2. JR Heard. Procedural Dungeon Generation: Cellular Automata / jrheard's blog // 2016. — [Ссылка]
  3. Sebastian Lague. Coding Adventure: Marching Cubes / YouTube // 2019. — [Ссылка]
  4. Lexy Munroe. Шум Перлина / Хабр // Перевод: Renat Nasyrov. URL: [Ссылка]
  5. Amit Patel. Procedural map generation on a sphere / Red Blob Games // 2018. — [Ссылка]
  6. Sebastian Lague. Coding Adventure: Hydraulic Erosion / YouTube // 2019. — [Ссылка]
  7. Soon Tee Teoh. River and Coastal Action in Automatic Terrain Generation / Proceedings of the 2008 International Conference on Computer Graphics & Virtual Reality, CGVR 2008, July 14–17, 2008, Las Vegas, Nevada, USA
  8. Amit Patel. Polygonal Map Generation for Games / Red Blob Games // 2010. — [Ссылка]
  9. Biomes of the World / Marietta College Main Biomes Page. // [Ссылка]
  10. Amit Patel. Making maps with noise functions / Red Blob Games // [Ссылка]
  11. Martin O'Leary. Generating fantasy maps / mewo2.com // [Ссылка]
  12. Ryan Guy. Fantasy Map Generator / GitHub // [Ссылка]
  13. L-система. / Википедия. Свободная энциклопедия // [Ссылка]
  14. Przemyslaw Prusinkiewicz. The Algorithmic Beauty of Plants / Przemyslaw Prusinkiewicz, Aristid Lindenmayer. 2004 - 240 p.
  15. Sean Barrett. L-Systems Considered Harmful / nothings.org // 2007-2009. [Ссылка]
  16. Jean-Eudes Marvie. FL-system : A Functional L-system for procedural geometric modeling / Jean-Eudes Marvie, Julien Perret, Kadi Bouatouch //  The Visual Computer. — № 21(5). — 2005 — P. 329–339 [Ссылка]
  17. Victor Powell, Lewis Lehe. Markov Chains Explained Visually / A setosa project. Explained Visually // [Ссылка]
  18. A. Karpathy. The Unreasonable Effectiveness of Recurrent Neural Networks / Andrej Karpathy blog // 2015. — [Ссылка]
  19. Scott Turner. Here Dragons Abound // [Ссылка]
  20. Amit Patel. Red Blob Games // [Ссылка]
  21. Вивденко В. С. Разработка, исследование и программная реализация метода процедурной генерации окружения в игровых приложениях. Реферат по теме выпускной работы / Портал магистров ДонНТУ // 2018. — [Ссылка]
  22. Лунтовская А. А. Средства разработки динамического игрового окружения для mmorpg игр. / Портал магистров ДонНТУ. Реферат по теме выпускной работы // 2015. — [Ссылка]