воскресенье, 5 июля 2015 г.

Проблемы игровых миров и их моделирования с точки зрения дилетанта

Еще одной темой, которая меня волнует в сфере генераций мира для игры, это картина его целостности. Вот взять случайно сгенерированный бесконечный мир Minecraft - в лучшем случае, существует мод, который позволяет как-то разместить на нем "климатические" пояса, то есть, скажем, есть экватор, полный сухих пустынь, из которых, двигаясь на юг или север можно попасть в тропики, умеренные широты, затем тундры и, наконец, в заснеженные места. И потом - в обратном порядке. Если такой мир замкнуть, появится полное ощущение движения по сферической планете. Это полностью соответствует ожиданиям. Однако.
У мира всегда есть история. Когда-то на нем могла быть весьма бурная геологическая жизнь с вулканами, были какие-то места обитания древних существ, где они умерли и как-то их следы должны находиться. В подходе с полной случайностью это обычно проявляется в виде плавно размазанных по миру древних шахт и сокровищниц, каких-то, таких же случайных, пещер и все такое прочее. Мне это не очень нравится, потому что "целостность" пропадает. Было бы куда интереснее находить заброшенные деревни, рядом с которыми можно найти следы деятельности жителей в виде тех же шахт и т.п.
В этом смысле интресно выделяется, как наиболее яркий пример, Dwarf Fortress, где случайно сгенерированный мир перед, собственно, игрой, длительное время переживает в ускоренном темпе какой-то исторический процесс. Появляются и исчезают цивилизации, народы, цари и герои, свидетельства о которых оказываются закопаны где-то в глубинах в виде древних легендарных артефактов, руин старых городов и такого прочего. И практически никогда у вас не будет двух одинаковых историй. Это по-своему интересно, но ставит сложный вопрос - как не генерировать весь мир полностью, и в то же время создать для него последовательную и целостную историю, которая может быть получена путем изучения мира? И, конечно, просто поставить вопрос, не пытаясь ответить на него, я не могу :)
Во-первых, можно пытаться сделать вид, что история была, но создать только ее конечные результаты. Скажем, изначально вписать в некоторые переменные для всего мира его возраст и уровень, до которого что-то там развилось и умерло. Можно там же создать и записать функцию, которая сможет вычислить распределение останков этого прошлого в чанках/кубиках этого мира и потом генерировать чанки, как это и предполагается - только там, где кто-то на это смотрит.
Второй вариант - это повторить DwarfFortress, но если детализовать это до уровня каждого мелкого блока, ваш сгенерированный мир превратится в многотерабайтный ужас для вашего жесткого диска. Это, как по мне, совсем не круто.
Ну и третий вариант это нечто смешанное. Мне давно приходит на ум, что любители писать игры в мир из кубиков могли бы сделать его более динамичным и интересным, не рассматривая его только на уровне "блоков" и "загруженный/выгруженный чанк - как набор блоков". Я имею в виду, что можно постепенно, по мере удаления от наблюдателя, уменьшать детализацию мира. Ведь, по сути, кусок 2х2х2 блока есть сущность, которая состоит из 8 блоков, и, при правильном подходе, наверняка можно смоделировать процессы внутри более крупных "блоков" так, чтобы при обратном преобразовании в отдельные части создавалась иллюзия правдоподобности процессов. По мере удаления можно сжимать эти "двублоковые" блоки дальше, вплоть до уровня чанков, 2х2-чанков и т.п. И, наверняка, на таком уровне можно даже моделировать какие-то процессы глобального уровня, не загружая каждый чанк в память для рассчетов, а только представления этих групп. И кто-то мне уже подсказывал, что для вокселей есть какой-то такой алгоритм, который работает примерно так же. Для теста этой концепции, конечно же, надо было бы сначала написать такой себе маленький кубический движок и найти пример такого процесса, чтобы оценить производительность. Да, кстати, это могло бы позволить обеспечить очень широкую область видимости не вызывая загрузку в x^2 большего количества чанков/блоков целиком, просто чтобы нарисовать их. Ведь давно применяется метод уменьшения детализации с расстоянием, почему бы и тут не поступать так? :) Мне даже кажется, что для проверки концепта не нужно даже писать рендерер, можно ограничиться простейшей моделью без всякой визуализации, чем и собираюсь заняться в ближайшее свободное время.

5 комментариев: