KF SDK: текстуры и статичные меши
Два урока маппера K-2 с форума killingfloor.ru (2011): работа с текстурами и со статичными мешами в KF SDK, с несколькими полезными уточнениями из обсуждений. Самые основы редактора (браши, свет, пути) описаны в основах редактора карт и в руководстве по маппингу.
Браузер текстур
Текстура — изображение, которое накладывается на поверхности. Смотреть, выбирать и редактировать текстуры можно в Texture Browser: View > Show Texture Browser или кнопка на верхней панели инструментов. Он также открывается при старте редактора.
Элементы браузера:
| Элемент | Назначение |
|---|---|
| Верхнее поле | Открытый пакет текстур |
| Нижнее поле | Группа внутри пакета |
| Кнопка показа всех текстур | Показать все текстуры пакета |
| Режим просмотра | Текстуры в пакете |
| Используемые на карте | Только текстуры, которые есть на карте |
| Most Recently Used | Последние использованные текстуры |
| Свойства | Открыть свойства выбранной текстуры |
| Исходный пакет | Открыть пакет, из которого взята выбранная текстура |
| Переключатель групп | Быстрый переход между группами |
Браузер открывает и создаёт пакеты текстур .utx, пакеты делятся на группы. Для быстрого поиска есть фильтр, а размер превью меняется во вкладке View.
Наложение и выравнивание
Чтобы наложить текстуру на браш, выделите поверхность и щёлкните по текстуре в браузере.
Если текстура легла не так или плохо стыкуется с соседними, точнее всего её выставить инструментами Pan, Rotate и Scale в Surface Properties:
| Поле | Что делает |
|---|---|
| Pan | Смещение текстуры (в пикселях, относительно размеров) |
| Rotate | Вращение и зеркальное отражение |
| Scale | Размер текстуры в соотношении пиксели/Unreal Unit |
| Scale по U и V | То же, но отдельно по горизонтали и вертикали: можно растянуть или сплющить текстуру |
| Флажок относительности | Считать ли изменение относительно текущего размера |
| Размер карты освещения | Разрешение lightmap для этой поверхности |
U — горизонталь, V — вертикаль. С зажатым Shift текстура смещается и вращается в обратную сторону.
Есть ещё инструменты Texture Pan и Texture Rotate. В Texture Pan с зажатым Ctrl левая или правая кнопка мыши смещают текстуру, а обе кнопки сразу меняют размер. Texture Rotate работает так же, только поворачивает.
Импорт и экспорт текстур
В браузере текстур выберите File > Import. В окне импорта:
| Поле | Значение |
|---|---|
| Package | Пакет, в который идёт импорт. Укажите MyLevel, чтобы текстура хранилась в файле карты без отдельного пакета. Если импортировали в отдельный пакет, его нужно сохранить |
| Group | Группа, на ваш вкус |
| Name | Имя текстуры. Если текстура с таким именем уже есть, она будет заменена |
| LOD | Levels of Detail: несколько вариантов текстуры разной детализации, которые переключаются в зависимости от расстояния до камеры. Для максимального качества оставьте 0 |
| Masked | Для текстур с участками полной прозрачности |
| Alpha | То же, но с частичной прозрачностью (альфой). Если не уверены, отмечайте Alpha |
| Generate MipMaps | Генерирует уменьшенные копии текстуры. Можно спокойно включать |
| Detail Hack? | Только для detail-текстур (см. ниже): размывает их при большом удалении |
Стороны текстуры должны быть степенью двойки (16, 32, 64, 128, 256, 512 и так далее). Поддерживаемые форматы: dds, tga, bmp, pcx, upt. Если импорт молча не срабатывает, см. пункт про импорт текстур в известных ошибках руководства по маппингу.
Лучший вариант — dds (DirectDraw Surface). После импорта текстуру можно конвертировать в dds и сжать: выделите её и выберите Tools > Compress (или то же через меню по правой кнопке). Типы сжатия:
| Тип | Альфа | Примечание |
|---|---|---|
| DXT1 | Непрозрачная | Наибольшее сжатие |
| DXT3 | Явная | Часто используется для корон света |
| DXT5 | Интерполированная | Если выберете DXT5, не ошибётесь |
После сжатия рядом с именем текстуры в браузере появляется метка в скобках, например [DXT3]: значит, компрессия прошла. Учтите размер: десяток текстур 1024×1024 и больше в одном пакете может весить около 100 МБ, и игрокам придётся долго качать его с сервера (замечание UltraKill из обсуждения).
Прозрачность без сюрпризов (форум killingfloor.ru, темы «DDS и иже с ним (война с форматами текстур)» и «Текстуры без фона»). DDS с альфой из Photoshop часто сохраняется криво: вместо прозрачного фона получаются размазанные цвета или альфа «блоками». Надёжнее сохранить картинку в 32-битный TGA с альфа-каналом, при импорте в SDK отметить Alpha и уже в редакторе сжать в DXT5 (или DXT3). В альфа-канале чёрное — прозрачная часть, белое — видимая; если после импорта получился пустой прозрачный квадрат, проверьте именно альфа-канал. Если всё же сохраняете DDS из Photoshop (плагин NVIDIA Texture Tools), выбирайте DXT5 и не забудьте галочку Alpha при импорте. Paint.NET умеет сохранять DDS без плагина.
Вытащить текстуру из редактора: File > Export или правый клик → Export to File…
Свойства текстуры
Свойства открываются через Edit > Properties или правым кликом по текстуре.
| Группа | Что там |
|---|---|
| Animation | Простая анимация сменой текстур: в свойствах одной текстуры задаётся только следующий кадр и частота смены. Не лучший способ |
| Material | Материал текстуры. Выбрав в SurfaceType нужный EST, вы задаёте звуки попаданий и шагов и частицы при ударе (дерево, стекло, металл и т.д.) |
| Quality | bHighColorQuality и bHighTextureQuality. Видимой разницы между True и False нет |
| Surface | bAlphaTexture — частичная прозрачность (можно задать при импорте); bMasked — части текстуры либо полностью прозрачны, либо непрозрачны; bTwoSided — двусторонняя текстура, функция не самая полезная |
| Texture | Detail-текстура, DetailScale, LOD и LODSet (см. ниже) |
| TextureFormat | Просто показывает формат текстуры |
Detail-текстуры
Detail — обычно небольшие серые текстуры, которые накладываются поверх основной и улучшают её вид вблизи. В KF они лежат в пакете Detailtextures_T.utx.
- Выберите detail-текстуру в браузере.
- В свойствах основной текстуры, группа Texture, в поле
Detailнажмите Use. - В
DetailScaleнастройте соотношение размеров: чем больше значение, тем мельче детали.
Там же можно настроить LOD (чем больше, тем более размытой будет текстура) и его тип LODSet, но это не обязательно.
Светящиеся текстуры (шейдер)
Уточнение K-2 из обсуждения, как сделать текстуру, которая светится как неоновые вывески:
- Создайте в браузере текстур новый шейдер.
- В поля
DiffuseиSelfIlluminationдобавьте нужную текстуру. - Если светиться должна не вся текстура, добавьте
SelfIlluminationMask.
У текстуры для SelfIlluminationMask должен быть альфа-канал: прозрачными делаются все участки, которых самоосвещение не должно касаться; возможен плавный переход по градиенту. Простые маски можно сделать даже в Paint.NET, стирая лишнее; для сложных лучше Photoshop или аналог.
Анимированная текстура
В редакторе есть два способа.
Кадры с суффиксом _aXX
Импортируйте кадры с окончанием _aXX в имени, где XX — номер кадра с 00:
name1_a00
name1_a01
name1_a02
В свойствах текстур, группа Animation, следующий кадр подставится автоматически. Скорость задаётся в FrameRate. Этим способом частично сделаны заставки мониторов на KF-Icebreaker.
MaterialSequence
- В браузере текстур выберите File > New.
- Задайте пакет, группу и имя, в
MaterialClassвыберитеMaterialSequence. - В поле
SequenceItemsдобавляйте кадры кнопкой Add. - Для каждого кадра задайте три параметра (таблица ниже).
| Параметр | Значение |
|---|---|
| Action | Стадия: FadeToMaterial — картинка плавно перетекает в следующую (часто используется для превью карты); ShowMaterial — картинка просто показывается (несколько таких стадий подряд сменяются мгновенно) |
| Material | Текстура-кадр |
| Time | Продолжительность стадии |
Созданная последовательность отображается как 1 pass. Само превью карты при загрузке задаётся в F6 > LevelSummary > Screenshot (подсказка BAHO из обсуждения).
Статичные меши
Static mesh — полигональный меш, из которых на Unreal Engine строится большая часть архитектуры. «Static» значит, что анимации у него нет, но двигать и масштабировать его можно в реальном времени без перекомпиляции. Меши бывают любой формы и размера, плоские и объёмные.
Для сложных форм статики удобнее и гибче, чем BSP: модель может состоять из сотен треугольников, и движку проще обработать статик, чем BSP такой же формы.
Static Mesh Browser
Открывается во вкладке View или отдельной кнопкой на панели. Он похож на браузер текстур: здесь можно выбрать объект, рассмотреть его и наложить на него текстуру. Камера в окне браузера управляется так же, как в редакторе. Браузер работает с пакетами .usx.
Текстуры накладываются во вкладке Materials. Модель может состоять из нескольких частей со своими текстурами; у каждой части своя вкладка с номером, начиная с 0.
- Выберите текстуру в браузере текстур.
- В Static Mesh Browser откройте Materials, вкладку нужной части.
- Щёлкните по полю
Materialи нажмите Use.
Где-то часть одна, а где-то их пятнадцать; сначала придётся подбирать наугад, какая текстура куда.
Добавить меш на карту:
- правый клик в нужном месте вьюпорта → Add Static Mesh: 'название';
- или кнопка Insert Static Mesh into Level в браузере: меш появится на месте камеры активного 3D-вьюпорта.
Кнопка Frame Current выравнивает вид в окне браузера с учётом поворота камеры.
Импорт мешей
- В Static Mesh Browser выберите File > Import.
- Выберите файл. Поддерживаются
aseиlwo, в основном используютase. - В окне импорта задайте пакет, группу и имя.
Меш импортируется без текстуры (получит NULL material), если текстура заранее не была импортирована под исходным именем. В этом случае наложите текстуры заново во вкладке Materials. После текстурирования сохраните и пакет мешей, и пакет текстур.
UltraKill в обсуждении советовал добавлять к именам пакетов сокращения по типу: _sm для мешей, _T/Tex для текстур, _S/Snd для звуков, _A/Anims для анимаций (например, Tank_sm и Tank_T). Имена пакетов — без пробелов и только латиницей.
Конвертирование моделей из других игр
Программ для 3D много; K-2 использовал MilkShape 3D — простую и удобную для несложных операций.
- Импортируйте модель в MilkShape: File > Import, выбрав формат.
- Экспортируйте её в
ase: File > Export. - Импортируйте
aseв редактор, как описано выше.
Для экспорта в ase в старых версиях MilkShape нужен плагин; по сообщению из обсуждения, в MilkShape 3D 1.8.5 Beta экспорт в ASE уже встроен. Текстуры в MilkShape не обязательны: если при импорте он ругается Error opening following textures и модель белая, это не страшно — главное получить ASE, а текстуры наложить уже в редакторе.
Масштаб статиков из S.T.A.L.K.E.R. Из темы «Статические меши из Сталкера» (форум killingfloor.ru): Rainishе раскритиковал выложенный пак статиков за нарушенные пропорции. По его словам, статики с уровней Сталкера при переносе в 3ds Max нужно увеличивать в 60.5 раз (а не 80 к 1) и делать vertex weld с параметром 0.0001.
Про экспорт моделей из 3ds Max через ActorX см. отдельную статью.
Перенос целых карт из других игр и склейка карт
Из тем «importing in SDK» и «скрещивание карты» на форуме killingfloor.ru. Карту из Quake III, Counter-Strike или Serious Sam импортировать в SDK нельзя: у движков разная механика, такие карты можно только воссоздать, вытащив и сконвертировать текстуры и объекты. Целиком переносятся только карты игр на Unreal Engine 2 (с Unreal Engine 1 и 3 — с искажениями). Для стабильного порта карты на UE2, по словам K-2, нужны:
- редактор оригинальной игры (Unreal Editor версии не ниже 3.0);
- все пакеты с ресурсами, перенесённые в папку KF (ресурсы, «вшитые» в myLevel, требуют дополнительных операций);
- копирование всех объектов карты в редакторе оригинала и вставка в KF SDK: вставятся только классы, существующие в KF, свойства останутся оригинальными;
- адаптация под особенности конкретной карты.
Так же склеивают две карты в одну: кусок одной карты копируют и вставляют в другую. Gaiver5 и krestps предупреждали, что после этого почти наверняка придётся править пути и муверы.
Конвертирование брашей в статики и обратно
- Solid-браш превращается в меш: правый клик по его контуру → Convert > To Static Mesh. Появится окно, как при импорте. Грани разобьются на треугольники, наложенные текстуры и текущий Pivot сохранятся.
- Если конвертировать сразу группу брашей, они соединятся в один объект. Так же можно повторно сконвертировать группу статиков в один (например, стопку книг или гору ящиков).
- Статик можно превратить обратно в браш-builder: Convert > To Brush.
- Муверы конвертировать нельзя, только их «исходники». Ошибки при конвертировании (например,
Assertion failed: StaticMeshActor) бывают нередко, и лекарства от них нет. Чтобы перенести объект на другую карту со всеми свойствами, его достаточно скопировать (Ctrl+C) и вставить (Ctrl+V): всё хранится в буфере обмена, поэтому вставить можно даже после перезапуска редактора (ответ K-2 в теме «Вопросы, вопросы и еще раз вопросы.»).
Как перенести меш в MyLevel
Способ UltraKill из обсуждения: так меш хранится прямо в файле карты, и отдельный пакет не нужно класть в архив с картой.
- Выберите меш в Static Mesh Browser.
- Edit > Rename…, в поле пакета впишите
MyLevel, остальное — как угодно. - Проверьте, что меш появился в пакете
MyLevel, и сохраните карту. - Перезапустите редактор и откройте карту: меш на месте.
Объекты из MyLevel другой карты можно перенести копированием: откройте ту карту, выделите объекты, Ctrl+C, откройте свою и Ctrl+V. Если же вы используете меши из своего отдельного пакета, этот пакет и его текстуры придётся распространять вместе с картой.
Свойства меша на карте
Основные свойства уже поставленного меша, группа Display. Если не уверены, лучше не трогайте значения по умолчанию.
| Свойство | Значение |
|---|---|
AmbientGlow | Статическое свечение: объект светлее без сторонних источников света |
bAcceptsProjectors | Остаются ли на объекте следы крови и т.п. |
bAlwaysFaceCamera | Только для плоских объектов: если True, лицевая сторона всегда повёрнута к камере игрока (иногда используется для листвы) |
bShadowCast | Отбрасывает ли модель тень. Довольно важный параметр |
bUnlit | Если True, модель полностью освещена независимо от источников света |
CullDistance | Дальность прорисовки в UU: если камера дальше, объект скрывается. 0 — без ограничения |
DrawScale | Размер модели с сохранением пропорций |
DrawScale3D | Размер отдельно по X, Y и Z (относительно DrawScale). Отрицательные значения дают зеркальное отражение. Быстро масштабировать можно полем DrawScale3D на нижней панели |
ForcedVisibilityZoneTag | Тег зоны, где объект принудительно видим; в других зонах он скрыт |
Skins | Текстура-скин, заменяющая заданную в браузере мешей без изменения самого меша (так же добавляются короны к источникам света) |
StaticMesh | Текущий меш и его путь (пакет, группа, имя) |
Параметры коллизии (осязаемости):
| Свойство | Значение |
|---|---|
bAutoAlignToTerrain | Привязка к ландшафту, очень удобна |
bBlockActors, bBlockKarma | Особого смысла не несут: за осязаемость отвечают два параметра ниже |
bBlockNonZeroExtentTraces | Блокировать ли ненулевые трассеры: игроков, зомби, брошенные предметы |
bBlockZeroExtentTraces | Блокировать ли нулевые трассеры: пули, гранаты и пр. |
bCollideActors | Взаимодействует ли объект с окружением. Если False, все bBlock не действуют |
bPathColliding | Блокирует ли объект построение AI-путей при компиляции |
bUseCylinderCollision | Цилиндрическая коллизия (лучше оставить False) |
CollisionHeight, CollisionRadius | Высота и радиус цилиндрической коллизии |
SurfaceType | Тип поверхности. Значения не имеет: задаётся наложенной текстурой |
Коллизия и освещение мешей
Уточнения K-2 из обсуждения (2015):
- Для моделей сложной формы обычно делают невидимую упрощённую модель коллизии: игроки не цепляются за мелкие неровности, а компьютеру проще считать столкновения. Без неё, а также для нулевых трассеров (пули, гранаты) проверка идёт по исходной полигональной модели.
- В UE2 статики освещаются не картами освещения, как BSP, а по вершинам (Vertex Lit). Поэтому без очень плотной сетки реалистичных теней на них не будет; особенно это видно на низкополигональных и сильно увеличенных объектах — неровное затемнение соседних треугольников или чернота у вершин, перекрытых другой геометрией. С ландшафтом то же самое. Где нужны тени на объектах, обычно ставят прожектор с заранее подготовленной текстурой.
- Сложные BSP-формы в пару тысяч полигонов работают в разы медленнее статиков и часто дают «чёрные дыры» из-за проблем с BSP-деревом. Epic Games делали наборы мешей «как лего»: секции стен, пола и потолка с кратными размерами, которые почти бесшовно стыкуются друг с другом.