База Рецептов Minecraft
Наш опрос
Оцените мой сайт
Всего ответов: 308
Главная » 2011 » Сентябрь » 6 » Генерация земли, часть 1
14:15
Генерация земли, часть 1




Давно собирался описать техническую составляющую Minecraft'а, но никак руки не доходили до этого. Но сейчас я на маленьком самолёте и отсюда некуда бежать, так что поехали!

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

1) Как сделать мир бесконечным?

Сначала позвольте мне сказать пару вещей о «бесконечной» земле: она не бесконечная, но у неё нет определённого лимита. Просто чем дальше вы продвигаетесь, тем больше будет лагать. Земля генерируется, сохраняется, загружается и появляется снова с помощью чанков (один чанк это 16*16*128 блоков). Эти чанки имеют значение, которое представляет из себя 32-х битное целое число, которое хранит в себе информацию о примерно от -200 млрд. до +200 млрд. чанков. Если вы выходите за границу (а до неё, как до 1/4 пути до солнца) , то старые чанки начинают перезаписываться новыми. На 1/16 этой дистанции любые предметы, использующие целые координаты блоков будут вести себя странным и случайным образом.

Существует только два жёстких лимита.

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

Большинство таких проблем решаются изменением математической модели окружения игрока и поэтому числа иногда могут иметь одинаковые значения. Для рендера Minecraft'а я использовал локальные координаты блока и координаты относительно игрока, и таким образом создаётся впечатление, что игрок движется. В основном это достигается с помощью OpenGL и 32-битных чисел с плавающей точкой для координат, но ошибки округления становятся очень очевидны, когда вы видите их в игре.

Мы пока не собираемся исправлять эти баги, потому что ещё не все игроки поняли, что нужно играть легально. Уверен, что большинство ещё довольно далеки от того, чтобы это понять. Путь до понимания этого может занять много времени. Кроме того, баги - это часть загадок Далёких Земель...

2) Как земля стала иметь такую классную форму?

В очень ранней версии Minecraft'а я использовал карту высот 2D шумов Перлина , чтобы придать миру форму. Ох, точнее я использовал множество из них. Один для общего подъёма, один для придания неровностей и один для мелких деталей. Для каждого столба из блоков высота вычислялась по формуле (подъём + (неровность*мелкие детали))*64+64. Все подъёмы и неровности были гладкими, на слишком большие добавлялся «шум», и детали были более запутаннее, чем сейчас. Этот метод имеет большое преимущество в плане скорости и в нём 16*16*(количество шумов) сэмплов для генерации в каждом чанке, но проблема была в том, что этот способ скорее был туп. Особенно тупизна видна в том, что нельзя сгенерировать нависающие склоны и арки.

Итак я предпочёл эту систему похожей, сделанной на 3-D шумах Перлина. Вместо проверки по высоте, я установил значение шума на «густоту» и теперь всё, что ниже 0 (нуля) будет воздухом, а всё, что на том же уровне или выше будет землёй. Чтобы убедиться, что дно плоское и без дыр, а верх не плоский я просто добавил высоту (исключая места под водой) в список сэмплов для генерации.

Но, к сожалению, я тут же столкнулся с проблемами производительности и игровой механики. Производительность падала из-за того, что нужно было обработать огромное количество сэмплов, а проблемы с игровой механикой были в том, что не было равнин и пологих холмов. Решением стало переключение сэмплов в более низкое разрешение (8х по горизонтали и 4х по вертикали) и использование линейной интерполяции. Внезапно игра стала генерировать равнины, пологие холмы и большинство единичных летающих блоков пропали.

Текущая формула, которую я использую довольно запутана (и секретна!), но она постепенно эволюционирует (во время работы над игрой). И да, она ещё использует 2D карту высот и шумов.
Просмотров: 477 | Добавил: oOoScarletoOo | Теги: Генерация, Земля | Рейтинг: 0.0/0
Всего комментариев: 0
minecraft-db.3dn.ru
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]