Как я могу генерировать “неограниченный” мир?

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

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

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

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

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

Править: Забыл ссылку на мой вопрос.

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

РЕДАКТИРОВАНИЕ 3: относительно еще Некоторой информации попросили в комментариях.

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

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

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

Теперь по вопросам Глупости:

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

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

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

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

РЕДАКТИРОВАНИЕ 4: Надо надеяться, заключительный.

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

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

29
задан Glorfindel 29 July 2019 в 21:03
поделиться

5 ответов

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

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

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

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

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

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

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

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

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

5
ответ дан 28 November 2019 в 02:10
поделиться

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

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

1
ответ дан 28 November 2019 в 02:10
поделиться

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

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

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

2
ответ дан 28 November 2019 в 02:10
поделиться

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

2
ответ дан 28 November 2019 в 02:10
поделиться

Есть несколько статей, перечисленных здесь.

Вы упомянули Perlin Noise, и это хорошо работает, особенно если вам нужно генерировать рельеф, топологически не эквивалентный плоскости. В

The Science of Fractal Images есть раздел о спектральном синтезе, который позволяет настраивать результаты на основе желаемой фрактальной размерности. Проблема в том, что трудно генерировать рельеф, отличный от плоскости или тора.

0
ответ дан 28 November 2019 в 02:10
поделиться