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