Как создать qc файл для smd
В предыдущих статьях цикла мы вплотную подобрались к финальной стадии процесса моделирования — сборке модели в один файл, который можно использовать в игре. Сегодня мы займемся последним этапом моделлинга — компиляцией. Причем, даже если вы не читали предыдущих статей, данный материал будет вам интересен. Ведь компиляция состоит из нескольких этапов, и все они универсальны. То есть на основе изложенной в статье информации вы сможете скомпилировать для игры абсолютно любую модель.
На первом этапе мы подготовим текстуры — из формата Targa переведем их в VTF , напишем для них VMT-скрипт , который будет управлять визуализацией и физикой материалов. Затем нужно будет написать qc-скрипт , согласно которому компилятор соберет модель. Потом мы подготовим модель, физическую оболочку, анимации и. откомпилируем то, что у нас получилось.
Формат VTF ( Valve Texture Format ) был специально разработан для хранения всех необходимых движку данных о материалах. Кроме самой текстуры с альфа-каналами там располагается карта нормалей, mip-уровни текстуры, являющиеся ее уменьшенными копиями, которые накладываются на объект при большом удалении от камеры (для экономии ресурсов).
Новая модель - противотанковый еж.
Для начала напишем для нашей текстуры VMT-файл. Не будем усложнять себе жизнь и сделаем материал достаточно простым.
"$baseTexture" "Models/Combine_soldier/Combine_elite"
"$envmap" "env_cubemap"
"$bumpmap" "models/combine_soldier/combine_elite_normal"
"$normalmapalphaenvmapmask" 1
"$selfillum" 1
Так должна выглядеть физическая оболочка модели.
Этот скрипт находится в одном из примеров к официальному SDK. Рассмотрим его, а потом вы сами решите, что убрать, а что добавить.
Ключевое слово VertexLitGeneric определяет тип освещения поверхности. Здесь используются вершинные шейдеры. Если бы вы делали материал для своей карты, на который могли воздействовать карты освещенности (то самое, из-за чего на карте появляется свет и из-за чего он так долго компилируется), то на его месте находилось бы слово LightmappedGeneric .
Описатель $BaseTexture указывает, где располагается ваша текстура в формате Targa. $envmap определяет тип взаимодействия освещения карты и окружения вообще с материалом. Здесь использована константа env_cubemap , определяющая, что поверхность будет блестеть и при этом на нее будут накладываться кьюбмэпы (cubemap) — особый вид текстур, состоящий из шести элементов. Эти элементы являются квадратными текстурами, и на них изображены все стороны света, верх и низ соответственно. В первой части HL так делались небеса.
Параметр $bumpmap показывает, что на вашу текстуру будет применен бампмеппинг, а путь после этого слова указывает, где находится карта высот. Затем идет идентификация карты нормалей. Единица указывает на то, что для этого материала определена карта нормалей и только часть модели, определенная альфа-каналом, будет отражать кьюбмэпы.
Далее следует описатель $model , единица после которого означает, что эта текстура будет накладываться на полигональную модель. $selfillum определяет, что часть текстуры, выделенная альфа-каналом, будет “самосветящейся” (как глаза у комбайнов).
Разумеется, все приведенные элементы вам не понадобятся, поскольку все разом они не могут быть отображены. Например, самосвечение перекроет кьюбмэпы и карты нормалей, и их не будет видно.
Так оболочка будет выглядеть, если не переназначить группы сглаживания.
После того как вы прописали в VMT-файле нужные элементы, приступим к созданию текстового файла, описывающего процесс компиляции через инструмент vtex.exe , обитающий в недрах официального SDK. Вот пример такого файла:
$nolod //Не использовать функцию level of detail
$nomip //Не разделять текстуру на mip-уровни
$clamps //Не повторять текстуру по S-координате
$clampt // Не повторять текстуру по S-координате — используется для текстур вроде спрайтов, не требующих повторения (тайлинга)
$skybox // Текстура будет использована как один из шести элементов неба
$startframe (integer) //Для анимированных текстур — начальный кадр
$endframe (integer) //Для анимированных текстур — конечный кадр. Имя текстуры при этом должно быть mytex001.tga ; mytex.002.tga ; mytex003.tga и т.д.
$nocompress //Не использовать сжатие текстур
$nonice //Не использовать NICE-фильтр для низших mip-уровней
$dxt5 //Использовать сжатие dxt5 вместо полного по умолчанию
Переходим к следующему этапу.
Для начала нам следует экспортировать модель в smd-файл . В XSI или в 3D Studio — не важно, экспортируется одинаково, только в последнем случае нужен плагин-экспортер, который можно взять с наших дисков . При нажатии Export вам будет задан вопрос, в каком виде сохранить модель.
Сначала сохраните ее как reference — это основная геометрия модели с координатами текстур. Затем очередь анимаций. Если у вас их много — экспортируйте каждую. Возможно, анимации у вас хранятся в отдельных файлах — тогда откройте их поочередно и сохраните как sequence .
Настало время создания физической оболочки. Это условная модель, по которой работает физика столкновений. Физическая оболочка должна быть выпуклым телом, то есть сложные элементы не подойдут, иначе движок доведет их до выпуклых. Как же быть? Выход есть — нужно разбить сложную модель столкновений на несколько простых, выпуклых, и после этого каждой из них присвоить свою группу сглаживания ( smoothing groups ), тогда все будет нормально.
Рекомендую сначала сделать вокруг модели ее физическую оболочку и только потом удалить модель (скелет не трогайте), а оболочку привяжите к соответствующим костям, чтобы физическая оболочка двигалась так же, как и видимая модель. Теперь можно и ее экспортировать.
Модель перед экспортом. Текстуры меняются после их компиляции в vtf.
Все, что нужно, подготовлено — осталось лишь собрать все воедино. Это делается в специальном скриптовом файле с расширением qc .
Вот пример простейшего скрипта:
$scale 1.0
$body "Body" MyModelReference.smd
$cd "C:/mypath"
$staticprop
$sequence SeqNameMyModel "MyModel_idle" fps 30
$collisionmodel "mymodel_phys.smd"
$mass 132
Физическая оболочка персонажа из Counter-Strike: Source.
Первая строка задает имя модели. Так будет называться файл, содержащий модель. Вторая строка отвечает за масштаб модели по сравнению с оригиналом. Параметр $body определяет название геометрии модели и название файла, содержащего эту геометрию. $cd задает путь к директории компилируемой модели. Если путь не задан, то модель выбирается из директории, где лежит файл qc.
Параметр $staticprop объявляет, что модель статична и не содержит анимации, кроме необходимой для компиляции (обычно там делают всего один кадр). Эта команда позволяет движку игнорировать движение костей внутри модели, в результате модель быстрее рендерится. Подходит только для статичных моделей вроде бочек, вывесок и похожих.
$sequence определяет анимацию, сразу после этого описателя идет название анимации и затем в кавычках — имя файла анимации. Слово fps задает скорость проигрывания анимации. Если у вас в редакторе анимация получилась длинной, например 30 кадров, и скорость проигрывания анимации вы поставите тоже 30 кадров, то анимация будет проиграна за 1 секунду, если же поставить скорость 15, то анимация проиграется за 2 секунды.
Параметр $collisionmodel задает имя файла с физической оболочкой. После идет блок команд в фигурных скобках. Команда всего одна — масса объекта, задается вами в килограммах. Например, бутылка водки будет иметь значение 0,5; а бронетранспортер БТР-80 — 13600 .
Когда файл компиляции закончен, можно собрать модель. Делается это так же, как и в случае с текстурами. Перенесите значок qc-файла на значок studiomdl.exe , после чего начнется компиляция. Когда все будет закончено, модель появится в определенной вами директории.
Вот мы и научились основам создания моделей для Half-Life 2. Многое осталось за кадром, но самые главные моменты мы рассмотрели. На базе полученных знаний вы можете самостоятельно творить и экспериментировать.
В описании компиляции нет ничего сложного, но иногда объемы текста просто поражают. Например, при создании ragdoll’а нужно описать каждый сустав и индивидуально задать ему диапазон подвижности. При создании техники нужно также описать очень много параметров, таких как точки соприкосновения с поверхностью, амортизация, анимация поворота и радиус поворота колес и много чего еще.
Коротко о возможных ошибках. Самые типичные из них — не найден файл материала, не привязаны кости к модели (если в модели остался хоть один свободный вертекс, модель не удастся экспортировать).
Не ставьте физическую оболочку копией файла reference — это, в зависимости от сложности модели, сильно нагружает процессор расчетом физики. Если расположение костей и их количество в файле геометрии не совпадает с количеством в файле анимации, то в лучшем случае компилятор выдаст ошибку, в худшем — компиляция произойдет, но при этом вся анимация изменится до неузнаваемости.
Если вы меняете скелет, то нужно создавать новую анимацию. Если ваши текстуры имеют размерность, не кратную двум, то результат также будет плачевным. Внимательно следите за вышеописанными вещами — и все будет нормально.
На этом вводный курс в моделирование завершен. Ждем ваших писем с отзывами и конкретными вопросами, ответы на которые мы напечатаем в игростроевской “Горячей линии”.
Также обратите внимание, что все статьи цикла “Моделлинг Half-Life 2” мы выкладываем на диск в разделе “ ИнфоБлок ”. Если что-то пропустили, то вам туда — прямой наводкой.
В статье описано, как компилировать модели с помощью studiomdl для внутриигрового использования. Прежде чем начать, вам понадобятся какие-нибудь файлы SMD, которые вы и будете компилировать. Если у вас их еще нет, прочтите статью об Экспорте моделей.
Формат QC
Помимо файла в формате SMD с данными о модели, вам понадобится файл формата QC, который - в чем-то похоже на файл материала VMT - описывает как нужно интерпретировать данные из SMD-файла. При подготовке к компиляции вы потратите большую часть времени именно на него.
QC - это просто текстовый файл с расширением .qc . Его можно создать где угодно и назвать как вам нравится. Лучше, однако, хранить свои данные организованно, и держать SMD и QC в одной папке, которую разумно будет назвать так же, как будущий файл модели.
Порядок компиляции
При настройке компиляции важнейшим шагом является выбор правильной переменной VPROJECT. Вот как это можно сделать:
- Глобально, указав свою игру/мод в выпадающем списке SDK launcher'а
- Только для программы studiomdl, запустив ее с параметром -game "<полный путь к директории с вашим gameinfo.txt>"
Что касается работы с QC-файлами для моделей, то вам очень, правда - очень пригодится продвинутый текстовый редактор, который поддерживает выделение синтаксиса цветом и который сможет запускать studiomdl - без ручной работы с командной строкой или bat-файлами. На текущий момент существует два таких редактора:
Скачайте редактор и правила подсветки синтаксиса, настройте исполнение studiomdl - и все, можно приступать к работе!
Сложный способ
Если вы не хотите или не можете использовать ни один из редаторов (перечислены выше), то компилировать QC-файлы придется, перетаскивая и кидая их на studiomdl.exe. Программу можно найти в папке sourcesdk/bin/orangebox/bin/ (если нужно, замените orangebox/ на ep1/).
Легче это будет делать, если для автоматизации создать в каком-нибудь легко доступном месте на компьютере .cmd-файл. Это просто переименнованный txt с каким-нибудь таким текстом:
Киньте на него ваш файл с описанием, как кидали бы на сам исполняемый файл (studiomdl.exe) - по своей сути этот .cmd нечто вроде ярлыка.
QC-команды
Чтобы увидеть полный список документированных QC-команд, посмотрите Category:QC Commands.Вот QC-файл для неанимированного статичного prop'а:
Ниже приведен краткий обзор каждой из команд. Чтобы просмотреть страницы с более подробной информацией, щелкните по именам команд. Here is a brief summary of what each of those commands does. For more detail, click on the names.
$modelname Определеяет имя и местоположение основного файла будущей модели - относительно папки <имя мода>/models/ . При компиляции будет создано еще несколько файлов, и их имя будет образовано от указанного здесь значения. $body Указывает SMD, содержащий информацию о вершинах, UV-развертке, скелете и envelope'ах модели. Это необходимо, чтобы у модели было какое-то представление в движке. Имя ('mybody') дают из-за того, что у модели может быть несколько "тел", как например у метрокопа, у которого их два: одно с manhack'ом на плече, а другое без.
$staticprop Информирует studiomdl о том, что у модели нет движущихся частей; в результате можно осуществить некоторые весьма важные оптимизации. Если вы собираетесь использовать модель с помощью prop_static, то эту команду использовать необходимо, - однако, она не запретит использовать модель где-то еще (на самом деле, большинство моделей на физике тоже используют $staticprop) $surfaceprop Определяет, как поверхность реагирует на другие объекты. Также помогает определить вес модели (когда используется команда для его расчёта). $cdmaterials Директория, из которой studiomdl возьмет материалы для модели. Не забудьте, что имена материалов должны совпадать с теми, которые вы назначили в 3D-пакете при моделировании. Само же имя директории нужно указать относительно папки <директория с модом>/materials/ . $sequence Несмотря на то, что эта модель используется с $staticprop и не анимируется, движку Source для правильной работы потребуется "пустая" idle-анимация. Такая анимация должна состоять из одного кадра, откуда следует, что свойство fps ни на что не будет влиять (но оно все равно будет при проигрывании). $collisionmodel Указывает SMD, который будет использоваться для рассчета столкновений в движке. Если collision-модели нет, то объекты будут пролетать модель насквозь (что в некоторых случаях и является желаемым результатом). $concave Модель для столкновений должна быть выпуклой, но можно создавать и невыпуклые формы комбинируя несколько выпуклых. Команда $concave указывает, что именно это вам и нужно - в противном случае все collision-меши будут обернуты одной выпуклой оболочкой.Приведённый образец описания можно использовать для своей модели (если не нужно анимаций). Так что вставьте имена своих SMD'шек и попробуйте импортировать модель сами.
Compiling more advanced models
- Для компиляции физических моделей используйте тег prop_data
- Для компилчции моделей персонажей используйте Compiling a character model
- Для компиляции viewmodel используйте Compiling a viewmodel
- Для компиляции машин используйте Compiling a vehicle model
- Общая помошь по компилированию Category:QC Commands
Samples
Valve provide numerous sample models in the SDK for you to learn from, including several fully-articulated characters and players. They can be found at:
Зачем и как декомпилировать модели? Как компилировать модели? Как делать коллизию для модели? Всё это Вы узнаете из этой статьи Начнём, пожалуй, с декомпиляции моделей. Для этого есть программа MDL Decompiler, она есть в составе Source SDK. Программа очень проста в применении, вот как она выглядит:
Выбираем модель, указываем путь, куда положить декомпилированные файлы и нажимаем кнопку Extract. Для чего нужна декомпиляция? Также, как с картами - рассмотреть устройство модели, переделать, перенести в 3D Max. Иногда бывает нужно изменить размер модели - например, Вы делаете 3D-скайбокс - Вам нужны уменьшенные в 16 (или в 25, в 24) раз модели. В стандартных моделях можно найти и обычные модели, и модели для 3d-скайбокса, но как быть, если уменьшенных моделей нет? Решить эту проблему просто - декомпилируем модель, изменяем размер и компилируем снова. Только новую модель нужно будет вшить в конечный файл карты.
Декомпилировать, как Вы видите, просто. А для компиляции нужно кое-что знать. В папке, где лежит SMD-файл, нужно создать 2 дополнительных файла - bat-файл (для запуска компиляции) и qc-файл (для настройки). Оба файлы - текстовые. Открываем bat-файл и пишем:
"C:\Ultimate SSDK v3\SourceSDK\bin\orangebox\bin\studiomdl.exe" -fullcollide C:\bridge\bridge.qc
@pause
C:\Ultimate SSDK v3\SourceSDK\bin\orangebox\bin\studiomdl.exe - это путь к компилятору моделей, C:\bridge\bridge.qc - путь к Вашему qc-файлу. Теперь открываем qc-файл и заполняем его так:
$cd "C:\bridge" (Здесь путь к qc-файлу)
$modelname "zet\bridge\bridge.mdl" (Где будет находиться Ваша модель в папке cstrike/models)
$scale 1.0 (Масштаб модели. Вот тут можно изменять размер модели, сделать её меньше для 3d-скайбокса. Если размер модели в Хаммере получился слишком большой/маленький - просто поправьте тут число и откомпилируйте заново)
$body "body" "bridge.smd" (Здесь вводим имя SMD-файла)
$cdmaterials "models/zet/" (Путь к текстуре для модели. В эту папку нужно положить текстуры, которые Вы накладывали на модель в 3D Max'е)
$surfaceprop "metal" (Тип материала, из которого сделана модель)
$sequence idle "idle" fps 30 aCT_iDLE 1 (Тут ничего не трогаем)
$keyvalues < prop_data < "base" "Plastic.Medium" >> (Здесь указываются свойства физической модели, например, из чего она сделана, будет ли взрываться и т.д. Если Вам нужна статическая модель, вместо этой строчки введите просто $staticprop)
$collisionmodel "bridge.smd" (Тут указывается модель коллизии, для простых моделей типа ящика можно указывать тот же SMD-файл, а для моделей посложнее надо создавать дополнительную модель коллизии, об этом ниже)
$mass 200.0
$inertia 1.00
$damping 0.00
$rotdamping 0.00
> (Это физические параметры - инерция, масса и т.д.)
Если модель состоит из нескольких объектов, при указании в параметре $collisionmodel обычного SMD в игре может проявиться неправильная коллизия - например, сквозь решётку или дыры в заборе не будут пролетать пули, модель может оказаться приподнятой над землей и т.д. Тогда для такой модели делается модель коллизии. Открываем модель в 3D Max'е, выделяем всю нашу модель, идём на панель модификаторов, выбираем Edit Poly и выделяем все полигоны, которые будут физическими ограничителями, т.е. иметь модель столкновений - коллизию. Это должны быть все внешние полигоны. Вот у меня такая "модель", окошко в браше:
Выделяем все внешние полигоны, затем назначаем им группу сглаживания 1 (Smooth Group):
Всё, теперь сохраняем эту физическую модель с другим именем и указываем его в параметре $collisionmodel.
И да, чуть не забыл. Если Вы помните статью про созданию текстур - текстуры для моделей делаются точно также с одним изменением в VMT-файле:
Вместо LightmappedGeneric напишите VertexLitGeneric. Тогда текстура на модели будет отображаться нормально, но при этом она не наложится на браш.
Готово, можно начать компиляцию - просто запустите Ваш bat-файл. Если всё сделали правильно, то Ваша новая модель появится среди остальных в Хаммере. Не забудьте вшить файлы модели и текстуры для неё в конечный файл карты. До новых встреч!
Перво наперво вам надо заиметь копию 3Ds MAX, Photoshop (или другой редактор графики) и лиц. копию SSDK.
Если у вас все это есть - приступаем к моделлированию. Запускайте MAX, а я пока подожду.
Запустили? отлично, надеюсь у вас есть базовые навыки работы в максе. Создайте BOX размерами 50х50х50
Тычим по нему правой кнопкой мыши (далее как у нормальных людей ПКМ) и ыбираем Convert to >> Editable Poly
Открываем свойства объекта >> свиток модификаторов и там выбираем Unwarp UVW
наш куб обводится зеленой линией и справа появляются настройки. Там жмем кнопарь "Edit"
Открывается окно. В этом окне снизу жмем кнопочку
Далее сверху Mapping >> Flatten Mapping. Откроется окошко
В нем жмем ок. Получается следующее:
Оставим как есть, в данном случае и так хорошо =)
Сверху жмем Tools >> Render UVW template и в окошке вводим размер будущей текстуры, в этой модели оставим стд - 1024х1024
Тут жмем кнопку Render UV Template.
И в следующем окне жмем чтобы сохранить развертку.
Сохранять можно в любом формате в любой папке.
Сохранив развертку закройте окно редактирования развертки. Теперь откроем Photoshop (или другое схожее с ним приложение)
В нем откроем только что сохраненную развертку. Теперь будем по ней рисовать текстуру. Рисовать сами знаете как, если не знаете - перед вами весь интернет =)
Я сделал такую вот текстуру:
Сделав текстуру натянем ее на нашу коробку.
Для этого откройте Material Editor , выберите свободную ячейку, затем нажмите на квадрат справа от Diffuse и в открывшемся окне выберите bitmap. далее выберите текстру.
У меня получилось следующее:
Теперь займемся технической частью. А именно костямми.
Нажмите на кнопку создания примитивов и в конце на кнопку Systems
Далее на кнопку bones. Создайте одну кость любого размера и поместите ее в центр - для точного перемещения в пространстве нажмите ПКМ на одной из 3х иконок.
1ая - перемещение вверх-вниз
2ая - поворот влево, вправо, вверх, вниз
3я - изменение размера по всем осям и по отдельности
Поместив ее в центр откройте свойства коробки и добавьте к ней модификатор Skin.
Добавьте там кость bone01.
Все, теперь экспортируем модельку в .SMD
Создайте папку в C:\Program Files\Steam\steamapps\sourcemod\ваш мод или там где у вас Steam- \box
Туда и экспортируйте .SMD
Сначала экспортируйте box_ref.smd - это будет сама модель
Потом экспортируйте анимацию длинною в 2 кадра:
И назовите ее box_idle.smd
С моделлингом покончено, теперь будем делать .qc
Создайте блокнотом в папке с экспортированными .smd - файл с именем и расширением box.qc
В этом файле напишем:
$cd "C:\Program Files\Steam\steamapps\sourcemods\motiondrive\box" \\ путь к .qc файлу
$modelname "mymdl/box.mdl" \\ путь и название модели (не забудьте предварительно создать эту \\ папку!
$scale 1.0 \\ размер модели (1.0 - без изменений)
$body "body" "box_ref.smd" \\ название .smd который используется в качестве основы
$cdmaterials "models/box/" \\папка с текстурами
$surfaceprop "wood" \\ то из чего модель состоит
$sequence idle "box_idle" fps 30 ACT_IDLE 1 \\ анимация*
$collisionmodel "box_ref.smd" \\физ. модель для определения движком формы объекта
// Масса в кг
$concave \\ физбокс модели имеет несколько вогнутых мест
$mass 5.0 \\ масса
>
$keyvalues \\ тэги для определения движком что мдлка физическая
"prop_data"
"base" "Wooden.Medium" \\ соответственно из чего модель состоит (служит для определения
\\ движком какие звуки юзать)
>
>
\\ * idle - название анимации, box_idle - .smd с анимацией, fps - кол-во кадров в сек., ACT_IDLE - \\ акт для использования в коде.
Теперь займемся текстурами. Скомпилируйте и настройте текстуры, затем скопируйте их в папку models\box НЕ ИЗМЕНЯЯ ИХ НАЗВАНИЯ.
В настройках текстуры используйте только шейдер VertexLitGeneric, иначе будет эмошность.
Читайте также: