Как я могу создать безграничный мир?

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

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

В настоящее время я сосредотачиваюсь на большой 2D-карте, на которой должно быть возможно отобразить любую часть, не зная об окружающих частях.

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

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

РЕДАКТИРОВАТЬ: Я забыл ссылку на свой вопрос.

РЕДАКТИРОВАТЬ 2: Я думаю, мне придется уточнить, что важно, чтобы две смежные части карты, созданные отдельно, должны плавно соединяться друг с другом.

РЕДАКТИРОВАТЬ 3: Дополнительная информация была запрошена в комментариях.

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

Думайте о черных пикселях как о глубоком море, а о белых пикселях как о горных вершинах. Это то, что мне нужно, простая двухмерная карта высот.

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

Теперь перейдем к вопросам Unreason:

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

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

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

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

РЕДАКТИРОВАТЬ 4: Надеюсь, последний.

Хорошо, после небольшого прочтения кажется, что Perlin Noise - это то, что нужно. Однако у меня есть еще один вопрос (если кто-то захочет ответить сейчас, когда я принял один (на самом деле два) ответа :)).

Функция шума Перлина принимает двойные значения. Какой диапазон у этих дублеров? [0-1 [? Или я могу с радостью отправить свои большие целые числа?


person Peter Jaric    schedule 16.06.2010    source источник
comment
Разве случайный и детерминированный не противоречат друг другу?   -  person Dominic Rodger    schedule 16.06.2010
comment
@Dominic, они есть, но у вас нет действительно случайных чисел, но у вас есть псевдослучайные числа, и генераторы часто имеют способ «воспроизвести» случайную последовательность.   -  person Unreason    schedule 16.06.2010
comment
Без шуток: я задал себе точно такой же вопрос несколько дней назад: +1   -  person tur1ng    schedule 16.06.2010
comment
@Dominic: на неспециализированных компьютерах случайные числа являются детерминированными, поскольку они используют генераторы псевдослучайных чисел, основанные на математических алогрифмах. Чтобы получить истинные случайные числа (по крайней мере, то, что мы считаем истинно случайным), требуется немного специального оборудования. На www.random.org есть кое-что интересное о случайности.   -  person Skizz    schedule 16.06.2010
comment
@Dom: Также не забывайте, что многие приложения, которым требуются случайные числа (моделирование в качестве яркого примера), также требуют детерминизма, поскольку вы должны иметь возможность точно воспроизвести прогон моделирования. Также псевдослучайные генераторы часто позволяют лучше контролировать статистические свойства (псевдо) случайности.   -  person Joey    schedule 16.06.2010
comment
Игра Diablo генерирует случайные макеты уровней. Это была одна из причин, по которой я играл в нее десятки раз.   -  person Nick Dandoulakis    schedule 16.06.2010
comment
Я думаю, вам придется уточнить немного больше, чем EDIT2 :) Например, см. Эту ссылку vterrain.org чтобы понять только те категории деталей, к которым вы могли бы стремиться.   -  person Unreason    schedule 16.06.2010
comment
@Nick: Diablo использовал действия игрока как источник энтропии. Есть спидран, который злоупотребляет им, чтобы обыграть Diablo всего за несколько минут :-)   -  person Joey    schedule 16.06.2010
comment
Поскольку этот вопрос задается в контексте игры, обратите внимание, что люди находят изотропные поля фантастически скучными.   -  person msw    schedule 20.06.2010
comment
@msw: Если я правильно понимаю термин изотропные поля (имеется в виду мир, где все выглядит примерно одинаково), я думаю, что его можно было бы несколько изменить, используя много разных уровней высоты (где крупнозернистые слои имеют большее влияние на высоту), поэтому что одни большие области находятся далеко в облаках, а другие - в глубоком море.   -  person Peter Jaric    schedule 21.06.2010
comment
@ Питер: ты меня правильно понял, но я был слишком немногословен. Люди (и осы в этом отношении) зависят от уникальных особенностей ландшафта для успешной навигации. Если мое предположение верно, изменение высоты не сильно повлияет на изотропию. Однако деревья, гора или озеро особой формы нарушат воспринимаемую изотропию на всем видимом диапазоне, а нахождение среди гор, озер или бескрайних лесов - нет. Создатели больших MMOG хорошо знают об этом и прилагают много неслучайных, человеческих усилий, чтобы сломать изотропию.   -  person msw    schedule 21.06.2010
comment
@msw: Да, добавление человеческих усилий к этому миксу, конечно, хороший способ улучшить ситуацию. Однако я считаю, что ресурсов для этого не хватит. В одном из своих прототипов я использовал один слой с ландшафтом, а другой слой с лесами, где у меня было пороговое значение вместо высоты, и везде, где была земля и пороговое значение было достигнуто, я помещал дерево (или древостой). Это сделало леса довольно красивыми, органично выглядящими.   -  person Peter Jaric    schedule 21.06.2010


Ответы (4)


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

Итак, вы можете наложить дополнительные ограничения на свой вопрос.

Если что-то сработает для вас или вы просто просите исследования - взгляните на различные фокусы и подходы здесь.

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

Также обратите внимание на процедурную генерацию (особенно «см. Также» и «внешние ссылки»).

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

РЕДАКТИРОВАТЬ: вот реализация плазменных фракталов (смещения средней точки) в обработке.

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

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

person Unreason    schedule 16.06.2010
comment
Похоже, дополнительное ограничение заключается в том, что он также хочет сгенерировать его по запросу, поэтому каждая часть карты должна быть в значительной степени независимой от остальной части. - person Nick Johnson; 16.06.2010
comment
@snowlord, это не должно быть такой проблемой с синтезом ландшафта (как и с большинством других методов, единственное, о чем я могу думать, это моделирование эрозии, которое будет чувствительно к вашим требованиям; но даже тогда есть способы справиться с этим - предварительное вычисление сетки в качестве граничных условий). - person Unreason; 16.06.2010
comment
Также читайте по ссылкам, которые я предоставил; на ваш вопрос, я думаю, было бы лучше определить следующее: требуемая производительность, требования к памяти, требуемые детали (симулятор полета отличается от игры, в которой вы только ползуете), требуемые типы объектов и свойства объектов для создания (вода / земля - ​​тип местности , растительность - ландшафт местности, прочие артефакты - дороги, железные дороги, города и т. д. ...). - person Unreason; 16.06.2010
comment
Если вы предоставите макет того, к чему стремитесь, в виде картинки, это будет намного яснее. - person Unreason; 16.06.2010
comment
Я обновлю свой вопрос через некоторое время, добавив более подробную спецификацию, а также покажу, что я имею в виду, с помощью некоторых изображений. - person Peter Jaric; 16.06.2010

Взгляните на Perlin Noise, это тип детерминированных случайных данных, названный в честь его изобретателя Кена Перлина. Если вы будете искать «Шум Перлина» или «Кен Перлин», вы найдете массу статей о процедурных текстурах и генерации ландшафта.

person kasperjj    schedule 16.06.2010
comment
Забавно, просматривая свой старый код в поисках сгенерированной карты для ссылки (я ее не нашел), я видел эти классы, но не помнил, для чего они нужны: PerlinSolidNoiseGenerator.java и SolidNoiseGenerator.java. Согласно javadoc, их написал Карл Берк. - person Peter Jaric; 16.06.2010
comment
Формулировка этого ответа неверна - шум Перлина - это детерминированная последовательность псевдослучайных данных, а не наоборот (есть детерминированные и псевдослучайные функции, которые не являются шумом Перлина). en.wikipedia.org/wiki/Perlin_noise - person Unreason; 16.06.2010

Ландшафты обычно создаются с помощью фракталов.

Простым методом является алгоритм Plasma Cloud, также известный как алгоритм смещения средней точки. Общая идея такова:

  1. Установите некоторые значения высоты для углов области.
  2. Разделите прямоугольник на 4 меньших прямоугольника.
  3. Рассчитайте высоту для новых точек как среднее значение для окружающих точек и добавьте к этому значение случайного смещения.
  4. Рекурсивно разделите каждый прямоугольник на меньшие прямоугольники и соответственно уменьшите величину смещения.

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

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

Плазменное облако дает вполне реалистичные пейзажи, но со временем они приедаются. Следовательно, можно дополнительно использовать более сложные алгоритмы (Perlin Noise, Ridged Perlin и т. Д.). Чтобы получить больше разнообразия, вы можете использовать один фрактал (с низким разрешением) для настройки параметров другого фрактала, который вычисляет фактические значения.

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

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

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

Однако для генерации ландшафта вам действительно не нужен статистически хороший генератор случайных чисел. Таким образом, вы можете заменить функцию rand некоторой функцией, которая вычисляет случайное число по координатам X и Y вместо предыдущего значения. Примерно так (непроверено):

const int a = 0x7fffffff / 48271;
const int b = 0x7fffffff % 48271;

int displacement(int x, int y)
{
    int     seed, result;

    seed = x ^ ((y << 1) & 0x2AAAAAAA) ^ ((y >> 1) & 0x33333333);
    result = 48271 * (seed % a) - b * (seed / a);

    Return (result & 0xffff);
}

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

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

person PauliL    schedule 16.06.2010
comment
Я думаю, что именно плазменные облака привели меня к этому, но требование установить граничные значения делает невозможным их использование, поскольку они неизвестны и также должны быть сгенерированы. Или можно с ними покончить, используя какой-нибудь вариант плазменных облаков? - person Peter Jaric; 16.06.2010
comment
Если вам нужен только большой (но не бесконечный) мир, вы можете сначала создать массив высот и начальных значений с низким разрешением, используя плазменное облако, например массив 256 x 256 с разрешением 1 км. Затем используйте плазменное облако, чтобы заполнить область размером 1x1 км по мере необходимости. Или вы можете вычислить начальное значение для каждого угла квадрата 1x1 км на лету, используя некоторую функцию f (x, y). - person PauliL; 17.06.2010
comment
Но углов мало, правда? Если у меня есть только углы, то два соседних квадрата не будут плавно переходить, если я прав? - person Peter Jaric; 17.06.2010
comment
Это правда. Вам нужно будет либо изменить алгоритм Plasma Cloud, чтобы он сначала вычислял ребра. Или замените генератор случайных чисел какой-нибудь функцией stateles. Я обновил ответ. - person PauliL; 18.06.2010

У вас есть практически единственный способ сделать это - в основном вы создали функцию f, которая предоставляет географические данные для f (x, y). Конечно, у вас может быть несколько функций, которые вы используете для создания ландшафта.

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

person Skizz    schedule 16.06.2010
comment
Я не очень разбираюсь в фракталах, и мне интересно, можно ли использовать генерацию фрактального ландшафта для создания двух перекрывающихся прямоугольников по отдельности без каких-либо различий в перекрывающихся частях? Я думаю, что это наиболее важный аспект моего вопроса. - person Peter Jaric; 16.06.2010
comment
И еще один вопрос, действительно ли сглаживание является правильным решением? - person Peter Jaric; 16.06.2010
comment
@snowlor, да, фракталы могут это делать, например фрактал случайного смещения средней точки - он принимает в качестве входных значений граничные значения. Чтобы сделать его идеально подходящим, вам придется немного изменить обычную процедуру (которая принимает только углы) и заставить ее работать с известными перекрывающимися значениями. Они также хороши для динамического LOD. Для сглаживания - придется подправить самому; некоторые участки более гладкие, а некоторые менее гладкие. - person Unreason; 16.06.2010