Source Filmmaker

Source Filmmaker

162 ratings
QC файл. Описание основных параметров.
By MARK2580
Постараюсь описать самые основные параметры *.QC файла для компиляции модели под Source Engine.
2
   
Award
Favorite
Favorited
Unfavorite
Что такое QC файл.
QC файл, это своеобразный конфиг. файл. На деле это обычный txt содержащий команды начинающиеся со знака $, на пример $model.
Так-же там может быть туча всяких сверх непонятных параметров, вроде дополнительных аттач точек, контроллеров глаз, контроллеров flex анимации и много чего прочего.

Для редактирования QC файла может подойти хоть штатный блокнот из винды, но я бы предложил использовать что-то более продвинутое вроде AkelPad или Notepad++.

Для Notepad++ есть фанатский файл, добавляющий подсветку синтаксиса для VDF языка (qc / vmt / vta / vdf / fgd / vbsp и др.)
Скачать / установить - https://developer.valvesoftware.com/wiki/Notepadpp_VDF_languages

Пример базового QC файла
$modelname "mymodels\testmodel.mdl" $model "studio" "testmodel_reference.smd" $cdmaterials "models\mymodels\testmodel\" $surfaceprop "metal" $sequence idle "testmodel_idle.smd" act_idle fps 30.00 $collisionmodel "testmodel_col.smd" { $concave $mass 100.0 }
$modelname
$modelname "mark2580/testmodels/test.mdl"
Параметр, который должен присутствовать в любом QC файле и желательно в самой первой строке.
Он определяет имя и путь до модели. По умолчанию если просто написать например test.mdl то модель скомпилируется в корень папки models игры (мода) .../hl2/models/

Т.е. папку models не надо указывать, если надо в корень то пишем имя модели.mdl и всё.
Если надо путь то пишем например
mymodels/folder1/folder2/test.mdl
$model
$model "studio" "testmodel_reference.smd"

Параметр, указывающий какой SMD исходник использовать для компиляции модели. Таких параметров может быть более одного... Лимита не знаю, но как минимум 10 запросто.

"studio" - здесь можно указать любое название которое вздумается, это может быть только английский текст, без пробелов. Например "moyamodel1" или "moyamodel_testref"
По сути эта часть ни на что не влияет, её суть проявляется в параметре боди-группы, но о них немного позже.

"testmodel_reference.smd" - здесь указывается имя SMD файла. Файл должен находится в этой же папке, что и сам QC файл. Если не хочется разводить с.рач, то можно создать подпапку, положить файл туда и уже написать например так
$model "studio" "papka2/testmodel_reference.smd"

Каждый $model пишем с новой строки !
$cdmaterials
$cdmaterials "models\testmodel\textures\"

Параметр, отвечающий за поиск моделью текстур, которые используются на ней.
Здесь указываются пути до папок, в которых будет производится поиск.
Как в случае с $modelname, папку hl2/materials не надо указывать, по умолчанию если просто стоят "" или "/" поиск будет производиться только в hl2/materials (ну или вашмод/materials)

Советую складировать текстуры ДЛЯ МОДЕЛЕЙ в папки после materials/models, чтобы не было проблем например с Hammer Editor, он не может использовать шейдер для моделей и такие текстуры находящиеся не в models будут засорять браузер текстур. Да и вам удобней будет искать в materials/models/....

Параметров $cdmaterials может быть так-же много, каждый пишем с новой строки.
Поиск производится ТОЛЬКО в указанных папках, в следующих подпапках модель уже ничего не увидит.
Переадресацию можно будет сделать только прописав другой путь в самом VMT файле.
$staticprop
$staticprop

Мулипусенький параметр, отвечающий за то, будет ли модель статичной, т.е. просто какой-то проп на карте или эта модель сможет быть динамической, т.е. её можно будет крепить к чему-то, её можно передвигать, менять скины, запускать анимации.
Динамическая модель находится всегда в памяти игры и грузит вычислительные мощьности. По этому всякое окружение надо делать с параметром $staticprop
Никаких дополнительных приписок он не требует.

Если этого параметра нет - модель автоматически считается динамической, т.е. prop_dynamic

В случае, если модель компилируется для SFM, а не для карто-строения можно вообще игнорировать этот параметр.
$surfaceprop
$surfaceprop "glass"

Параметр, отвечающий за "свойства" материала, из которого сделана модель.
К сожалению Source поддерживает только одно свойство на всю модель, по этому бывает, что некоторые модели состоят из нескольких отдельных MDL файлов, чтобы например стекло в машине было стеклом, а сама машина железной.

Список поддерживаемых "материалов" можно узнать тут - https://developer.valvesoftware.com/wiki/Surfaceprop

Для физических моделей вроде ящика, бочки... всего, что можно переместить, оттолкнуть выстрелом, откинуть монтировкой.... нужен ещё один парметр, о нём ниже. (см. $keyvalues)

Для SFM возможно этот параметр даже и не нужен, там "нету физики". Пожалуй этот параметр и колизия модели пригодится если надо будет например стрелять по этой модели.
$sequence
$sequence idle "testmodel_reference.smd" act_idle 1 fps 30.00

Параметр, указывающий подключение анимации к модели. Любая модель даже статик проп, должна содержать IDLE анимацию.
IDLE анимация, это просто состояние костей в модели так сказать в стандартном её состоянии / положении.

Сверх подробно о этом параметре я рассказывать не буду, да и сам не очень то шарю.
Расскажу самое основное.

"idle" - название анимации, по идее не больно то и на что влияет
"testmodel_reference.smd" - smd исходник, для моделей у которой не должно быть анимаций, или это даже статик, можно просто указать саму модель, из неё возьмутся только кости и их координаты + анимация если она там есть.
"act_idle" - вроде как указывает, что это анимация по умолчанию, анимация простоя... всегда так писал для всех моделей, будь они статик, динамик или даже рэгдолл.
Данные части используются для так скажем кодовых имён анимаций, чтобы сам код движка обращался к модели используя эти анимации.
"1" - честно говоря загадочная цифра, я так и не понял, что она означает. Чаще всего в случае с и idle тут стоит 1... и вот как бы так ¯\_(ツ)_/¯ без 1 не скомпилится.
"fps 30.00" - скорость анимации. По умолчанию 30 это норма, можно искусственно замедлить или ускорить уже готовую анимацию, всего лишь изменяя это число.
$collisionmodel
$collisionmodel "testmodel_col.smd" { $concave $mass 100.0 }
Параметр, отвечающий за колизию (модель столкновений) модели.
Т.е. это модель, по которой мы бьём монтировкой, в которую попадают пули и прочее, на её основе на основную модель уже наносятся в нужных местах декали повреждений.

"testmodel_col.smd" - smd исходник. Модель колизии должна состоять из минимального кол-ва мешей, они обязательно должны быть замкнутыми (вроде куба) и иметь на ВСЮ модель только 1 группу сглаживания. Так-же на модели должна быть ЛЮБАЯ текстура, это не на что не влияет, главное чтобы был какой-то ID на модели.

"$concave" - указывает, что модель столкновений должна быть ну скажем "фигурной" чтоли...
Т.е. представьте, берём какой-то предмет, обтягиваем его плёнкой и получается что-то бесформенное, так будет выглядеть колизия, если не указать этот параметр.
"$mass 100.0" - вес модели в килограммах. По Wiki это "типа" килограммы, но на деле в игре 100/200 игрок поднимает как пушинку. Для основательных моделей советую прописывать вес от 300 и более.
"$maxconvexpieces 99" - позволяет превысить лимит "блоков" из которых состоит модель колизии. Советую это делать только в крайних случаях. 99 - макс количество блоков.

Есть ещё несколько параметров, но они не слишком важны. О них можно прочитать на WIKI - https://developer.valvesoftware.com/wiki/$collisionmodel

В случае с SFM модели не нужна колизия вообще. Вы можете не указывать этот параметр.
Но на всякий случай, можно опять же указать саму модель, сгенерируется ужасная модель колизии, будет много матов от компилятора, но меньше вопросов от движка.
* Доп-ные и не обязательные *
Ниже будут перечисляться дополнительные и не обязательные параметры, без которых компиляция модели пройдёт вполне успешно.
$lod
$lod - параметр позволяющий прописывать лоды модели. Первым прописывается оригинальный меш в модели который будет заменяться на расстоянии, далее указывается меш на который будет заменяться. Цифра после $lod обозначает размер модели на экране, я сам не очень хорошо понял это значение. Дело в том, что оно зависит от разрешения с которым запущена сейчас игра. Рекомендуют просто открывать модель в hlmv и прописывать примерные значения оттуда (из вкладки модель).

Цитата из wiki: Defines when the LOD takes effect. Its value is (100 / screen pixels per unit), which means that distance at which the transition happens depends on the size of the user's monitor and their FOV, not simply the model's distance from the camera. Someone with a truly massive screen may never see an LOD!
The threshold formula makes it difficult to determine what values to use, however. The best way of working things out is to load your model into HLMV, switch to the Model tab, enable Auto LOD, and use RMB to zoom in and out.

Пример
$lod 12 { replacemodel "testmodel.smd" "testmodel_lod1.smd" } $lod 18 { replacemodel "testmodel.smd" "testmodel_lod2.smd" } $lod 42 { replacemodel "testmodel.smd" "testmodel_lod3.smd" }
$texturegroup
$texturegroup "skinfamilies" { // это 1й скин модели (по умолчанию) его ID 0 { "textura_1.vmt" "skin_1.vmt" } // это 2й скин модели его ID 1 { "textura_2.vmt" "skin_2.vmt" } // далее будут 3,4,5 итд. }

Параметр, отвечающий за скины модели. Т.е. смену какой-то текстуры на другую.
Первая и последняя фигурные скобки содержат блоки информации о скинах.
Во внутренних фигурных скобках содержатся сами имена текстур.

Логику построения блока скинов, лимиты и прочее можете почитать в моём гайде про рекомпил моделей.
https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=268248487
В категории "Прописываем новые скины"
$bodygroup
$BodyGroup "bg1" { studio "testmodel_ref_bg_1.smd" }

Параметр отвечающий за боди-группы модели. Боди группы, это такие дополнительные части модели, которые можно скрывать или показывать.

"bg1" - название группы
studio "testmodel_ref_bg_1.smd" - smd исходник модели группы, модель обязательно должна содержать такие-же кости как и сама основная модель !

Таких блоков может быть много (лимит не знаю, но более 20 точно). Каждый блок начинается с $bodygroup и содержит в фигурных скобках модель, путь до неё можно указывать как рассказывалось выше.
Каждая боди-группа может состоять только из 1 модели.
$scale
$scale 1.0

Параметр отвечающий за размер модели.
Если вам лень переделывать модель, можно добавить этот параметр и насильно увеличить или уменьшить модель во время компиляции.

1.0 - это стандартный размер модели (по умолчанию). Если не надо производить никаких манипуляций с размером, то этот параметр вообще не нужен.

Т.е. если вы укажите например 0.5, то модель скомпилится в размере в 50% от её исходника, если укажите например 2.0 то модель будет больше в 2 раза.

ВНИМАНИЕ: ни в коем случае не используйте данный параметр для моделей, в которых используется flex технология, т.е. лицевая анимация. Все координаты flex останутся на родных местах и при движении например рта, будет двигаться шея или чего ещё хуже. (не актуально для DMX, для формата DMX флексы не ломаются)

Так-же этот параметр обязательно надо указывать перед всеми $model и $bodygroup т.е. сразу после $modelname
$mostlyopaque / $opaque
$mostlyopaque $opaque

Параметры отвечающие за фикс проблем с отображением прозрачности на моделях.
Для компиляции указывается ТОЛЬКО ОДИН из них. Так сказать по вкусу и по результату.
Чаще всего нужен именно $mostlyopaque.
Подробнее читаем в моём гайде
https://steamhost.cn/steamcommunity_com/sharedfiles/filedetails/?id=847899281
Раздел "Прописываем параметры в QC (для модели)."
$attachment
$attachment "mouth" "head" -1.80 4.00 0.00 rotate 0 90 90

Параметр, отвечающий за установку аттачмента на модели.
Аттачмент расчитывается от координат одной из костей модели.

"mouth" - имя аттачмента
"head" - имя кости, к которой крепится аттачмент
Далее идут координаты, за счёт них можно немного сдвинуть сам аттачмент относительно кости по осям XYZ и по углам (rotate 0 90 90)
$keyvalues
Свойство для физического пропа, разбиваться на мелкие деревяшки
$keyvalues { prop_data { base Wooden.Small } }

Продвинутая версия с пояснениями
$KeyValues { prop_data // свойства объекта { "base" "Metal.Large" // тип стоковых осколков "dmg.bullets" "1.0" // повреждение от пуль "dmg.club" "30.0" // повреждение от падения, удара "dmg.explosive" "0.0" // повреждение от взрывов "health" "20" // здоровье модели, 0 не получает урона "explosive_damage" "75" // урон от взрыва "explosive_radius" "250" // радиус взрыва "allowstatic" "1" // модель может быть физ и статичной } physgun_interactions // взаимодействие с гравипушкой / игроком / физикой { "onbreak" "explode" //что случиться если объект сломается "onfirstimpact" "break" //первое повреждение } fire_interactions // возгорание объекта { "flammable" "yes" //что случиться если объект загорится "ignite" "halfhealth" //загорится если здоровье снизится до 50% } break // модель разламывается на кастомные обломки { "model" "props/gibs/gibsmodel/gib01.mdl" // модель "health" "1" // здоровье модели "fadetime" "30" // время, за которое исчезнет "offset" "-2 4 1" // спавн обломка со смещением от центра изначальной модели.
Иначе все обломки вывалятся фонтаном из центра.
} }
Параметр, в котором указывается множество дополнительных свойств модели.
Список проп-дат можно найти здесь - https://developer.valvesoftware.com/wiki/Prop_data_base_types

Остальные KeyValues можно найти здесь - https://developer.valvesoftware.com/wiki/$keyvalues
QCI файл
Иногда хочется не засорять основной файл какими-то длинными параметрами, например списком анимаций или скинов. Для этого придуман файл QCI.

По сути это тот-же самый QC но он используется как добавочный.
В основном QC в нужном месте пишется
$include "ainmations/ainmation_list.qci"
Компилятор видит эту ссылку и подхватывает всё что там написано, туда можно перенести любые параметры. Путь прописывается аналогично smd или dmx файлу.

Основной QC
$modelname "mymodels\testmodel.mdl" $model "studio" "testmodel_reference.smd" $cdmaterials "models\mymodels\testmodel\" $surfaceprop "metal" $sequence idle "testmodel_idle.smd" act_idle fps 30.00 $collisionmodel "testmodel_col.smd" { $concave $mass 100.0 } $include "skins.qci"

Подключаемый QCI (skins.qci)
$texturegroup "skinfamilies" { {"textura_1.vmt"} {"textura_2.vmt"} }

Что видит компилятор
$modelname "mymodels\testmodel.mdl" $model "studio" "testmodel_reference.smd" $cdmaterials "models\mymodels\testmodel\" $surfaceprop "metal" $sequence idle "testmodel_idle.smd" act_idle fps 30.00 $collisionmodel "testmodel_col.smd" { $concave $mass 100.0 } $texturegroup "skinfamilies" { {"textura_1.vmt"} {"textura_2.vmt"} }
* ДРУГИЕ ПАРАМЕТРЫ *
Ещё один русский гайд по QC параметрам на НашаWiki[enc.nashalife.ru]

Гайд будет дополняться. Пишите о интересующих вас параметрах. Если я знаю о них, то попытаюсь описать.
94 Comments
megab1t 28 Oct, 2024 @ 8:16am 
спасибо:GDEasy:
megab1t 28 Oct, 2024 @ 6:26am 
А как можно добавить флексы на свою модель? Например чтобы персонаж улыбался,закрывал глаза и т. д
MARK2580  [author] 30 May, 2024 @ 10:27pm 
прописывай корректные параметры осей, будет "колбаситься" пока всё верно не будет
Engineer_ZY 30 May, 2024 @ 9:48pm 
Не знаю корректно ли тут спрашивать, но как можно пофиксить то, что регдолл просто колбасится сам в себе, а так же его лёгкий вес
Engineer_ZY 30 May, 2024 @ 4:19pm 
А что с этим сделать можно? я например пробовал всю модель повернуть пару раз, это был не вариант. Просто повернуть root кость? Модель не сломается?
MARK2580  [author] 30 May, 2024 @ 4:18pm 
возможно какая-то root кость изначально повёрнута, она тащит за собой всё остальное, поворачивая модель
Engineer_ZY 30 May, 2024 @ 4:16pm 
Ну я делаю регдолл, он у меня какого-то хрена повернут на бок, и поэтому (я делаю вообще на самом деле нпс) когда я делаю нпс, из-за этого поворота он смотрит не туда и ходит боком
MARK2580  [author] 30 May, 2024 @ 4:15pm 
https://developer.valvesoftware.com/wiki/$origin
но там может много чего сломаться
Engineer_ZY 30 May, 2024 @ 9:16am 
Можно ли как нибудь регдолл повернуть при компиляции на 90 градусов?