Создание нового мира — работа с картой высот, лодами и генерация всего необходимого

Для начала немного теории

Единицы измерения 

1 GU (Game Unit) = 0,5625 дюйма = 1,42875 см.
1 THU (TES Height Unit) = 8 GU = 4,5 дюйма = 11,43 см. – шаг изменения высоты рельефа.
1 HP (Height Point) =128 х 128 GU = 182,88 х 182,88 см. - базовая величина, фрагмент поверхности ландшафта приходящийся на один пиксел карты высот.
1 Cell (Ячейка игрового мира) = 32 х 32 HP.
Максимальный размер играбельного мира составляет 128 х 128 Cell, 4096 х 4096 HP, или приблизительно 7 491 х 7 491 метр.

Кое-что о карте высот 

Карта высот, из которой компилируется esp файл с ландшафтом мира, представляет собой изображение в цветовом режиме «градации серого» с глубиной канала 8 или 16 бит, что составляет 256 и 65536 оттенков серого соответственно. Каждый шаг градиента соответствует 1 THU, таким образом из 8-ми битной карты высот можно сделать ландшафт с глубиной от -128 до +127 THU или 29,15 метров. Пригодно только для плоских ландшафтов. Можно, конечно, применить масштабирование при компиляции, но при этом пострадает детализация поверхности. 16-ти битная карта формирует рельеф с глубиной от -32768 до +32767 THU, что соответствует 7 491 метру. Один пиксел карты высот соответствует одному HP, таким образом максимальное разрешение карты должно составлять 4096 х 4096 пикселов.

Существует миф о том, что Skyrim считывает изображения с оттенками в интервале 0-76%. Это не так. Я скомпилировал градиентную карту с оттенками от черного до белого цветов, и получил ландшафт соответствующей высоты – от -3 745 м. до +3 745 м., без каких либо ограничений.

pre_1444161300__1.jpg

pre_1444161362__2.jpg

Использование же таких глубин и высот на практике маловероятно. К примеру мир Tamriel содержит 3808 x 3008 HP, а разница по высоте между самой высокой и самой низкой точками ландшафта составляет 1063 метра. В 3D это выглядит так 

pre_1444161407__3.jpg

Jднако существует некоторое ограничение на разницу высот соседних HP, которая должна лежать в диапазоне от -128 до +127 THU. Если это правило будет нарушено, то соответствующие пикселы карты высот будут исключены при компиляции и на ландшафте получим неприятные артефакты в виде отверстий или вертикальных стен. О наличии подобных ошибок мы узнаем по итогам компиляции, отчетная информация будет содержать следующие строки

Some gradient overflows/underflows have been caught and blocked:
Total Overflows:  46785                     
Total Underflows: -3671

Цифры, естественно, будут иными. В этом случае надо доработать карту высот, яркость любых двух соседних пикселов которой не должна отличаться более чем на -128 или +127 шагов градации серого. Это применимо в основном к 16-ти битной карте и лечится, к примеру, снижением яркости изображения (как следствие снижение глубины рельефа) либо применением каких-нибудь сглаживающих фильтров в графическом редакторе (что повлечет сглаживание детализации) или в Geo Control, что даст более интересный результат.

Переходим к практике

Создаем карту высот

Самое сложное – это создание карты высот, которая дала бы нам в итоге желаемый рельеф и без ошибок. Можно рисовать её в каком-нибудь графическом редакторе, можно воспользоваться специализированным софтом, предназначенным для генерации ландшафтов, а можно совместить эти два варианта – наброски сделать в редакторе, а необходимую детализацию добавить с спец-софте. Для данного туториала я воспользовался программой Geo Control 2. После запуска программы будет активна вкладка Generation и в настройках General устанавливаем Terrain Size – 4096 (разрешение карты высот), Width – 7491 (ширина ландшафта), Height – 600 (желаемая максимальная высота рельефа), Amount of details – 16 (детализация генерируемых искривлений поверхности), переходим в настройки Filter и добавляем парочку фильтров с настройками как на скриншоте: 

pre_1444161520__4.jpg

Нажимаем кнопку Generate и ждем завершения генерации, смотрим в режиме 3D, устраивает ли нас результат. Если не очень – то генерируем заново, до достижения приемлемого рисунка, каждый раз рельеф будет разный. При получении желаемого рисунка можно отметить чекбокс Keep Seed – это предотвратит изменение рельефа при последующей перегенерации, которая может понадобиться при настройках или изменениях фильтров. У меня получилось вот так:

pre_1444161582__5.jpg

Если освоить программу и изучить настройки фильтров, то можно делать весьма приличные ландшафты. К тому же (если например нужно определенное расположение гор) можно импортировать изображение с набросками рельефа, и доработать до приемлемого качества.

Закончив генерацию ландшафта переходим на вкладку Project, и устанавливаем параметры Projectsize 4096 и Max Altitude 600 (высота рельефа, как в настройках Generation, но можно и другую выставить) и 0 в полях Point at и Cut соответственно. После чего нажимаем Rebuild и ландшафт реконструируется. При этом он станет почти плоским, это нормально. Проект можно сохранить и экспортировать результат в формате RAW 16 bit или TIFF 16 bit.

pre_1444161626__6.jpg

Полученную карту высот открываем в Photoshop и отражаем по вертикали, так как TESAnnwyn при обработке RAW формата отражает изображение, таким образом восстанавливая исходное положение, и применяем размытие по Гауссу с радиусом 1 пиксел, для сглаживания угловатостей в рельефе подобных этим

pre_1444161756__7.jpg

Сохраняем результат в формате RAW. На всякий случай настройки открытия и сохранения RAW формата в Photoshop

pre_1444161801__8.jpg

Компилируем .esp

TESAnnwyn – это консольная утилита, которая на основе карты высот компилирует esp файл с ландшафтом. Для своего ландшафта я использовал следующие параметры

TESAnnwyn.exe -i Skyrim -p 1 -b 16 -d 4096x4096 -x -64 -y -64 -h -11000 -w TestWorld land.raw

Подробности о программе и параметрах её запуска можно изучить в прилагаемой к ней документации. Остановлюсь лишь на параметре –h, который отвечает за уровень самой нижней точки ландшафта относительно уровня воды, который в свою очередь задаётся в параметрах Worldspace в esp файле создаваемого мира, по умолчанию равен нулю, и я его не менял, за отсутствием видимого смысла. Эта цифра измеряется в GU и зависит от особенностей рельефа и необходимого уровня воды.

Компиляция завершилась успешно

pre_1444161878__9.jpg

Ошибок не возникло, разница высот около 600 метров, что и ожидалось. Копируем полученный esp в папку data в директории игры (можно переименовать) и переходим к следующему шагу.

Создание лодов

Для создания лодов воспользуемся программой Oscape. Лоды можно создать и с помощью Creation Kit, но это долго, чревато вылетами конструктора и отсутствием контроля над процессом. После запуска программы первым делом в меню Game выбираем режим работы Skyrim.

Во вкладке Active Plugins отмечаем наш esp файл с ландшафтом, если вы его не переименовали, то он будет называться tesannwyn.esp. По слухам Oscape работает только с esm файлами, но у меня он и с esp прекрасно справился. Далее нажимаем кнопку Fill и в выпадающем слева списке выбираем наш мир, название которого задавали в параметре –w при создании esp. Отмечаем чекбоксы feature-map и surface-map. Выбираем место и имя файла вывода, и жмём Extract.

pre_1444161940__10.jpg

После извлечения необходимых файлов программа переключится на вкладку Preview, где мы увидим нашу карту высот, и области заполненные водой, обозначенные синим цветом. Если уровень воды отличается от ожидаемого, то нужно перекомпилировать esp с корректировкой параметра –h. Затем повторить извлечение карты высот в Oscape.

pre_1444161970__11.jpg

 Oscape имеет одну неприятную особенность – ячейка с координатами 0, 0 не обрабатывается при извлечении карты высот, что выражается черным квадратом на карте размером 31 х 32 пиксела и соответствующим провалом в лодах. Лечится вставкой в извлеченную карту аналогичной области из исходной карты, с корректировкой яркости, так как карты отличаются. Результат до и после.

thumb_pre_1444161997__12.jpg

pre_1444162028__13.jpg

Также после создания лодов надо будет исправить четыре текстуры лежащие по пути Data\Textures\terrain\TestWorld testworld.4.0.0.dds, testworld.8.0.0.dds, testworld.16.0.0.dds и testworld.32.0.0.dds (testworld – название мира, у вас будет своим), закрасив чёрный квадрат основным цветом. Результат до и после.

pre_1444162057__14.jpg

pre_1444162081__15.jpg

Параметры сохранения текстур

pre_1444162113__16.jpg

 UPD. Проблема с ячейкой 0, 0 обусловлена отсутствием регионов в esp файле. Добавление хотя бы одного региона с помощью Creation Kit, даже без назначения на какие либо ячейки, перед запуском Oscape, устраняет проблему пустой ячейки с координатами 0, 0 в лодах.

После исправления карты высот нажимаем кнопку Accept в программе Oscape и попадаем во вкладку Generator. Выставляем параметр Target of max. Resolution отвечающий за полигональность генерируемых мешей. Слишком высокое значение приводит к ошибке при генерации лодов, поскольку количество полигонов в мешах не может превышать 64 К на один меш. Для моей карты подошло значение 800 000. Отмечаем чекбоксы как на скриншоте и жмём Generate. После завершения генерации программа переключит нас на вкладку Installer, где проверяем правильность директории инсталляции (папка data в директории игры), отмечаем все чекбоксы и жмём Install. 

pre_1444162171__17.jpg

pre_1444162192__18.jpg

После инсталляции не забываем исправить текстуры центральной ячейки.

Теперь можно подключить наш esp в лаунчере игры и переместиться в созданный мир с помощью консольной команды cow testworld 0 0. Testworld – название вашего мира, координаты ячейки могут быть другими, в диапазоне размеров вашего мира.

pre_1444162247__19.jpg

pre_1444162284__20.jpg

pre_1444162312__21.jpg

pre_1444162338__22.jpg

pre_1444162368__23.jpg

pre_1444162402__24.jpg

 

В качестве дополнения к туториалу хочу показать ещё один вариант создания карты высот.

На этот раз мы не будем генерировать рельеф случайно, а попробуем создать его по своим параметрам, на основе заготовки.

Заготовочку для примера я сделал разрешением 2048 х 2048 пикселов, и довольно примитивную. Можно сделать её с большим количеством слоёв, и более разнообразным рельефом. В моём случае это будет остров с большой горой. Нарисована она из восьми слоев разного оттенка серого, от 30% до 95%. Первые три слоя (самые темные) имеют между собой меньшую разницу в оттенке, нежели последние, этим обеспечивается необходимый угол наклона поверхности. После сведения слоев применяем размытие по Гауссу, в моем случае с радиусом 20 пикселов. 

pre_1444162483__25.jpg

Импортируем в Geo Control 

pre_1444162514__26.jpg

и начинаем экспериментировать с фильтрами. Здесь ни каких конкретных советов дать не могу, сам только учусь. После часа экспериментов у меня получилась вот такая картина

pre_1444162564__27.jpg

Дальше всё по туториалу, компилируем esp, если возникают ошибки возвращаемся в Geo Control, меняем настройки фильтров, и пробуем ещё раз. Если ошибок не много, то можно уменьшить высоту рельефа в параметре Max Altitude на вкладке Project. У меня рельеф генерировался с высотой 1500 м., а Max Altitude я установил в 1000 м. Высота после компиляции получилась 964 м. над водой, и 29 м. под водой.

pre_1444162639__29.jpg

pre_1444162663__30.jpg

pre_1444162699__31.jpg

pre_1444162728__32.jpg

pre_1444162753__33.jpg

 

Дополнение

Выше было рассмотрено создание ЛОДов земли для нашего мира. Но ЛОДы - это не только земля на расстоянии, но также и отдаленные объекты и деревья. Стоит отметить, что на  сегодняшний день существует много различных утилит по генерации ЛОДов для объектов и деревьев, но мы же их тут рассматривать не будем. Предполагается, что вы будете использовать для этого редактор Creation Kit. И сейчас мы поговорим об одном очень неприятном подводном камне, с которым вы наверняка столкнетесь в процессе работы.

Дело в том, что алгоритм работы Oscape и Creation Kit (далее СК) - разный, и частенько бывает такое, что ЛОДы объектов/деревьев, созданные с помощью СК, не будут работать с ЛОДами земли, сгенерированными через Oscape. Как результат вы либо будете видеть только ЛОДы деревьев/объектов и отсутствие ЛОДов земли, либо наоборот, либо же чересполосицу земли (полоса светлая, полоса черная). Мы же сейчас обсудим как нам "сшить" эти ЛОДы так, чтобы они вместе корректно работали. Ну что ж... немного о том, в чем технически заключается данный конфликт...

Итак, Oscape-у все равно, какие ячейки у вас задействованы, он спокойно сгенерирует ЛОДы земли для всего мира. а СК же создает ЛОДы только для активных ячеек, т.е. для тех, которые задействованы (видоизменены, отредактированы) у вас в плагине. Таким образом, какая-нибудь ячейка "Пустоши -30 -30" на отшибе вашего мира вряд ли подвергалась редактированию и, следовательно, не будет затронута при генерации ЛОДов через СК. Поэтому нам нужно сделать ее активной вручную. Суть конфликта вроде бы объяснил, теперь к решению. Сделать ячейку "активной", можно поредактировав там ландшафт или поместив в нее какой-то объект. Но не спешите, это несколько не то, что я предлагаю. Значит, мы открываем в СК вкладку "World", идем в раздел "Regions" и создаем новый регион для своего мира. Причем создаем не абы какой, а строго определенный. Квадрат с координатами в крайних ячейках нашего мира. Например так:

  • левый нижний угол (-32; -32)
  • левый верхний угол (-32; -31)
  • правый верхний угол (31; 31)
  • правый нижний угол (31; -32)

И отмечаем регион как "Border region" - т.е. граничный. Это не обязательно, но, сами понимаете, за ним все равно ничего нет, а подобная галка не позволит игроку зайти за край мира. Все ячейки, которые затрагивает регион, стали "активными". Теперь их видит наш esp. Все, такой вот нехитрой операцией мы решили упомянутую проблему несостыковки ЛОДов. Теперь можно спокойно генерировать ЛОДы объектов/деревьев в СК и не бояться того, что с ЛОДами от Oscape-па что-то случится.

Да, немаловажное замечание! Сохраните свой плагин и перезапустите СК, в момент генерации ЛОДов ничего не должно быть подгружено в Render Window, иначе беда - поломается ландшафт, и вы запорете себе плагин. Поэтому не забудьте перед генерацией сделать бэкап, ну и, желательно, сконвертировать свой esp в esm и генерировать ЛОДы уже из esm.

P.S. Созданием региона, мы устранили и еще одну проблему, упомянутую ранее в туториале. Проблему черной ячейки в координатах (0,0). Практика показывает, что если для мира создан хоть один регион, то при генерации ЛОДов земли в Oscape, черной ячейки не возникает.

На этом все.

[Дополнено werr92]

Автор: @perture, дополнено werr92
22

Комментарии

Добавить комментарий

Огромное спасибо!))

Интересный материал. Спасибо

Именно то, что хотелось! Спасибо!

Объясните пожалуйста почему после создания карты нет. Все было нормально, но потом после нескольких экспериментов не появляется карты. с чем это может быть связано?
Ресурсы папок такие же как в SE. но я взяла на le и карты опять нет. Не понимаю что я нахимичила , что у меня карты нет созданного мира. Пожалуйста помогите

Авторизуйтесь, чтобы оставить новый комментарий. Или зарегистрируйтесь.