Огромные процедурно создаваемые миры 'дикой природы'

Я уверен, что вы все знаете о таких играх, как Dwarf Fortress - массивная, процессуальная порождаемая пустыня и земля. Что-то вроде этого, взятое из этой очень полезной статьи.

Однако мне было интересно, как я могу применить это в гораздо большем масштабе; на ум приходит шкала Minecraft (разве это не что-то вроде 8x размера поверхности Земли?). Псевдо-бесконечный, я думаю, лучший термин будет.

: D

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

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

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

Я уверен, что шум Перлина или какой-то шум будет каким-то образом ответом. Я имею в виду, что карта действительно приятная. И вы можете заменить ascii на плитки и получить что-то очень приятное.

76 голосов | спросил The Communist Duck 19 +04002010-10-19T19:46:35+04:00312010bEurope/MoscowTue, 19 Oct 2010 19:46:35 +0400 2010, 19:46:35

5 ответов


35

Думаю, мне лучше понять, что вы сейчас спрашиваете.

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

Вот упрощенный пример: использование синуса вместо перлингового шума для генерации высоты и воображение мира бесконечно по оси 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 блок - трава, более вероятно, что рядом с ним будет трава), вы можете очень эффективно сжимать данные - будет работать кодировка длины пробега ну, но тогда будет почти любой стандартный алгоритм сжатия.

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

ответил Kylotan 20 +04002010-10-20T14:55:44+04:00312010bEurope/MoscowWed, 20 Oct 2010 14:55:44 +0400 2010, 14:55:44
32

Этот учебник Я писал много лет назад, может дать вам что-то как вы хотите:

alt text

Если вы делаете модификацию острова на последнем шаге, это имеет тенденцию к единственной материковой массе, которая не достигает края карты.

ответил munificent 21 +04002010-10-21T02:48:50+04:00312010bEurope/MoscowThu, 21 Oct 2010 02:48:50 +0400 2010, 02:48:50
15

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

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

первая октава  details

Эта статья должна помочь: http://freespace.virgin.net/hugo .elias /модели /m_perlin.htm

Если вы хотите узнать о бесконечных 3D-мирах и о различных трюках, которые вы можете использовать, чтобы изменить внешний вид местности, играя с входным и выходным шумом, посмотрите на эту статью: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html

Возможно, вам немного сложно прочитать, если вы не знакомы с графическим конвейером и программированием шейдеров.

ответил zfedoran 19 +04002010-10-19T22:03:26+04:00312010bEurope/MoscowTue, 19 Oct 2010 22:03:26 +0400 2010, 22:03:26
11

Некоторые полезные ссылки для вас об автомобиле мирового поколения:

http://pcg.wikidot.com/ - Создание процедурного контента

http://www-cs-students.stanford.edu/~amitp/gameprog .html # tiles - набор алгоритмов построения Amit's Worlds

ответил topright 20 +04002010-10-20T02:06:28+04:00312010bEurope/MoscowWed, 20 Oct 2010 02:06:28 +0400 2010, 02:06:28
7

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

Один из довольно классных решений, которые я видел, был описан в статье «Продвинутое удаление частиц» в играх Gaming 7. В Интернете есть много других, поэтому есть много ресурсов для рисования (например, < a href = "http://www-evasion.imag.fr/Publications/2007/MDH07/"> 1 или 2 ).

ответил Dominik D 2 SunEurope/Moscow2012-12-02T15:58:48+04:00Europe/Moscow12bEurope/MoscowSun, 02 Dec 2012 15:58:48 +0400 2012, 15:58:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132