Навеяно той самой игрой Minecraft. Я в неё играл, и меня всё один вопрос занимает.
Как они сделали, что можно телепортироваться в любую точку огромнейшего мира.
И там сравнительно быстро сгенерируется то, что в окрестности этой точки должно быть?
Т.е. ландшафт, биомы, деревни, и прочая.
При этом, хоть ты генерируешь лишь участок мира в окрестности точки. Хоть генерируешь весь мир целиком — без разницы. Та окрестность в обоих случаях будет идентична.
Судя по всему, чтобы так быстро генерировать, они не рассчитывают хоть какую-то информацию о всём мире. Они сразу знают, что должно быть в той точке.
Вот смотрите, как я представляю, простой генератор мира работает.
Делим весь мир на клетки. Есть некая центральная клетка, от которой пляшем.
Нумеруем все клетки мира "улиткой", начиная с центральной клетки. Т.е. берётся всё более и более крупный виток этой улитки. И рано или поздно, любая клетка мира войдёт в какой-то виток, а значит получит номер.
Т.е. все клетки мира можно сопоставить некой натуральной последовательности.
Ну и сгенерировать псевдослучайную последовательность, которая задаст некоторое псевдослучайное число каждой клетке мира.
В итоге, когда мы переместимся в любую клетку, мы можем вычислить нужное число псевдослучайной последовательности для этой клетки. Ну и затем, от него плясать, генерируя мир в окрестностях точки, которая попала в текущую клетку.
Понятно тогда, что мир будет генерироваться всегда один и тот же.
Проблема в том, что расчёт всей этой псевдослучайной последовательности может занять кучу времени. Особенно, для удалённых клеток от центральной клетки.
А вот как сопоставить случайные числа произвольным клеткам без необходимости вычислять псевдослучайную последовательность? Т.е. обеспечить быструю реакцию при телепортации по карте?
В принципе, у меня есть мысли. Но это не то.
Можно например рассматривать блоки клеток разного порядка.
Блок 0-го порядка это, скажем, квадрат из 5 на 5 клеток.
Блок 1-го порядка, это скажем, квадрат из 5 на 5 блоков 0-го порядка
Блок 2-го порядка — квадрат 5 на 5 блоков 1-го порядка.
Ну и разбить весь мир на блоки. Центральная клетка лежит в центре блока 0-го порядка.
Дальше, блок 1-го порядка держит в себе в центре — центральный блок 0-го порядка.
Блок 2-го порядка держит в себе в центре — центральный блок 1-го порядка.
Ну и улиткой сначала нумеровать клетки в блоке 0-го порядка. Потом, нумеровать уже сразу блоки 1-го порядка (а не клетки внутри), а потом блоки 2-го порядка...
В общем, чем дальше уходит последовательность, тем более крупные участки мира нумеруются.
Ну а дальше, можно взять случайное число, ассоциированное с блоком в качестве исходного элемента вторичной псевдослучайной последовательности. Которой пронумеровать все клетки внутри блока.
Примерно представляете, о чём речь? Но это довольно всё левый, неудачный метод.
Боюсь, качество получаемых случайных чисел будет не очень.
Как ещё можно поступить?
Как они вообще там сделали?