Winding Trail project

 

О том, как ландшафт лохматят.

Январь 18, 2006, 18:30
Автор:
Jim
Категория: Художник

На самом деле, этот пост должна была Алена писать - это она все это программила и знает, как это работает на уровне движка. Но, поскольку вопрос постоянно задают мне почему то, да и рулить этим всем приходится тоже мне, то расскажу о построении ландшафта в игре с моей, “пользовательской”, точки зрения.

Нет, я не рисую 3D модель поверхности, которую потом крутит движок, как многие полагают. Я вообще ландшафт не рисую, как таковой. И Алена не рисует. Все это пересеченное безобразие рисует движок совершенно самостоятельно. От меня, как от дизайнера ландшафта требуется лишь сказать движку, где я гору хочу, а где - яму. А от Алены, как от программера требуется “всего лишь” написать фрагмент кода, который будет это делать безотносительно к каким-то особенностям рельефа. Движок уж сам там должен разбираться, фрагмент чего ему подсунули, расставит вершины на нужной высоте и протянет между ними нужное количество полигонов под нужными углами. Насколько я понял из объяснений Алены - вполне традиционное техническое решение.

Для указания движку где гора, а где яма, используется т.н. “карта высот”. Это обычная ч/б картинка, представляющая как бы проекцию ландшафта на плоский лист бумаги. Каждая точка этой картинки - вершина. И она будет расположена тем выше некоей абсолютной нулевой отметки, чем эта точка белее. Иными словами, совершенно черная (RGB 0,0,0) точка означает минимально возможную высоту, белая (RGB 255,255,255) - максимально возможную высоту.

Пример такой карты:

Даже не подключая к мозгу модуль “imagination pro” можно увидеть, где на итоговом ландшафте, построенном по такому фрагменту будет долина, где горы.

Втихую признаюсь, что я т.о. подсовывал нашему движку вполне реальные карты высот. В частности куски поверхности Марса и Луны :-) Только, естественно не просто очернобеленную фотку поверхности - это не то. В сети на различных тематических ресурсах (так сходу не назову, но найти можно относительно легко), есть уже готовые карты высот, сделанные различными автоматическими станциями NASA. Однако, все эти карты достаточно масштабные. Если их переносить на размеры мира нашей игры, там такая пересеченка получается, что не только грузовик, но и танк не проедет. А сглаживать, редактировать и масштабировать - проще с нуля самому нарисовать. И быстрее к тому же. Так, что, в итоге, все ручками и рисуется.

Понятно, что имея только одну карту высот мы получим одноцветную 3D модель поверхности, которую нужно еще и раскрасить. Для этого используются текстуры. Тоже картинки. На этот раз цветные. Такие картинки могут накладываться сразу на весь участок, а могут накладываться только на определенные его фрагменты. Для простоты рассмотрим вариант, когда текстурная картинка одна. Например, вот такая:

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

А дальше я расскажу про множество “но”.

НО не так все просто в реальной жизни. В частности, территория по которой игрок будет колесить в нашей игре достаточно большая. Если текстуру на нее накладывать одним сплошным куском, как показано на схеме - никакой памяти не хватит такой труколорный битмэп крутить с достаточной производительностью. Впрочем, его можно на лету резать и подгружать кусочками, но все равно сам размер файла с такой картинкой будет неоправданно большим. Все ж мы не DVD-версию делаем. Поэтому мы пошли по пути “мозаики”. Т.е. нарисовали совсем крошечный квадратик с текстурой, которую можно повторять сколь угодно большое количество раз. Сам ландшафт разбивается автоматически на небольшие секции - квады, каждой из которой присваивается этот крошечный кусочек текстуры.

НО и тут не все так просто. Если повторять все время один и тот же текстурный квадратик, то ландшафт получится, хоть и цветным, но однородным. Поэтому у нас используется не один текстурный квадратик, а целая куча. С трещинами и кратерами, с ямками и горками, ровные и рифленые… Много. Все они рандомно распределяются и накладываются на квады, сцепляясь в несколько более разнообразную мозаику.

НО выбрасываются они не просто согласно прихоти рандома, а для каждой картинки набора прописывается некая вероятность. Т.о. более универсальные и однородные квадратики встречаются на порядок чаще, чем квадратики с кратерами, например. Вероятности подбираются таким образом, чтобы по возможности, на одном экране не встречалось двух одинаковых кратеров или трещин. Этот момент с частотой выпадания пока у нас еще не до конца отлажен. Идет кропотливый тюнинг.

НО и этого маловато для нормальной картинки. Поэтому мы делим ландшафт не только поквадно по площади, но и по уровням высоты. Для каждого уровня характерен свой набор текстур, отличный от набора другого уровня. Приблизительно вот так:

Видно, что размеры (высота) определяемых уровней могут быть разными. Поуже, пошире, все это подбиралось уже на глаз основываясь на лохматости самого ландшафта.

НО и это еще не все. Просто так раскидать наборы мозаик по уровням мало. Если мы это сделаем вот так, как есть, то получим слишком четкое разделение между уровнями. Земля станет полосатой или еще хуже - в клеточку, если на разных квадах будет доминировать высота разных уровней. Поэтому спрограммлено это наложение так, что на стыке уровней наборы текстур смешиваются, плавно переходя из одного типа в другой. Т.о. получаем плавный переход от одного набора текстур к другому в зависимости от высоты. Ширина этой “полосы смешивания” тоже задается опционально. Помню очень долго Алена эти переходы программила, там есть ряд подводных камней со смешиванием текстур, а я потом долго-долго занимался уже тюнингом переходов, подбором нужных величин. В настоящий момент удалось добиться адекватного смешивания до трех наборов-уровней текстур. Смешивания всего двух граничных оказалось недостаточно для резких перепадов высот.

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

Например, в предыдущих постах, на скриншотах вы могли видеть дорогу. Повторю картинку для наглядности:

Вот, на ней мы видим, как раз, плавный переход между двумя наборами текстур - более темное дно долины и более светлые холмы. Зато дорога, что бежит по дну долины - это та самая дополнительная текстура. Она не входит в состав мозаичных наборов, что распределяются по уровням. Это отдельная текстура, сама по себе. Накладывается согласно четко предписанному руками конфигу, где нет места ни для рандома, ни для какой другой автоматизации. Таких уникальных фрагментов доптекстур тоже много и раскладываются они уже в соответствии с “сюжетной” логикой игры.

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


Комментариев: 14
Оставить комментарий
Автор: Alena (01.18.06, Январь 18, 2006, 23:59)

Иными словами, совершенно черная (RGB 0,0,0) точка означает минимально возможную высоту, белая (RGB 255,255,255)

Что-то я сразу не обратила на это внимания. Нет там RGB. Мы храним 8 бит всего.

Автор: Jim (01.19.06, Январь 19, 2006, 9:56)

А мне пофигу. У меня в фотопаинте RGB. И исходный объектный рисунок карты даже и не bmp вовсе.
Сохраняю для движка, как b/w 8-bit - это да, но работать мне удобнее в RGB, а как оно там что хранит не знаю - мы люди дикие, творческие: медведи, водка, ба-ла-лай-ка… :-)

Автор: maksla (01.19.06, Январь 19, 2006, 17:06)

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

Автор: Jim (01.19.06, Январь 19, 2006, 17:47)

Компьютер вообще ничего не сохраняет. У него есть только карта высот и текстуры. Это для него данность на основе которой ландшафт на экране и рисуется. Если я что-то меняю на карте высот или подсовываю другие текстуры, то при запуске движок уже все нарисует пользуясь этими обновленными данными. В смысле, 3D-модель ландшафта вообще не существует нигде, кроме, как в оперативной памяти компьютера, куда он ее сам строит по мере необходимости, в процессе игры. Эту модель не нужно “пререндерить” как-то заранее. Все создается на лету по тем “законам мира”, что мы заложили в основу.

Автор: maksla (01.19.06, Январь 19, 2006, 18:26)

Значит проехаться по местам боевой славы в игре не получится? :)
Или, если получится, то ландшафт будет действенно чист?

Автор: Alena (01.19.06, Январь 19, 2006, 18:41)

Или дизайн таки не трансформируется?

Я не очень понимаю что именно понимается под “трансформацией дизайна”, обрисую картину в целом.
Ландшафт у нас не деформируется. То есть если выстрелить в скалу, от нее кусок не отвалится. Однако, если уничтожить врага, на его месте останется след от взрыва, который через некоторое время пропадет. При следующей загрузке игры врага на этом месте не будет, следа тоже.

Автор: maksla (01.20.06, Январь 20, 2006, 15:14)

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

Автор: Jim (01.20.06, Январь 20, 2006, 16:23)

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

Автор: fuxx (01.21.06, Январь 21, 2006, 20:03)

Про последнюю приведенную картинку в этой заметке.

Затемнение более низких участков поверхности совершенно не создает впечатление объема. Вначале я подумал что это просто другая земля (как например области со спайсом в дюне). Прочитав что это пониженный участок стал думать чего же здесь не хватает. Оказалось - стенки не отбрасывают тени! Т.е. соседнее здание отбрасывает (и на ямы в том числе), а “подтеневая” и “светлая” стороны ямы ничем не отличаются :-( Хотя, может быть в динамике это и не заметно…

Автор: Alena (01.21.06, Январь 21, 2006, 20:48)

Т.е. соседнее здание отбрасывает (и на ямы в том числе), а “подтеневая” и “светлая” стороны ямы ничем не отличаются. Хотя, может быть в динамике это и не заметно…

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

Автор: Jim (01.21.06, Январь 21, 2006, 21:49)

На этом скриншоте их видно, если приглядеться.

Да, без теней рельеф весь сжирается в плоскость, тут и говорить нечего - так уж человеческий глаз работает. Но все будет хорошо! И тени вернутся в наш мир. Уже со следующей партии скриншотов, может, и вернутся… Я там пошаманю в настройках :-)

Автор: singalen (01.23.06, Январь 23, 2006, 11:34)

Из другой оперы, и возможно, что вы это уже читали и знаете. Тем не менее, тут пара хороших идей:
http://gas13.ru/tutorials/sywtbapa/4/
http://gas13.ru/tutorials/sywtbapa/51/

256 градаций высоты - не мало?

Автор: Jim (01.23.06, Январь 23, 2006, 11:48)

Да, это из спрайтовой оперы. Читать не читал, но знаю. В принципе там правильные вещи освещаются, но несколько скомканно.

“256 градаций высоты” это не только не мало, это даже больше, чем реально будет использоваться. Скажем, “рабочая” высота в среднем по некоторой области - 10-15. Так, вот на ней, яма до нулевой глубины (перепад в 10-15 градаций), уже получается визуально чуть ли не бездонной. На всех скриншутах, холмы, что видны, это где-то в пределах 20-30 градаций перепады. Т.е. нам этих 256 градаций хватит еще и на то, чтобы разные высотные “климатические” зоны сделать, возникни в них нужда, а не то, что “рабочий” рельеф.

Pingback Winding Trail project (02.16.07, Февраль 16, 2007, 21:23)

[…] Экономить хочется как можно больше, “все равно это никто не увидит”. Но “волшебные кнопки”, действия, которые никогда нельзя предпринимать и тому подобное не добавляют удобство дизайнеру уровней, который теряет драгоценное время. Сейчас мы пытаемся соблюсти идеальный баланс между экономией времени программиста и экономией времени дизайнера уровней. Было бы наверное проще, если бы дизайном зон занималась я, поскольку я знаю как конструктор устроен внутри. Но все зоны будет дизайнить Джим, который умеет это делать значительно лучше меня. Поэтому уже есть один момент по которому экономии не получается никак - мне нужно писать инструкцию по работе с конструктором. А чем конструктор проще и хуже, тем больше вещей приходится описывать. Несмотря на то, что несколько зон Джим уже сделал, мне никак не удается довести конструктор до нужной степени удобства, постоянно то там, то сям всплывают непонятности, недостает возможностей. Сейчас я начинаю работу над визуальным редактированием ландшафта. До этого Джим его редактировал исключительно из графического редактора, что оказалось крайне неудобно и прожорливо по времени. Комментариев: 3 Оставить комментарий Автор: Maniac (02.27.06, Февраль 27, 2006, 16:58) […]



Оставить комментарий

(обязательно)

(обязательно)


Переводы строк автоматические, e-mail никогда не показывается, разрешен HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>