Давайте напишем ... MMO! Часть 8: Строительство мира

Опубликовано NowhereMan -

11 января 2011

 

Рис. 1: Маленький мир

В шестой части я решил, что хочу, чтобы игровой "мир" состоял из поля астероидов, чтобы у игроков был повод собраться в кучу. Я не хочу, чтобы люди расползались во всех направлениях и никогда не встречались друг с другом.

Итак, следующий вопрос - насколько большим должен быть астероид? В данных Minecraft, с которыми я играл, я импортировал блок 128 на 128 на 128. Это достаточно много материала для одного человека, чтобы строить (это более двух миллионов кубов). Если я хочу поддержать 500 человек на астероиде, каждый с таким количеством кубов для игры, есть два способа вычислить размер астероида.

Если делать это по площади, то 128 на 128 на 500 человек - это 8 192 000 кубиков. Сфера с такой площадью поверхности имеет радиус 807 единиц. Но я предполагаю, что люди будут закапываться в астероид и строить подземные города, или выдолбить центр и заполнить его городом, оставив поверхность как парк и т.д. Если делать расчет по объему, то куб 128 на 128 на 128 для 500 человек - это 1 048 576 000 кубов, но сфера с таким объемом имеет радиус всего 630 единиц.

Рис. 2: Слишком маленький!

В демо-версии я построил сферу радиусом 630, чтобы по ней можно было ходить. См. рис. 1. Горизонт немного близко, но я думаю, что он, вероятно, работает. Кстати, я не делаю эту сферу из кубов. Я просто использовал текстуру куба, чтобы получить представление о том, сколько пространственных зданий там будет занимать. Она сделана из полигонов.

В таком маленьком мире есть два риска: 1) близкий горизонт будет выглядеть своеобразно, здания будут явно наклоняться от вас вдаль, и 2) строительство с кубами будет проблемой. На рисунке 2 вы видите, что меня беспокоит. Если мир слишком мал, то локальная "вертикаль" будет меняться слишком быстро, делая близлежащие здания выглядящими наклоненными, или делая невозможным соединение различных конструкций, потому что блоки находятся под разными углами.

Если предположить, что мой астероид правильного размера, пришло время придать ему пейзаж. Если бы мы делали плоский ландшафт, мы могли бы использовать то, что называется маппингом высоты. В каждой точке сетки у нас есть высота, и мы рисуем треугольники между соседними точками. Шамус Янг объясняет все это здесь.

Я могу взять сферу и использовать широту и долготу вместо X и Y, а также добавить карту высот к радиусу сферы. Используя некоторый шум в качестве карты высот, я могу деформировать сферу и получить комковатый мир. См. Рисунок 3. И я могу обойти это в своей демонстрации (Рисунок 4), чтобы посмотреть, как это выглядит.

Рис. 3: Деформирование сферы с помощью шума
Рис. 4: Прогулка по низким холмам

Мне это не очень нравится. Я хотел чего-то более драматичного, но думаю, что маленькие горы в маленьком мире будут выглядеть глупо. Так что я снова начинаю играть с демо. У меня есть сфера, сделанная из кубов, 128 на 128 на 128 (самая большая вещь, которую сейчас поддерживает мое демо). У меня также есть блок шума такого же размера. См. рис. 5. Могу ли я что-нибудь с этим сделать?

Рис. 5: Сфера и немного шума. Хмм...

Если я вычту шум (ограниченный выше некоторого значения) из сферы, то получу рисунок 6. Это выглядит интересно, но мне не нравится идеально сферическая поверхность. Взяв подсказку из записи Флориана (здесь), я умножаю расстояние от центра сферы на шум, а затем ограничиваю его. Это дает мне хороший камушек. Смотрите рисунок 7.

Рис. 6: Сфера минус шум
Рис. 7: Сфера, умноженная на шум

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

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

Рис. 8: Вычесть еще немного шума
Рис. 9: Рейтрейсинг Скалы
Рис. 10: Полет сквозь астероид

{"preview_thumbnail":"/sites/default/files/styles/video_embed_wysiwyg_preview/public/video_thumbnails/iwmnxOH6tfI.jpg?itok=d_XPf13u","video_url":"https://youtu.be/iwmnxOH6tfI","settings":{"responsive":1,"width":"854","height":"480","autoplay":0},"settings_summary":["Embedded Video (Адаптивный)."]}

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

Один из вопросов, который стоит обсудить на данном этапе, это то, как будет выглядеть мир, подобный этому. Я представляю себе, как он кишит городами и другими структурами, как сервер TwentySided Minecraft. Если я позволю людям строить внутри астероида, я введу фундаментальную проблему - там много пейзажей очень близко. Это означает, что я не могу использовать обычный трюк, позволяя вещам исчезать в тумане на расстоянии.

На поверхности у меня нет проблем. Короткий горизонт будет работать как туман, быстро скрывая здания, когда они уходят слишком далеко. Так что вы все думаете? Шар города, похожий на Эшера, в центре астероида, или маленький мир, где через несколько минут ты перешагнешь через горизонт? А что мне делать с гравитацией? Должна ли она каким-то образом быть локальной к строению (так, чтобы вы просто указывали вверх от того, на чем вы стоите), или же указывать вниз к центру?

Я также сделал этот мир очень темным - и в буквальном смысле, и в настроении. Как только он наполнится кусочками зданий Минекрафта, он будет выглядеть довольно угрожающе. Если бы игра была создана в этом мире, Гильдия Ассасинов заняла бы видное место. Конечно, так как это всего лишь один астероид, то следующий может быть покрыт кроликами и единорогами. (очевидно, ловушка!)

Дайте мне знать, что вы думаете.