Я уверен, что вы все знаете о таких играх, как Dwarf Fortress - массивная, процедурно созданная пустыня и земля. Как то так, взято из этой очень полезной статьи.
Однако мне было интересно, как я могу применить это в гораздо большем масштабе; приходит на ум масштаб Minecraft (не так ли это, как 8-кратный размер земной поверхности?). Псевдо-бесконечный, я думаю, лучшим термином будет.
В статье рассказывается о фрактальном перлин-шуме. Я ни в коем случае не эксперт в этом, но я понимаю общую идею (это какой-то случайно генерируемый шум, который является полукогерентным, а не просто случайными значениями пикселей).
Я мог бы просто определить области X по размеру X, добавить некоторые вещи типа загрузки областей и иметь один бит шума, генерирующий область. Но это привело бы к огромному количеству островов.
С другой стороны, я не думаю, что смогу действительно создать сверхмассивный лист перлин-шума. Думаю, это будет один большой остров.
Я почти уверен, что шум Перлина или какой-то другой будет ответом в некотором роде Я имею в виду, карта действительно хорошо выглядит. И вы можете заменить ascii на плитки и получить что-то очень красивое.
источник
Ответы:
Я думаю, что я лучше понимаю, что вы спрашиваете сейчас.
Шум не случайный - он выглядит случайным образом, но полностью основан на математической формуле и повторяется. Вся информация закодирована в формуле. Это означает, что вы можете иметь формулу, которая потенциально покрывает бесконечную область, и просто использовать формулу для координат нужной области. Когда вам нужна смежная область, вы просто повторно используете формулу для новых координат, и, поскольку формула выдает непрерывные значения, области будут объединяться без проблем.
Вот упрощенный пример, использующий синус вместо шума перлина для генерации высоты, и воображение, что мир бесконечен по оси X, но только на 1 единицу выше по осям Y и Z.
Формула это:
height(x,y) = sin(x/20)
Игра начинается, и мы генерируем высоты для близлежащей области, т.е. (0,0) - (9,0):
[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]
У нас есть холм, поднимающийся вправо. Допустим, мы подошли к концу и теперь должны сгенерировать значения от (10,0 до 19,0):
[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]
Обратите внимание, что холм неуклонно растет, и что значение в (10,0) хорошо следует из значения в (9,0). Это потому, что функция синуса непрерывна, что означает, что если вы введете в нее 2 соседних числа, вы получите 2 соседних результата - для определенного определения смежных. Поэтому, если вы используете свои мировые координаты в качестве параметров для функции, которая определяет ваш мир, вы получите непрерывный ландшафт, который объединяется независимо от того, сколько или мало его вы генерируете одновременно. Когда вы генерируете новые детали, они автоматически перетекают из существующих деталей, потому что высота уже задана.
Если мир не изменится, вам даже не нужно ничего хранить, поскольку вы можете точно рассчитать, какова высота в любой заданной точке из формулы. Очевидно, что с чем-то вроде Minecraft мир полностью деформируется, так что вы просто сохраняете каждый кусок, когда создаете его. Учитывая, что существует высокая степень согласованности между соседними блоками (т. Е. Если 1 блок - это трава, скорее всего, что блок рядом с ним будет тоже травой), вы можете сжимать данные очень эффективно - будет работать кодировка длины прогона хорошо, но тогда так будет почти любой стандартный алгоритм сжатия.
В то время как я говорил о высоте как о наиболее очевидном значении, вы можете использовать ту же систему для создания любой характеристики, которую вы хотите. Используйте математическую функцию с непрерывными свойствами, и в качестве входных данных используются ваши мировые координаты, которые могут определять наличие наземных ориентиров, месторождений полезных ископаемых, точек появления и т.д. (Очевидно, что значения в одной формуле могут повлиять на другую - нет смысла размещать залежи угля в воздухе, поэтому вы генерируете карту высот мира, а затем вычисляете возможности угля только для блоков, которые находятся достаточно глубоко под землей.)
источник
Этот урок, который я написал несколько лет назад, может дать вам нечто похожее на то, что вы хотите:
Если вы выполните модификацию острова на последнем шаге, она будет стремиться к единой суше, которая не достигает края карты.
источник
Чтобы создать большой остров, вам не нужно создавать его все сразу. Я бы строил регионы асинхронно, когда вы их посещаете.
Вместо того чтобы использовать маску для создания острова, как описано в статье, одну вещь, которую вы можете сделать, это поиграть с длинами волн октанового шума, чтобы добиться желаемого вида. Обычно первая октава описывает общую форму местности. Все октавы после него просто добавляют более мелкую зернистость. Поэтому играйте с длиной волны первой октавы, чтобы контролировать, насколько большими будут ваши земные массы. Если вы хотите, чтобы суша находилась в центре, вы можете просто уменьшить карту высот по мере удаления от центра, а затем нормализовать шум. Например, представьте, что можете объединить эти два элемента для создания своего острова:
Эта статья должна помочь: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
Если вы хотите узнать о бесконечных трехмерных мирах и о различных хитростях, которые вы можете использовать, чтобы изменить внешний вид ландшафта, играя с входным и выходным шумом, загляните в эту статью: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html
Это может быть немного трудно читать, если вы не знакомы с графическим конвейером и шейдерным программированием.
источник
Некоторые полезные ссылки для вас о поколении автомира:
http://pcg.wikidot.com/ - Процедурная генерация контента
http://www-cs-students.stanford.edu/~amitp/gameprog.html#tiles - набор алгоритмов Amit's Building Worlds.
источник
Шум Перлина и друзья - хорошая отправная точка, но вы, вероятно, хотите сделать еще один шаг вперед. Большинство популярных генераторов на основе шума дадут вам довольно неинтересные результаты. Чтобы сделать ландшафт реалистичным, вы должны взглянуть на алгоритмы, эмулирующие эффекты эрозии. Один из самых продвинутых симуляторов игрового мира - Dwarf Fortress - делает симуляцию эрозии одним из этапов построения мира.
Одно из довольно крутых решений, которые я видел, было описано в статье «Усовершенствованное осаждение частиц» в Game Programming Gems 7. В Интернете доступно много других, поэтому есть много ресурсов, из которых можно извлечь (например, 1 или 2 ). ,
источник