Главная
Новости
Статьи
Ссылки
Гостевая книга
Форум
Почта:
Прочее
Общая информация
Предыстория
Оружие
Кадры из игры
Концепт-арт
Скачать
Инструменты
Авторы проекта
Глоссарий объектов
Юмор в картинках




Статьи

Системное программирование на QC ;)


Создаём свои QC файлы сценариев для компиляции трёхмерных игровых моделей mdl-формата

Серов Станислав (yxo)   11.11.2012
Это дополненная версия статьи от 2004 года из Russian Half-Life Modelling Center.

.qc сценарий — это простой текстовый файл или несколько файлов, созданных в любом простейшем текстовом редакторе и необходимых для того, чтобы cкомпилировать трёхмерную модель для игровых движков. Обычно для моделей достаточно собрать в одну папку все smd и bmp файлы, сам компилятор studiomdl, написать сценарий компиляции — qc-файл и запустить из командной строки:
studiomdl.exe НазваниеСценария.qc
и модель готова. Хотя для компилятора существуют дополнительные настройки для командной строки и даже создан графический интерфейс для управления ими, обычно запуска в командной строке достаточно. А сейчас рассмотрим команды сценариев компиляции главным образом для движка GoldSource, но и в более современных движках используется большинство перечисленных параметров и команд создания моделей.

Короче говоря, в статье собран список общих команд для компилятора studiomdl с параметрами, описанием и примерами. Начнём с основных:

$modelname <путь>
Эта команда сообщает studiomdl, как назвать и где поместить откомпилированную модель.
Пример для модели Gordon.mdl:
$modelname "C:\Half-Life\valve\models\player\Gordon.mdl"
Пример, указывающий только название модели и потому сохраняющий в текущую папку:
$modelname "shlang.mdl"



$cd <путь>
Эта команда указывает компилятору studiomdl текущую рабочую папку. Команда работает так же, как и в DOS'e команда "cd".
пример относительного пути в ту же папку, где находится и сам .qc файл:
$cd ".\"
пример абсолютного пути:
$cd "C:\Half-Life\valve\models\source\Gordon"



$cdtexture <путь>
Эта команда сообщает компилятору studiomdl, где расположены текстуры.
Пример абсолютного пути:
$cdtexture "C:\Half-Life\valve\models\source\Gordon\textures"
Пример относительного пути из текущей папки в подпапку textures:
$cdtexture ".\textures"



$externaltextures
Эта команда сообщает studiomdl, что нужно сохранять текстуры модели как отдельный *t.mdl файл. (Здесь под звёздочкой автоматически подставляется название модели, используемое в основном файле модели *.mdl). В руководстве "Modeling and Animating for Half-Life" рассказывают, что команда $externaltextures нужна тем моделям, которые часто вызываются движком, но не отображаются на экране, для них хранение текстур отдельно от сетки приведёт к ускорению отрисовки графики.
Пример:
$externaltextures
Также разработчики задумали эту команду для удобства замены текстур в некоторых моделях заменой выделенного файла *t.mdl, не трогая объёмные данные. Короче, сейчас эта возможность используется не часто.



$cliptotextures
Эта команда сообщает studiomdl компилировать ли текстуры с моделью. Она обычно используется с моделями игрока для дезматча.
пример:
$cliptotextures



$scale #
Масштаб модели больше или меньше. По умолчанию всегда равно 1.
пример, увеличивающий её в 1,2 раза:
$scale 1.2



$origin
Это смещения начала координат модели. Этот параметр нужен для точной настройки модели, если вы к примеру модель сделали выше 0 по координате Z, то вам надо обязательно указать насколько выше вы её поместили. В противном случае модель будет неправильно показыватся на экране. Внимание: после декомпиляции модели оружия из CS движения рук съезжают нафих совсем не туда куда нужно, а с помощью этой команды можно вернуть модель рук обратно не редактируя анимации.
пример коррекции по оси Z:
$origin 0 0 36



$eyeposition
Для ботов или монстров в одиночной игре нужно, чтобы сообщить игре, где глаза монстра находятся относительно начала координат модели. К примеру, из-за ошибочно низкого положения глаз он может не увидеть что-либо из-за приземистого блока, хотя модель выглядит выше блока раза в 4, а тут можно вправить ему зрение.
пример высоты глаз на уровне 65 единиц над землёй (грубо это на высоте 1,6 метра, если считать, что 40 ед. в 1 м):
$eyeposition 0 0 65



$bbox (мин по x) (мин по y) (мин по z) (макс по x) (макс по y) (макс по z)
Задаёт параллелепипед габаритов отображения сориентированный вдоль осей X, Y и Z. Он даёт знать графическому движку о протяжённости модели. Полезно задавать для крупных моделей, которые без него могут не отрисовываться, когда выглядывают из-за казалось бы некрупных препятствий. Часто этот параллелепипед отцентрирован по длине и ширине, когда (мин по x) = –(макс по x) и (мин по y) = –(макс по y). Также задаём полную высоту в (макс по z) при том, что низ на уровне пола, поэтому задаём (мин по z) = 0. На сайте valvesoftware.com пишут, что его также называют каркасом (англ. hull, но не clipping hull, т.е. это не то же самое, что и каркас границ столкновений).
Пример габаритов дерева высотой примерно 6 метров:
$bbox -48 -48 0 48 48 240



$cbox (мин по x) (мин по y) (мин по z) (макс по x) (макс по y) (макс по z)
Задаёт параллелепипед габаритов столкновений.
NB. Надо будет проверить, в его ли габариты упираешься в игре, когда модель вставляешь в игровую карту с помощью объекта cycler?
Пример объекта размером с человека:
$cbox -16 -16 0 16 16 72



$body <имя smd файла> [reverse]
Вторая по важности команда в сценарии. Это ссылка на .smd файл главной сеточной оболочки модели; базовая модель с текстурами. Известно, что в подавляющем большинстве игр тыльные стороны граней не прорисовываются для экономии ресурсов. Команда reverse обменивает лицевые и тыльные стороны граней и используется только в случае (!), если возникают проблемы при экспортировании из редакторов типа Blender или 3D MAX, когда нормали поверхностей шиворот навыворот, а модель ошибочно получается текстурами внутрь.
Пример:
$body studio "monster" reverse



$bodygroup <имя группы> {smd группы}
Команда позволяет вашей модели иметь взаимозаменяемые части. Для модели с N заменяемых частей у многих объектов monster... в редакторах карт можно задать параметр body, в значении которого указать номер части от 0 до N–1. Этот пример показывает, как сделать монстра, который может держать дробовик, винтовку MP5 или ничего. Не включайте .smd расширение.
Пример:
$bodygroup weapons
{
studio "shotgun"
studio "mp5"
blank
}



$texturegroup <имя группы> {bmp группы}
Команда позволяет вашей модели иметь взаимозаменяемые текстуры. Этот пример показывает, как нормальные текстуры головы и тела могут быть заменены в игре кровавыми текстурами. Убедитесь, что включили .bmp расширение.
Пример предполагает, что на сеточной модели изначально есть текстуры body_normal.bmp и head_normal.bmp:
$texturegroup pain
{
{ "body_normal.bmp" "head_normal.bmp" }
{ "body_pain.bmp" "head_pain.bmp" }
}



$renamebone <старое имя кости> <новое имя кости>
Character Studio версии 2.x и старше использует другое названия для некоторых костей двуногого животного. Если вы смешиваете модели или мультипликации от более ранних версий, тогда они должны быть переименованы. Этой командой можно легко переименовать кости во время компиляции, вместо того чтобы переименовать их в каждом исходном .max файле.
пример:
$renamebone "Bip01 R Clavicle" "Bip01 R Arm"



$include <дополнительный файл сценария .qc>
Чтобы включать в компиляцию другой .qc файл.
Пример:
$include "C:\Half-Life\valve\models\player\player_shared.qc"



$attachment <#> <кость>
Задаёт определённую точку в пространстве, которая присоединяется к заданной скелетной вершине. Её задают для того, чтобы из её места воспроизводить различные эффекты, например такие, как отрисовка огня, спрайтов, искрение и т. д. Координаты задают удаление точки от скелетной вершины.
Пример:
$attachment 0 "Bip01 R Hand" 20 2 5



$controller <#> <кость> <ось вращения> <предел вращения в градусах>
Эта команда позволяет игре управлять вращением осей модели, т.е. костей. Наиболее очевидный пример — вращение головы монстра, в примере 1. Команда позволяет игре вращать голову от -60 градусов до +60 по оси X. Пример 2 показывает как сделать контроллер рта, чтобы монстр мог говорить.
пример 1:
$controller 0 "Bip01 Head" XR -60 60
пример 2:
$controller mouth "Bone03" ZR 0 45



$hbox <группа #> <кость>
Команда задаёт для костей модели hitbox'ы или по-понятному — габаритные параллелепипеды попаданий. Если звучит всё ещё сложновато, объясню подробно: в игровом движке GoldSource параллелепипеды попаданий отвечают за места получения урона моделью. Если они не заданы, то компилятор создаст их автоматически, но если вам нужно их редактировать, то легче не создавать хитбоксы заново, а сперва декомпилировать модель, исправить габариты в файле qc-сценария и снова её скомпилировать. Получившиеся хитбоксы вам покажут просмотрщики моделей типа Jed's Half-Life Model Viewer или Half-Life Model Viewer 1.25 или даже в самой игре Half-Life, Counter-Strike или др. с помощью консольной команды r_drawentities 3 (отключить её действие можно командой r_drawentities 1).
Эта пара примеров показывает создание хитбоксов для ноги, если название костей (правой) ноги в модели Bip01 R Leg1 и Bip01 R Foot.
Пример:
$hbox 7 "Bip01 R Leg1" 0.31 -3.97 -2.84 17.60 3.94 2.97
$hbox 7 "Bip01 R Foot" -0.56 -2.34 -2.19 3.81 8.00 2.66

Примечание: действие команды r_drawentities 0 в консоли скроет все энтити, а её работа со значениями 1, 2 и 3 на иллюстрации:


$gamma <дробное значение # коэффициента контрастности>
Задаёт коэффициент контрастности отображения текстур модели (иначе говоря, коэффициент γ). По умолчанию этот коэффициент задаётся равным 1,8.
Пример, повышающий контрастность текстур модели до 3,2:
$gamma 3.2
А это пример влияния коэффициента контрастности на отображение модели гнома для значений 5, 3 и 1,8:

пример влияния команды $gamma на модель гнома



$sequencegroupsize <# в Кб>
Это отделяет файлы скелетных анимаций от сеточной модели в меньшие файлы. Нужно для того, чтобы анимации загружались в память только когда необходимо, вместо того чтобы загружать их все. Это полезно для монстров с заданным сценарием анимаций. Правда современные компьютеры редко тяготятся подобными мелочами, так что можно не пользоваться, если только Вы не оптимизируете игру для мобильников.
Пример разбивания по 64 Кб:
$sequencegroupsize 64



$sequence <имя файла> "smd" [motion extraction] [fps <#>] [blend ] [origin ] [scale <#>] [loop] [frame ] ['activity' 'multiplier'] {event <#> }
Команда задаёт компилятору файл типа .smd с движением.

Подробнее о параметрах команды $sequence

[motion extraction] Этот параметр указывает оси по которым будет происходить перемешение модели при воспроизведении анимации. Наиболее общие параметры: X, Y, LX или LY, которые обозначают движения по x и y оси. LX и LY — для линейного движения. X и Y работают также как LX и LY. Это используется в движке GoldSource и в частности в игре Half-Life для того, чтобы перемещать монстра.


[fps <#>] Устанавливает скорость проигрывания кадров анимации в секунду ("frames per second" как раз и значит число "кадров в секунду").
пример: fps 15


[blend ]
Вы можете перечислить два .smd файла мультипликации и смешивать их вместе. Часто используется для комбинирования анимаций стрельбы монстра вниз, когда тот палит с возвышенности, и стрельбы вверх, когда тот стреляет по летящим целям. С помощью смешивания автоматически получается промежуточный вариант движения для стрельбы прямо. Этот пример смешивает движение от -45 до +45 градусов по оси X. Параметр не полностью изучен, но вы можете найти его в моделях солдат и поэкспериментировать.
пример: blend XR -45 45


[origin ]
То же самое что и $origin но только применяется к данной анимации.
пример: origin 0 0 13


[scale <#>]
то же самое что и $scale но только применяется к данному движению.
пример: scale 1.3


[loop]
указывает, что анимация зациклена, т.е. будет проигрываться бесконечно до вызова следующего движения.
пример: loop


[frame ]
Это ограничивает воспроизведение кадров движения.
пример: frame 5 10


['activity' 'multiplier']
Если у вас несколько движений к примеру выстрела из одного и того же оружия, то данная команда укажет игре, что данное движение воспроизводить нужно в 3 раза чаще, чем остальные.
пример:
ACT_RANGE_ATTACK2 3
подразумевается, что движение ACT_RANGE_ATTACK2 уже задано в программном коде объекта.


['rotate'] Поворачивает движение на заданный угол
Пример, поворачивающий задаваемое движение на четверть оборота:
rotate -90


{event <#> <кадр> <текстовые параметры>} События, которые может вызывать данная анимация. Параметр изменяет не очень много, но весьма полезен для создания различных эффектов. Пятитысячные события, т.е. которые начинаются с пятёрки — 5ХХХ обрабатываются клиентом игрового движка и потому важны для оформления модели в игре. События с 0ХХХ по 4ХХХ работают с сервером движка и обрабатывают более глобальные задачи вроде взаимодействий с командой или смены статуса объекта.
Важно то, что событиями 5ХХХ можно вызывать: воспроизведение звука, отображение спрайта в определённой точке, выброс искр или проделать ещё что-нибудь, если заранее запрограмировать то, что вам нужно.

Пример 1:
{ event 5004 1 "weapons\shoot.wav" }
Случай 5004 — воспроизведение звука, начиная с 1 кадра. Впишите путь, начинающийся с папки вашего мода. Новички тут встретятся с небольшой заморочкой, которая описана после этого примера.

Пример 2:
{ event 5001 1 "20" }
События 5001, 5011 и 5021 — для спрайтов, особенно огня и дыма из оружия. Этот пример запускает спрайт от штурмовой винтовки MP5, muzzleflash1.spr с системой координат в 1 кадре. "20" указывает, что спрайту # 0 масштаб будет увеличен в 2 раза. Ниже — перечень спрайтов с порядковыми номерами и описанием для чего они используются:

50A1: muzzleflash1.spr — MP5
51A1: muzzleflash2.spr — дробовик, пистолеты
52A1: muzzleflash3.spr — дротикомёт алиенгранта или "клешня"

Для спрайтов должна быть определена точка крепления, номер которой определяет предпоследняя цифра A. Случай 5001 делает так, чтобы начало координат спрайта было в $attachment 0, начало координат 5011-ых спрайтов — в $attachment 1 и начало координат 5021-ых — в $attachment 2 (и так можно назначать вплоть до 9 аттачмента).

Пример 3:
{ event 5002 10 "5" }
Случай 5002 — для искр. Здесь это проигрывается относительно системы координат 10 и их размер увеличивается в 5 раз.

Пример 4:
{ event 7 2 }
Это просто запускает случай # 7 к системе координат 2. Случаем 7 может быть всё что угодно, но оно должно быть задано в программном коде ИСКУССТВЕННОГО ИНТЕЛЛЕКТА монстра.

Пример 5:
{ event 1003 20 "bigexplosion" }
Случай 1003 запускает некий механизм в карте под названием "bigexplosion" по отношению к системе координат 20.



И вот примеры команды $sequence:

Первый пример:
$sequence crouch_shoot_mp5 "crouch_shoot_mp5"
Очень простая команда содержащая в себе минимум, необходимый для того чтобы она работала. Crouch_shoot_mp5 — название анимации и "crouch_shoot_mp5" — файл анимации без .smd расширения.

Второй пример:
$sequence shoot "shoot" { { event 5001 1 "20" } { event 5004 1 "hks1.wav" } }
Этот пример использует такие события, чтобы показать работу спрайтов и звук стрельбы из оружия. Предполагается, что звук hks1.wav загружается игровым движком в заранее запрограммированном коде объекта (т.е. монстра, персонажа, устройства), в противном случае на картах, где используется эта модель нужно будет загружать звуковой файл через какой-нибудь объект, который позволяет загрузить произвольный звук, например, в Half-Life и CS обычно используют ambient_generic.

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

Вот и всё что можно было сказать о содержании qc, далее опубликована пара примеров qc файлов с описанием каждой команды.

Пример самого простого файла:

// название будущей модели
$modelname "proba.mdl"

// файлы объёмной сетки и анимаций берутся из текущей папки
$cd ".\"

// файлы текстур берутся из текущей папки
$cdtexture ".\"

// векторная модель из файла proba_ref.smd
$body body "proba_ref"

// 1 однократная мультипликация (7 кадров/с) из файла idle1.smd
$sequence "idle1" "idle" fps 7



Пример для модели из игры Opposing-Force:
// название модели полного охранника из игры Opposing Force
$modelname "otis.mdl"
// путь к файлам модели
$cd ".\"
// путь к текстурам модели
$cdtexture ".\"
// масштаб 1:1
$scale 1.0


// координаты параллелепипеда отображения (полному человеку - большие габариты)
$bbox -17 -17 0 17 17 72
// координаты параллелепипеда столкновений
$cbox -16 -16 0 16 16 72

// высота глаз, как у всех человекоподобных
$eyeposition 0.000000 0.000000 63.000000

// файл модели otis_body_reference.smd
$body studio "otis_body_reference"

// группа подмоделей оружия
$bodygroup gun
{
// По умолчанию пистолет в кобуре берётся из файла сетки otis_reference_wgunnholster.smd
studio "otis_reference_wgunnholster"
// пистолет в руках
studio "otis_reference_wgun"
// в правой руке пончик
studio "otis_donut_reference"
}

// группа подмоделей голов
$bodygroup heads
{
// по умолчанию голова из файла otis_head_bald_wht2_reference.smd
studio "otis_head_bald_wht2_reference"
studio "otis_head_bald_wht_reference"
}

// 1 аттачмент на месте ствола, где рисуется спрайт огня
$attachment 0 "Bip01 R Hand" 12.000000 3.000000 4.500000

// 2 контроллера: может поворачиваться шея
$controller 0 "Bip01 Head" XR -60.000000 60.000000
// и открывается рот во время разговора
$controller mouth "Bone05" ZR 0.000000 45.000000

// 21 хитбокс, т.е. параллелепипед, воспинимающий повреждения
$hbox 3 "Bip01 Pelvis" -9.890000 -5.660000 -8.600000 2.940000 6.520000 6.790000
$hbox 6 "Bip01 L Leg" 0.000000 -5.920000 -4.000000 19.370001 3.780000 3.730000
// остальные не будем показывать, т.к. они автоматически будут созданы и так


// некоторые движения:
// повторяющееся движение холостого стояния с вызовом активности простоя ACT_IDLE (задано в коде) с параметром 50:
$sequence "idle1" "idle1" fps 15 loop ACT_IDLE 50
// движение холостого стояния 15 кадров/с с вызовом активности простоя ACT_IDLE (задано в коде) с параметром 1:
$sequence "idle2" "idle2" fps 15 ACT_IDLE 1
...
// повторяющееся движение ходьбы с поступательным сдвигом по X (LX) с вызовом активности ACT_WALK (также задано в коде) с параметром 1 и звуками шагов npc_step1.wav во время 3 кадра и npc_step3.wav во время 18 кадра:
$sequence "walk" "walk" LX fps 30 loop ACT_WALK 1 {event 1004 3 "common/npc_step1.wav" } {event 1004 18 "common/npc_step3.wav" }
// повторяющееся движение бега со сдвигом по X с вызовом активности простоя ACT_RUN (задано в коде) с параметром 1 и звуками шагов npc_step2.wav во время 5 и npc_step4.wav во время 13 кадра:
$sequence "run" "run" LX fps 25 loop ACT_RUN 1 {event 1004 5 "common/npc_step2.wav" } {event 1004 13 "common/npc_step4.wav" }
// движение стрельбы с вызовом активности дистанционной атаки ACT_RANGE_ATTACK1 (задано в коде) с параметром 1 и вспышкой на нулевом аттачменте спрайта muzzleflash1.spr, увеличенным в 21 раз, во время 2 кадра + событием 3 (задано в коде, вероятно звук хлопка и выброс гильзы) во время того же 2 кадра. Ещё важно отметить слияние двух движений из shootgun_blend1.smd, когда Отис стреляет под углом 50° вниз, и shootgun_blend2.smd когда стреляет под углом 50° вверх относительно горизонтального положения, их движок игры будет комбинировать в зависимости от положения цели:
$sequence "shootgun" "shootgun_blend1" "shootgun_blend2" blend XR -50 50 fps 25 ACT_RANGE_ATTACK1 1 {event 5001 2 "21" } {event 3 2 }
...
// поворот налево с вызовом активности левого поворота ACT_TURN_LEFT (задано в коде) с параметром 1 :
$sequence "turnleft" "turnleft" fps 15 ACT_TURN_LEFT 1
// поворот направо с вызовом активности правого поворота ACT_TURN_RIGHT с параметром 1 :
$sequence "turnright" "turnright" fps 15 ACT_TURN_RIGHT 1
...
// движение 22 кадра/с, когда Отис машет рукой кому-нибудь:
$sequence "barn_wave" "barn_wave" fps 22
...


Программное обеспечение

  • studiomdl [192 Кб] — компилятор MDL моделей (см. в середине той страницы), работающий из командной строки. Поддерживает дополнительные возможности моделей, реализованные в игре Day of Defeat (DoD): альфапрозрачность (точки на текстуре, окрашенные заданным цветом абсолютно прозрачны) и аддитивная прозрачность (сложение цветов текущей точки грани и того, что находится за ней).
  • mdldec версии 1.2 [138 Кб] — декомпилятор MDL моделей, работающий из командной строки (см. в середине той страницы).
  • GUI StodioMDL версии 2.2/Source от 2007 г. [140 Кб] — графический интерфейс из одного окна с настройками для запуска компилятора studiomdl для движков Source (в том числе Episode 1 из Half-Life 2) и GoldSource. Для Windows 2000, XP, Vista.
  • GUI StodioMDL версии 1 [141 Кб] — графический однооконный интерфейс с настройками для запуска компилятора studiomdl для движка GoldSource. Для 32-х битных Windows 9x, ME, 2000, XP, Vista.
  • Генератор qc сценариев версии 1.0.1 [1,35 Мб] — русскоязычный генератор qc-сценариев на основе большинства рассмотренных в статье настроек. Для Windows 9x – 7.


Благодарности

Спасибо человеку под псевдонимом Spider за описание команд компиляции на английском и разработчикам из компаний id Software и Valve за движок игры Half-Life и инструментарий.







Half-life Red Alert Expantion
Presented by HLRA team
All rights reserved
  Counter.CO.KZ -     !
Hosted by uCoz