Генератор ландшафта в Minecraft. Часть 1
В последнем посте в своем блоге Notch рассказал краткую историю создания и основные принципы работы генератора ландшафта в Minecraft. Предлагаю вам перевод данного материала (Осторожно, много терминологии!).
1) Насколько бесконечен мир?
Во-первых, позвольте разъяснить некоторые подробности насчет "бесконечности" миров. Миры не бесконечны, но и не имеют никаких жестких границ. Просто в игре появляется больше багов, когда вы заходите очень далеко. Ландшафт генерируется, хранится и загружается с диска и отрисовывается кусками по 16*16*128 блоков. У каждого куска имеется значение смещения, которое хранится в виде 32-битного целого числа и может находиться в диапазоне примерно от минус двух миллиардов до плюс двух миллиардов. Если вы зайдете за пределы этого диапазона (а это примерно четверть расстояния от Земли до Солнца), то новые куски начнут перекрывать собой старые. А после того, как вы преодолеете шестнадцатую часть этого расстояния, функции, использующие целые числа для работы с позициями блоков, такие как использование инструментов и поиск путей, начнут странно себя вести.
Это два действительно жестких ограничения.
Большинство других вещей, вроде исходных чисел для генератора ландшафта и положения объектов, используют 64-битные дробные числа и вызывают более хитрые проблемы. Например, на огромных расстояниях скорость передвижения игрока может быть медленнее, чем возле центра мира, из-за ошибок округления (значение позиции огромно, а значение смещения при движении крохотно, поэтому оно может обрезаться). Генератор ландшафта может начать создавать странные конструкции вроде огромных блоков одного материала, но такие вещи давно не замечались, и точно узнать причины их появления не удалось. Еще одна серьезная проблема на больших расстояниях появляется в физическом движке - игрок может случайно провалиться в землю или застрять в стене.
Большинство этих проблем может быть решено сменой системы координат для математических расчетов на локальную, центром которой будет игрок. Тогда все рабочие значения не будут сильно отличаться друг от друга. Нечто подобное уже реализовано для прорисовки - Minecraft использует локальные координаты игрока в пределах блока и смещает блоки относительно игрока, чтобы создать видимость движения. Такой принцип применяется в основном из-за того, что OpenGL использует 32-битные дробные числа для позиций, но, кроме этого, еще и потому, что ошибки округления очень заметны при выводе на экран.
Скорее всего, эти баги не будут исправляться, если только они не станут слишком часто возникать у игроков при игре без читов, что вряд ли случалось у кого-либо и вряд ли когда-нибудь случится. Более того, баги добавляют Дальним Землям загадочности и привлекательности...
2) Ну разве эти ландшафты не восхитительны?
В очень ранней версии Minecraft для придания миру формы была использована карта высот на основе двумерного шума Перлина. Или, если быть точнее, несколько карт высот. Одна для общей высоты, одна для шероховатости ландшафта и одна для мелких деталей. Для каждого столба блоков высота равнялась (общ_высота + (шероховатость*детали))*64+64. Карты общей высоты и шероховатости были гладкими, сильно масштабированными шумами, а детали были более мелкими. У этого метода было замечательное преимущество в скорости, так как нужно было провести всего 16*16*(количество_шумов) расчетов на кусок карты, но его недостатком был скучный ландшафт. В частности из-за невозможности генерировать нависающие над землей выступы.
Так что пришлось перейти на похожую систему, использующую трехмерный шум Перлина. Теперь уже не генерировалась "высота земли". Значение шума было рассмотрено как "плотность", и все блоки с плотностью меньше 0 становились воздухом, а блоки с плотностью больше или равной 0 становились землей. Чтобы нижний слой был твердый, а верхний - нет, к полученному результату прибавлялась высота (смещение относительно уровня моря).
К сожалению, мгновенно появились проблемы производительности и играбельности. Первые - из-за большого количества требуемых расчетов, вторые - из-за отсутствия плоских местностей и гладких холмов. Решение обеих проблем заключалось в понижении разрешения при расчетах (8x масштабирование по горизонталям и 4x по вертикали) и достраивании ландшафта с помощью линейной интерполяции. В игре появились плоскости и холмы, а заодно исчезло большинство парящих в воздухе блоков.
Окончательная формула, которая используется сейчас, немного улучшена (и секретна!). Она медленно развивалась в течение разработки игры, и, кстати, до сих пор использует двумерные карты высот и шумности.
В СЛЕДУЮЩИХ ЧАСТЯХ:
- Биомы!
- Пещеры и крупные детали рельефа!
- Деревья, озера и мелкие детали рельефа!
- Мир Nether!
Перевод - Terzalo. Ссылка на оригинал
- 10 марта 2011, 21:28
- 018
Интересно было почитать. Жду продолжения :)
Майнкрафт постепенно захватывает мир. :)
Спасибо за интересную статью, я бы ее не отыскал.
Большое спасибо за качественный перевод. Было интересно почитать. Тоже жду продолжения ;-)
Аналогично.
Интересно. Спасибо за перевод! :)
Про терминологию можно не предупреждать, её совсем немного и это основное содержание статьи.
написал простенькую программу, чтоб чар сам шёл вперёд. посмотрим.
у меня такое было как-то. Собрался делать space-симулятор. координаты корабля представлял как Float. Писал в Blitz3D, а там даже если значение выходит за пределы, движок пытается поддерживать работу программы, но, понятное дело, не без глюков. Так вот, я пару дней мучился с дребезжанием камеры и корабля, если отлететь достаточно далеко от центра. Потом плюнул на это дело - игру фтопку, blitz фтопку.
Вы прогу написали, чтобы в майнкрафте перс авто-шёл? ну, ждать придется долго. Я как-то захотел пойти к краю мира. Шел много дней (часов 20 нонстоп) и никаких глюков не было.
я пока прошёл 1/32 того, что мне надо.
понятно, что долго :) у него скорость ~ 1м/с (как у нормального человека). чтобы пройти 131 072 м (а это как раз 1/16 от максимума), надо потратить около 37 часов. неудивительно, что добраться не удалось :) там же еще деревья надо обходить
если программа действительно простенькая, идти перс будет до первой пещеры или отвесной стены. :)
ну я изредка прихожу и мышкой его направляю :) всё нормуль
вот плохо, что майн фоном не идёт
кстати, если идти по диагонали, стены не страшны
идёт и прыгает? :)
ага.
проще наверно будет взять прогу для редактирования карт и поставить player-point близко к 1/16 части.
но мы не ищем лёгких путей :) я думал, там суть в том, что должно подгрузиться всё это дело от спавна до 1/16
Там проблемы с очень большими рабочими значениями, так что можно через читы :)
оно только тормозить стало..
я ждал золотых гор и других глюков
Огромное спасибо за отзывы!
Следующие части будут переведены сразу после их появления :)
Minecraft - наше всё!
Эх, +1
http://www.minecraftwiki.net/wiki/Far_Lands
Те самые Дальние Земли
ОМГ! Так у меня такое было один раз, у меня дальние земли сгенерировались неподалёку от спавна, я ещё глаза выпучил от удивления о_О но это было только один раз и в версии 1.6.6, эх... как будто видишь мир в разрезе, жаль что я скриншотов так и не сделал...
У меня кучу "Разрез" багов,генерация старая