Створюємо свої qc файли сценаріїв для компіляції моделей

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


Створюємо свої QC файли сценаріїв для компіляції тривимірних ігрових моделей mdl-формату

Коротше кажучи, в статті зібрано список загальних команд для компілятора 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

$ texturegroup
Команда дозволяє вашої моделі мати взаємозамінні текстури. Цей приклад показує, як нормальні текстури голови і тіла можуть бути замінені в грі кривавими текстурами. Переконайтеся, що включили .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 файл.
приклад:
$ 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

Примітка: дія команди r_drawentities 0 в консолі приховає всі ентіті, а її робота зі значеннями 1, 2 і 3 на ілюстрації:

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

$ sequencegroupsize
Це відокремлює файли скелетних анімацій від гратчастої моделі в менші файли. Потрібно для того, щоб анімації завантажувалися в пам'ять тільки коли необхідно, замість того щоб завантажувати їх все. Це корисно для монстрів з заданим сценарієм анімацій. Правда сучасні комп'ютери рідко обтяжене подібними дрібницями, так що можна не користуватися, якщо тільки ви не оптимізуєте гру для мобільників.
Приклад розбивання по 64 Кб:
$ Sequencegroupsize 64

$ Sequence "smd" [motion extraction] [fps] [blend] [origin] [scale] [loop] [frame] [ 'activity' 'multiplier']
Команда задає компілятору файл типу .smd з рухом.


[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


Події, які може викликати дана анімація. Параметр змінює не дуже багато, але вельми корисний для створення різних ефектів. П'ятитисячні події, тобто які починаються з п'ятірки - 5ххх обробляються клієнтом ігрового движка і тому важливі для оформлення моделі в грі. Події з 0ХХХ по 4ХХХ працюють з сервером движка і обробляють більш глобальні завдання на зразок взаємодій з командою або зміни статусу об'єкта.
Важливим є те, що подіями 5ххх можна викликати: відтворення звуку, відображення спрайту в певній точці, викид іскор або виконати ще що-небудь, якщо заздалегідь запрограмувати те, що вам потрібно.

Приклад 1:

Випадок 5004 - відтворення звуку, починаючи з 1 кадру. Впишіть шлях, що починається з папки вашого мода. Новачки тут зустрінуться з невеликою заморочки, яка описана після цього прикладу.

Приклад 2:

Події 5001, 5011 і 5021 - для спрайтів, особливо вогню і диму з зброї. Цей приклад запускає спрайт від штурмової гвинтівки MP5, muzzleflash1.spr з системою координат в 1 кадрі. "20" вказує, що спрайту # 0 масштаб буде збільшений в 2 рази. Нижче - перелік спрайтів з порядковими номерами і описом для чого вони використовуються:

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

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

Приклад 3:

Випадок 5002 - для іскор. Тут це програється щодо системи координат 10 і їх розмір збільшується в 5 разів.

Приклад 4:

Це просто запускає випадок # 7 до системи координат 2. Випадково 7 може бути все що завгодно, але воно повинно бути задано в програмному коді ШТУЧНОГО ІНТЕЛЕКТУ монстра.

Приклад 5:

Випадок 1003 запускає певний механізм в карті під назвою "bigexplosion" по відношенню до системи координат 20.

І ось приклади команди $ sequence:

Перший приклад:
$ Sequence crouch_shoot_mp5 "crouch_shoot_mp5"
Дуже проста команда містить в собі мінімум, необхідний для того щоб вона працювала. Crouch_shoot_mp5 - назва анімації і "crouch_shoot_mp5" - файл анімації без .smd розширення.

Другий приклад:
$ Sequence shoot "shoot" <>
Цей приклад використовує такі події, щоб показати роботу спрайтів і звук стрілянини зі зброї. Передбачається, що звук hks1.wav завантажується ігровим движком в заздалегідь запрограмованому коді об'єкта (тобто монстра, персонажа, пристрої), в іншому випадку на картах, де використовується ця модель потрібно буде завантажувати звуковий файл через який-небудь об'єкт, який дозволяє завантажити довільний звук, наприклад, в Half-Life і CS зазвичай використовують ambient_generic.

Приклад найпростішого файлу:

// назву майбутньої моделі
$ 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


// деякі рухи:
// повторюється рух холостого стояння з викликом активності простою 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
// повторюється рух бігу зі зрушенням по X з викликом активності простою ACT_RUN (задано в коді) з параметром 1 і звуками кроків npc_step2.wav під час 5 і npc_step4.wav під час 13 кадру:
$ Sequence "run" "run" LX fps 25 loop ACT_RUN 1
// рух стрільби з викликом активності дистанційній атаки 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
.
// поворот наліво з викликом активності лівого повороту 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
.

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

<<Назад в раздел "Статьи"

Схожі статті