Маппинг и SDK

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Имя текстуры. Если текстура с таким именем уже есть, она будет заменена
LODLevels 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, вы задаёте звуки попаданий и шагов и частицы при ударе (дерево, стекло, металл и т.д.)
QualitybHighColorQuality и bHighTextureQuality. Видимой разницы между True и False нет
SurfacebAlphaTexture — частичная прозрачность (можно задать при импорте); bMasked — части текстуры либо полностью прозрачны, либо непрозрачны; bTwoSided — двусторонняя текстура, функция не самая полезная
TextureDetail-текстура, DetailScale, LOD и LODSet (см. ниже)
TextureFormatПросто показывает формат текстуры

Detail-текстуры

Detail — обычно небольшие серые текстуры, которые накладываются поверх основной и улучшают её вид вблизи. В KF они лежат в пакете Detailtextures_T.utx.

  1. Выберите detail-текстуру в браузере.
  2. В свойствах основной текстуры, группа Texture, в поле Detail нажмите Use.
  3. В DetailScale настройте соотношение размеров: чем больше значение, тем мельче детали.

Там же можно настроить LOD (чем больше, тем более размытой будет текстура) и его тип LODSet, но это не обязательно.

Светящиеся текстуры (шейдер)

Уточнение K-2 из обсуждения, как сделать текстуру, которая светится как неоновые вывески:

  1. Создайте в браузере текстур новый шейдер.
  2. В поля Diffuse и SelfIllumination добавьте нужную текстуру.
  3. Если светиться должна не вся текстура, добавьте SelfIlluminationMask.

У текстуры для SelfIlluminationMask должен быть альфа-канал: прозрачными делаются все участки, которых самоосвещение не должно касаться; возможен плавный переход по градиенту. Простые маски можно сделать даже в Paint.NET, стирая лишнее; для сложных лучше Photoshop или аналог.

Анимированная текстура

В редакторе есть два способа.

Кадры с суффиксом _aXX

Импортируйте кадры с окончанием _aXX в имени, где XX — номер кадра с 00:

name1_a00
name1_a01
name1_a02

В свойствах текстур, группа Animation, следующий кадр подставится автоматически. Скорость задаётся в FrameRate. Этим способом частично сделаны заставки мониторов на KF-Icebreaker.

MaterialSequence

  1. В браузере текстур выберите File > New.
  2. Задайте пакет, группу и имя, в MaterialClass выберите MaterialSequence.
  3. В поле SequenceItems добавляйте кадры кнопкой Add.
  4. Для каждого кадра задайте три параметра (таблица ниже).
ПараметрЗначение
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.

  1. Выберите текстуру в браузере текстур.
  2. В Static Mesh Browser откройте Materials, вкладку нужной части.
  3. Щёлкните по полю Material и нажмите Use.

Где-то часть одна, а где-то их пятнадцать; сначала придётся подбирать наугад, какая текстура куда.

Добавить меш на карту:

  • правый клик в нужном месте вьюпорта → Add Static Mesh: 'название';
  • или кнопка Insert Static Mesh into Level в браузере: меш появится на месте камеры активного 3D-вьюпорта.

Кнопка Frame Current выравнивает вид в окне браузера с учётом поворота камеры.

Импорт мешей

  1. В Static Mesh Browser выберите File > Import.
  2. Выберите файл. Поддерживаются ase и lwo, в основном используют ase.
  3. В окне импорта задайте пакет, группу и имя.

Меш импортируется без текстуры (получит NULL material), если текстура заранее не была импортирована под исходным именем. В этом случае наложите текстуры заново во вкладке Materials. После текстурирования сохраните и пакет мешей, и пакет текстур.

UltraKill в обсуждении советовал добавлять к именам пакетов сокращения по типу: _sm для мешей, _T/Tex для текстур, _S/Snd для звуков, _A/Anims для анимаций (например, Tank_sm и Tank_T). Имена пакетов — без пробелов и только латиницей.

Конвертирование моделей из других игр

Программ для 3D много; K-2 использовал MilkShape 3D — простую и удобную для несложных операций.

  1. Импортируйте модель в MilkShape: File > Import, выбрав формат.
  2. Экспортируйте её в ase: File > Export.
  3. Импортируйте 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 из обсуждения: так меш хранится прямо в файле карты, и отдельный пакет не нужно класть в архив с картой.

  1. Выберите меш в Static Mesh Browser.
  2. Edit > Rename…, в поле пакета впишите MyLevel, остальное — как угодно.
  3. Проверьте, что меш появился в пакете MyLevel, и сохраните карту.
  4. Перезапустите редактор и откройте карту: меш на месте.

Объекты из 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 делали наборы мешей «как лего»: секции стен, пола и потолка с кратными размерами, которые почти бесшовно стыкуются друг с другом.