Создание нового мира — работа с картой высот, лодами и генерация всего необходимого
Для начала немного теории
Единицы измерения
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 м., без каких либо ограничений.
Использование же таких глубин и высот на практике маловероятно. К примеру мир Tamriel содержит 3808 x 3008 HP, а разница по высоте между самой высокой и самой низкой точками ландшафта составляет 1063 метра. В 3D это выглядит так
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 и добавляем парочку фильтров с настройками как на скриншоте:
Нажимаем кнопку Generate и ждем завершения генерации, смотрим в режиме 3D, устраивает ли нас результат. Если не очень – то генерируем заново, до достижения приемлемого рисунка, каждый раз рельеф будет разный. При получении желаемого рисунка можно отметить чекбокс Keep Seed – это предотвратит изменение рельефа при последующей перегенерации, которая может понадобиться при настройках или изменениях фильтров. У меня получилось вот так:
Если освоить программу и изучить настройки фильтров, то можно делать весьма приличные ландшафты. К тому же (если например нужно определенное расположение гор) можно импортировать изображение с набросками рельефа, и доработать до приемлемого качества.
Закончив генерацию ландшафта переходим на вкладку Project, и устанавливаем параметры Projectsize 4096 и Max Altitude 600 (высота рельефа, как в настройках Generation, но можно и другую выставить) и 0 в полях Point at и Cut соответственно. После чего нажимаем Rebuild и ландшафт реконструируется. При этом он станет почти плоским, это нормально. Проект можно сохранить и экспортировать результат в формате RAW 16 bit или TIFF 16 bit.
Полученную карту высот открываем в Photoshop и отражаем по вертикали, так как TESAnnwyn при обработке RAW формата отражает изображение, таким образом восстанавливая исходное положение, и применяем размытие по Гауссу с радиусом 1 пиксел, для сглаживания угловатостей в рельефе подобных этим
Сохраняем результат в формате RAW. На всякий случай настройки открытия и сохранения RAW формата в Photoshop
Компилируем .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 и зависит от особенностей рельефа и необходимого уровня воды.
Компиляция завершилась успешно
Ошибок не возникло, разница высот около 600 метров, что и ожидалось. Копируем полученный esp в папку data в директории игры (можно переименовать) и переходим к следующему шагу.
Создание лодов
Для создания лодов воспользуемся программой Oscape. Лоды можно создать и с помощью Creation Kit, но это долго, чревато вылетами конструктора и отсутствием контроля над процессом. После запуска программы первым делом в меню Game выбираем режим работы Skyrim.
Во вкладке Active Plugins отмечаем наш esp файл с ландшафтом, если вы его не переименовали, то он будет называться tesannwyn.esp. По слухам Oscape работает только с esm файлами, но у меня он и с esp прекрасно справился. Далее нажимаем кнопку Fill и в выпадающем слева списке выбираем наш мир, название которого задавали в параметре –w при создании esp. Отмечаем чекбоксы feature-map и surface-map. Выбираем место и имя файла вывода, и жмём Extract.
После извлечения необходимых файлов программа переключится на вкладку Preview, где мы увидим нашу карту высот, и области заполненные водой, обозначенные синим цветом. Если уровень воды отличается от ожидаемого, то нужно перекомпилировать esp с корректировкой параметра –h. Затем повторить извлечение карты высот в Oscape.
Oscape имеет одну неприятную особенность – ячейка с координатами 0, 0 не обрабатывается при извлечении карты высот, что выражается черным квадратом на карте размером 31 х 32 пиксела и соответствующим провалом в лодах. Лечится вставкой в извлеченную карту аналогичной области из исходной карты, с корректировкой яркости, так как карты отличаются. Результат до и после.
Также после создания лодов надо будет исправить четыре текстуры лежащие по пути 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 – название мира, у вас будет своим), закрасив чёрный квадрат основным цветом. Результат до и после.
Параметры сохранения текстур
UPD. Проблема с ячейкой 0, 0 обусловлена отсутствием регионов в esp файле. Добавление хотя бы одного региона с помощью Creation Kit, даже без назначения на какие либо ячейки, перед запуском Oscape, устраняет проблему пустой ячейки с координатами 0, 0 в лодах.
После исправления карты высот нажимаем кнопку Accept в программе Oscape и попадаем во вкладку Generator. Выставляем параметр Target of max. Resolution отвечающий за полигональность генерируемых мешей. Слишком высокое значение приводит к ошибке при генерации лодов, поскольку количество полигонов в мешах не может превышать 64 К на один меш. Для моей карты подошло значение 800 000. Отмечаем чекбоксы как на скриншоте и жмём Generate. После завершения генерации программа переключит нас на вкладку Installer, где проверяем правильность директории инсталляции (папка data в директории игры), отмечаем все чекбоксы и жмём Install.
После инсталляции не забываем исправить текстуры центральной ячейки.
Теперь можно подключить наш esp в лаунчере игры и переместиться в созданный мир с помощью консольной команды cow testworld 0 0. Testworld – название вашего мира, координаты ячейки могут быть другими, в диапазоне размеров вашего мира.
В качестве дополнения к туториалу хочу показать ещё один вариант создания карты высот.
На этот раз мы не будем генерировать рельеф случайно, а попробуем создать его по своим параметрам, на основе заготовки.
Заготовочку для примера я сделал разрешением 2048 х 2048 пикселов, и довольно примитивную. Можно сделать её с большим количеством слоёв, и более разнообразным рельефом. В моём случае это будет остров с большой горой. Нарисована она из восьми слоев разного оттенка серого, от 30% до 95%. Первые три слоя (самые темные) имеют между собой меньшую разницу в оттенке, нежели последние, этим обеспечивается необходимый угол наклона поверхности. После сведения слоев применяем размытие по Гауссу, в моем случае с радиусом 20 пикселов.
Импортируем в Geo Control
и начинаем экспериментировать с фильтрами. Здесь ни каких конкретных советов дать не могу, сам только учусь. После часа экспериментов у меня получилась вот такая картина
Дальше всё по туториалу, компилируем esp, если возникают ошибки возвращаемся в Geo Control, меняем настройки фильтров, и пробуем ещё раз. Если ошибок не много, то можно уменьшить высоту рельефа в параметре Max Altitude на вкладке Project. У меня рельеф генерировался с высотой 1500 м., а Max Altitude я установил в 1000 м. Высота после компиляции получилась 964 м. над водой, и 29 м. под водой.
Дополнение
Выше было рассмотрено создание ЛОДов земли для нашего мира. Но ЛОДы - это не только земля на расстоянии, но также и отдаленные объекты и деревья. Стоит отметить, что на сегодняшний день существует много различных утилит по генерации ЛОДов для объектов и деревьев, но мы же их тут рассматривать не будем. Предполагается, что вы будете использовать для этого редактор 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]
Комментарии