В первую очередь поговорим о декомпиляторе, зачастую это самый первый шаг с которого, нужно начинать создавать модель. Я надеюсь вы уже скачали и распаковали Kratisto's Mdl Decompiler 1.2. Что же собой представляет эта маленькая, но очень толковая программка? Запускается она с команданой строки и нужна для распаковки mdl файлов, работает очень просто, - берём например из папки "...\Counter-Strike 1.6\cstrike\models" файл "v_ak47.mdl"(это стандартная модель ак, вид от первого лица) и копируем в папку с декомпилятором, затем запускаем "decompile_all.bat" и программа автоматом распакует все mdl файлы находящиеся в данной папке и рассортирует их по подпапкам создав при этом один лог для всех файлов, в нашем случае мы видим папку "v_ak47" и лог.
Изучаем папку "v_ak47":
- файлы текстур в формате "bmp";
- "f_ak47_template.smd" собственно модель автомата с привязанными костями;
- "lhand.smd" и "rhand.smd" модель левой и правой руки, также с привязанными костями;
- файлы анимации, внутри их - нет абсолютно никаких моделей: "draw.smd", "idle1.smd", "reload.smd", "shoot1.smd", "shoot2.smd", "shoot3.smd", описывать не буду, - т.к. файлы говорят сами за себя.
- скрипт "v_ak47.qc"(открыть можна любым текстовым редактором, например блокнот) о нём пойдёт речь дальше.
QC-скрипт
Файлы *.qc - можно считать неким паспортом к модели, в нём идёт описание всего что будет находится в конечной модели. Основная задча .qc-файла - говорить компилятору, где искать текстуры и .SMD-файлы. Также скрипт определяет информацию которая относится к игровому движку, как анимаци, звуки и др.
Разберём скрипт на отдельном примере "v_ak47.qc":
/*
==============================================================================
QC script generated by Half-Life MDL Decompiler 1.2
2003, Kratisto. Based on code from Valve's HL SDK.
v_ak47.mdl
Original internal name:
"v_ak47.mdl"
==============================================================================
*/
$modelname "v_ak47.mdl"
$cd ".\"
$cdtexture ".\"
$scale 1.0
$cliptotextures
$bbox 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
$cbox 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
$eyeposition 0.000000 0.000000 0.000000
//reference mesh(es)
$body "rhand" "rhand"
$body "lhand" "lhand"
$body "weapon" "f_ak47_template"
// 2 attachment(s)
$attachment 0 "Bone 04" 2.750000 -22.500000 2.900000
$attachment 1 "Bone52" 0.000000 -3.000000 0.000000
// 4 hit box(es)
$hbox 0 "Bone04" -1.980000 -8.880000 -1.020000 1.730000 0.030000 1.090000
$hbox 0 "Bone_Righthand" -1.340000 -2.980000 -0.410000 1.430000 0.000000 0.630000
$hbox 0 "Bone01" -1.720000 -8.900000 -1.020000 1.990000 0.020000 1.090000
$hbox 0 "Bone_Lefthand" -1.520000 -3.073735 -0.410000 1.250000 0.000000 0.630000
// 6 animation sequence(s)
$sequence "idle1" "idle1" fps 30
$sequence "reload" "reload" fps 37 { event 5004 13 "weapons/ak47_clipout.wav" } { event 5004 57 "weapons/ak47_clipin.wav" }
$sequence "draw" "draw" fps 30 { event 5004 11 "weapons/ak47_boltpull.wav" }
$sequence "shoot1" "shoot1" fps 20 { event 5001 0 "22" }
$sequence "shoot2" "shoot2" fps 20 { event 5001 0 "22" }
$sequence "shoot3" "shoot3" fps 20 { event 5001 0 "22" }
// End of QC script.
Описание команд QC файла==============================================================================
QC script generated by Half-Life MDL Decompiler 1.2
2003, Kratisto. Based on code from Valve's HL SDK.
v_ak47.mdl
Original internal name:
"v_ak47.mdl"
==============================================================================
*/
$modelname "v_ak47.mdl"
$cd ".\"
$cdtexture ".\"
$scale 1.0
$cliptotextures
$bbox 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
$cbox 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
$eyeposition 0.000000 0.000000 0.000000
//reference mesh(es)
$body "rhand" "rhand"
$body "lhand" "lhand"
$body "weapon" "f_ak47_template"
// 2 attachment(s)
$attachment 0 "Bone 04" 2.750000 -22.500000 2.900000
$attachment 1 "Bone52" 0.000000 -3.000000 0.000000
// 4 hit box(es)
$hbox 0 "Bone04" -1.980000 -8.880000 -1.020000 1.730000 0.030000 1.090000
$hbox 0 "Bone_Righthand" -1.340000 -2.980000 -0.410000 1.430000 0.000000 0.630000
$hbox 0 "Bone01" -1.720000 -8.900000 -1.020000 1.990000 0.020000 1.090000
$hbox 0 "Bone_Lefthand" -1.520000 -3.073735 -0.410000 1.250000 0.000000 0.630000
// 6 animation sequence(s)
$sequence "idle1" "idle1" fps 30
$sequence "reload" "reload" fps 37 { event 5004 13 "weapons/ak47_clipout.wav" } { event 5004 57 "weapons/ak47_clipin.wav" }
$sequence "draw" "draw" fps 30 { event 5004 11 "weapons/ak47_boltpull.wav" }
$sequence "shoot1" "shoot1" fps 20 { event 5001 0 "22" }
$sequence "shoot2" "shoot2" fps 20 { event 5001 0 "22" }
$sequence "shoot3" "shoot3" fps 20 { event 5001 0 "22" }
// End of QC script.
$modelname "v_ak47.mdl" - имя исходного файла который создаст компилятор
$cd ".\" - папка где находятся файлы моделей и анимации
$cdtexture ".\" - папка с текстурами
$scale 1.0 - коэффициент масштабирования модели
$cliptotextures - при наличии в скрипте, будет говорить компилятору не обрезать неиспользуемые участки текстур, при отсутствии - компилятор автоматом обрежет неиспользуемые участки текстур
$externaltextures - дополнительная команда, создаст файл ak47T.mdl и запишет в него текстуры
$body "rhand" "rhand" - модель правой руки, в первых скобках название, во-вторых имя исходного файла без smd
$body "lhand" "lhand" - см. выше
$body "weapon" "f_ak47_template" см. выше
Примечание: командой $body нужно перечислить все отдельные файлы моделей smd.
$attachment 0 "Bone 04" 2.750000 -22.500000 2.900000 - определяет место возникновения событий(появление моделей, спрайтов), далее расшифровка:
$attachment <ID#> <bone> <X> <Y> <Z>:
<ID#> - уникальный идентификатор, максимум 4, тоесть <0> | <1> | <2> | <3>
<bone> - имя кости
<X> <Y> <Z> - определяет положение события по осям XYZ относительно прикрепленной кости, например возьмём следующие координаты <0><5><5> следовательно, координаты нашей кости будут <0><0><0> и событие будет отображаться со-сдвигом по оси-x - неизменно, оси-y - на 5 юнитов, оси-z - также 5 юнитов.
Далее следуют хит-боксы, определяется командой $hbox, создает хит боксы вокруг костей, зачастую используется для коллизии, например - попадание пуль. Если чесно я незнаю каким макаром к модели от первого лица относится хитбоксы)), ну да ладно, если стандартные модели их содержат, мы тоже будем их делать. Кстати делаются они автоматом, при компиляции, об этом чуть позже.<ID#> - уникальный идентификатор, максимум 4, тоесть <0> | <1> | <2> | <3>
<bone> - имя кости
<X> <Y> <Z> - определяет положение события по осям XYZ относительно прикрепленной кости, например возьмём следующие координаты <0><5><5> следовательно, координаты нашей кости будут <0><0><0> и событие будет отображаться со-сдвигом по оси-x - неизменно, оси-y - на 5 юнитов, оси-z - также 5 юнитов.
С анимацией немного посложнее.
Работает она за следующим принципом: минимум который нужен для нормального экспорта
$sequence "[имя анимации]" "[путь к файлу без smd]" [количество fps в анимации] см.ниже
$sequence "idle1" "idle1" fps 30
Как видите, всё просто, мы могли применить эту схему к любой анимации "reload", "draw", "shoot", но, есть одно НО)), мы же хотим увидеть спрайты выстрела и услышать звуки, для этого подключим события и звуки в нужную анимацию.$sequence "idle1" "idle1" fps 30
$sequence "reload" "reload" fps 37 { event 5004 13 "weapons/ak47_clipout.wav" } { event 5004 57 "weapons/ak47_clipin.wav" }
Расшифровка: "имя: reload" "имя файла: reload" {событие 5004 на 13 кадре возпроизвести звук из файла "weapons/ak47_clipout.wav"} {событие 5004 на 57 кадре возпроизвести звук из файла "weapons/ak47_clipin.wav"}
Примечание: событие 5004 отвечает за воспроизведение звука из файла
Дальше больше. Выстрелы:Расшифровка: "имя: reload" "имя файла: reload" {событие 5004 на 13 кадре возпроизвести звук из файла "weapons/ak47_clipout.wav"} {событие 5004 на 57 кадре возпроизвести звук из файла "weapons/ak47_clipin.wav"}
Примечание: событие 5004 отвечает за воспроизведение звука из файла
Дефолтная модель предлагает нам следующее решение:
$sequence "shoot1" "shoot1" fps 20 { event 5001 0 "22" }
Как видите абсолютно никакой логики)) - это на заметку программерам "Вентиля"
Как сказал однажды Петросян (с) "Мы пойдём своим путём!", и сделаем читабельное и понятное описание событий, поехали:Как видите абсолютно никакой логики)) - это на заметку программерам "Вентиля"
$sequence "shoot1" "shoot1" fps 20 { event 5004 0 "weapons/ak47-1.wav" } { event 5001 0 "muzzleflash3.spr" }
Примечание: событие 5001 отвечает за появление спрайта на точке $attachment 0(см. выше)
Примечание: можете использовать способ который вам по душе, я же описал оба, работают как часы.
Примечание: событие 5001 отвечает за появление спрайта на точке $attachment 0(см. выше)
Примечание: можете использовать способ который вам по душе, я же описал оба, работают как часы.
Ну наконец, - скрипт закончился. Далее компиляция:
Итак вы уже запаслись софтом GUI StudioMDL 1.0 и открыли его. Интерфейс простейший - проблем возникнуть не должно. Идём в File -> Load QC File открываем уже созданый нами скрипт "v_ak47.qc", если видите следующий меседж
[Opening QC file - C:\Documents and Settings\Admin\Рабочий стол\decompiler\v_ak47\v_ak47.qc]
[QC loaded O.K!]
значит всё прошло гладко - здесь всё как на мед-комиссии годен, негоден третьего - нету)), ставим галку на "Dump Hitboxes"(автоматом пропишутся хитбоксы $hbox) и в заключении жмём кнопку "Compile", проверяем исходную папку и находим новосозданный "v_ak47.mdl", бросаем в папку с cs и играем.
Советы:
- во-избежание любых проблем с правильным экспортом - используйте такую же разметку как и в дефолтных скриптах;
- используйте комментарии для описания тех или иных действий в скрипте:
Многострочный
/*
here is your comment
here is your comment
here is your comment
*/
Однострочныйhere is your comment
here is your comment
here is your comment
*/
// here is your comment
- постарайтесь не использовать в комментариях кириллицу;- всегда думайте головой, если последнее не помогло пишите будем разбираться.
На этом урок закончен, большое спасибо, ждите продолжения.