Старая форма входа

С чего начать. Часть 4 - компиляция, декомпиляция mdl, qc-скрипт.

   Сегодня я расскажу о чисто-технических моментах, которые не относятся к моделированию. Мы поговорим о компиляции, декомпиляции mdl файлов, а также о скрипте QC под движок Half-Life для мода Counter-Strike 1.6. Эта информация очень важна, т.к. данных в особенности о скрипте - в сети очень мало, на самом деле, я и сам до конца не знаю весь QC-скрипт, но о самых важных командах - без которых не возможен экспорт, а также про маленькие нюансы - пойдёт речь в этой статье.

   В первую очередь поговорим о декомпиляторе, зачастую это самый первый шаг с которого, нужно начинать создавать модель. Я надеюсь вы уже скачали и распаковали 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 файла
$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, создает хит боксы вокруг костей, зачастую используется для коллизии, например - попадание пуль. Если чесно я незнаю каким макаром к модели от первого лица относится хитбоксы)), ну да ладно, если стандартные модели их содержат, мы тоже будем их делать. Кстати делаются они автоматом, при компиляции, об этом чуть позже.

   С анимацией немного посложнее.
Работает она за следующим принципом: минимум который нужен для нормального экспорта
$sequence "[имя анимации]" "[путь к файлу без smd]" [количество fps в анимации] см.ниже
$sequence "idle1" "idle1" fps 30
   Как видите, всё просто, мы могли применить эту схему к любой анимации "reload", "draw", "shoot", но, есть одно НО)), мы же хотим увидеть спрайты выстрела и услышать звуки, для этого подключим события и звуки в нужную анимацию.
$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 отвечает за воспроизведение звука из файла
   Дальше больше. Выстрелы:
Дефолтная модель предлагает нам следующее решение:
$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(см. выше)
Примечание: можете использовать способ который вам по душе, я же описал оба, работают как часы.

   Ну наконец, - скрипт закончился. Далее компиляция:
Итак вы уже запаслись софтом 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
- постарайтесь не использовать в комментариях кириллицу;
- всегда думайте головой, если последнее не помогло пишите будем разбираться.
   На этом урок закончен, большое спасибо, ждите продолжения.
Всего комментариев: 34 | Комментариев на странице: 1-30
0  
Как посчетать т.н. "vertex count" модели?
0  
На объекте нажми п.к.миши - "Object properties" там вверху будет
0  
Блин, почему не может декомпильнут игроков? Какая причина? Там просто два файла ukk_JB.mdl и ukk_JBT.mdl с 4 submodel'ами, что не так????
0  
Marauder, это наверное не в модели дело, а в карте, так как там используются (обьясню по самому простому) специальные невидимы блоки поверх поставленной туда модели, чтобы сквозь неё не проходить ... это дело карты, а не модели, поэтому тут выхода нет dntknw
0  
Marauder
люди скажите если я танк декомпилирую, как сделать чтобы сквозь него в контре нельзя пройти было???
0  
Семерка максимальная, полет нормальный...
Вот только модели персонажей не компилируются. Даже без изменений. Декомпиляция => Компиляция - еррор =(
Все вроде идет, а в конце пишет: "кракозябры" нот фаунд. хотя ничего не менялось...
В чем трабл?)
0  
При компиляции любого файла(p_, v_, w_)
Прога делает пару строк а затем "ошибка".
Со совместимостью норм всё, (у меня семерка)
0  
Загружаю в компилятор QC.

Жму "Compile" и дальше выдаёт ошибку и пишет:

[Performing Sanity Check]
QC file loaded...PASS
Can read QC...FAIL!

что это значит?
0  
та же хрень если компилирую не из милки
0  
разобрался, работает на xp а на семёрке не идёт)ну да ладно БЫ если бы не unknown attachment link to bone 52(((((((
0  
Хотя когда открываю qc файл всё как на последнем скрине.
0  
При любом раскладе(изменять, не изменять что-либо) пишет Sanity check failed!Reason: could not find the qc file.
0  
ПОМОГИТЕ ПЛИЗЗЗ!!!!!!
одеваю на стандартную модель кепку и при компеляции мне пишет вот это-
illegal parent bone replacement in sequence "dummy"
"Bip01 L Hand" has "Bip01 L Forearm", reference has "Bip01 L Arm2"
illegal parent bone replacement in sequence "dummy"
"Bip01 R Hand" has "Bip01 R Forearm", reference has "Bip01 R Arm2"
illegal parent bone replacement in sequence "dummy"
"Bip01 L Foot" has "Bip01 L Calf", reference has "Bip01 L Leg1"
illegal parent bone replacement in sequence "dummy"
"Bip01 R Foot" has "Bip01 R Calf", reference has "Bip01 R Leg1"
illegal parent bone replacement in sequence "idle1"
"Bip01 L Hand" has "Bip01 L Forearm", reference has "Bip01 L Arm2"
illegal parent bone replacement in sequence "idle1"
"Bip01 R Hand" has "Bip01 R Forearm", reference has "Bip01 R Arm2"
illegal parent bone replacement in sequence "idle1"
"Bip01 L Foot" has "Bip01 L Calf", reference has "Bip01 L Leg1"
illegal parent bone replacement in sequence "idle1"
"Bip01 R Foot" has "Bip01 R Calf", reference has "Bip01 R Leg1"
illegal parent bone replacement in sequence "crouch_idle"
"Bip01 L Hand" has "Bip01 L Forearm", reference has "Bip01 L Arm2"
illegal parent bone replacement in sequence "crouch_idle"
"Bip01 R Hand" has "Bip01 R Forearm", reference has "Bip01 R Arm2"
illegal parent bone replacement in sequence "crouch_idle"
"Bip01 L Foot" has "Bip01 L Calf", reference has "Bip01 L Leg1"
illegal parent bone replacement in sequence "crouch_idle"
"Bip01 R Foot" has "Bip01 R Calf", reference has "Bip01 R Leg1"
illegal parent bone replacement in sequence "walk"
"Bip01 L Hand" has "Bip01 L Forearm", reference has "Bip01 L Arm2"
illegal parent bone replacement in sequence "walk"
"Bip01 R Hand" has "Bip01 R Forearm", reference has "Bip01 R Arm2"
illegal parent bone replacement in sequence "walk"
"Bip01 L Foot" has "Bip01 L Calf", reference has "Bip01 L Leg1"
illegal parent bone replacement in sequence "walk"
"Bip01 R Foot" has "Bip01 R Calf", reference has "Bip01 R Leg1"
illegal parent bone replacement in sequence "run"
"Bip01 L Hand" has "Bip01 L Forearm", reference has "Bip01 L Arm2"
illegal parent bone replacement in sequence "run"
"Bip01 R Hand" has "Bip01 R Forearm", reference has "Bip01 R Arm2"
illegal parent bone replacement in sequence "run"
"Bip01 L Foot" has "Bip01 L Calf", reference has "Bip01 L Leg1"
illegal parent bone replacement in sequence "run"
"Bip01 R Foot" has "Bip01 R Calf", reference has "Bip01 R Leg1"
illegal parent bone replacement in sequence "crouchrun"
"Bip01 L Hand" has "Bip01 L Forearm", reference has "Bip01 L Arm2"
illegal parent bone replacement in sequence "crouchrun"
"Bip01 R Hand" has "Bip01 R Forearm", reference has "Bip01 R Arm2"
illegal parent bone replacement in sequence "crouchrun"
"Bip01 L Foot" has "Bip01 L Calf", reference has "Bip
Что мне делать?????
0  
тоже бесит данная проблема(((
0  
unknown attachment link 'Bone52'
как это можно исправить?
0  
при импорте модели, убрать галочку напротив "rename bones" .. если идет конверт с CSS derisive
+1  
SPY, поробуй удалить переменную $texrendermode
+1  
Адимин подскажи почему при компиляции ошибку выдает

grabbing .\/hands.smd
lowest vector at 46.969254
grabbing .\/bullet.smd
lowest vector at 58.645718
grabbing .\/Cobralense.smd
lowest vector at 61.577034
************ ERROR ************
bad command $texrendermode

+1  
Друзья, при декомпиляции файла *.mdl, выдает ошибку.... в исходную папку добавляются только лог (абсолютно пустой) и папка с *.qc файлом (никаких bmp и *.smd в папке нет) Пробовал скачать "Mdl Decompiler" с разных ресурсов и запускал из под разных ОС (XP и Saven), но результат тот-же... ошибка приложения. Кто сталкивался, помогите решить проблему.
0  
Друзья, при декомпиляции файла *.mdl, выдает ошибку.... в исходную папку добавляются только лог (абсолютно пустой) и папка с *.qc файлом (никаких bmp и *.smd в папке нет) Пробовал скачать "Mdl Decompiler" с разных ресурсов и запускал из под разных ОС (XP и Saven), но результат тот-же... ошибка приложения. Кто сталкивался, помогите решить проблему.
0  
REDEMAX, абсолютно верно
0  
еееееее я так понял ето надо блокнотом прописывать команды qc файла чтоб упаковать так вить??? blush2
0  
не стоит читать на сон грядущий ту матч!
0  
У Меня GUI StudioMDL не создаёт файл .mdl , но при компиляции ошибок не выдаёт.... Что делать????
0  
попробовал все ровно тоже самое выдаёт. Я сначала распаковал mdl файл, потом через MilkShape 3D 1.8.5 засунул модель в 3d max, изменил ее немного и опять же через MilkShape 3D экспортировал в обратно в smd и сохранил, щас пытаюсь через GUI StudioMDL засунуть все smd в один mdl и прога выдает эту ошибку. А я не понял в этом qc-файле нужно что изменять или как?
0  
ZIKKO, попробуй переместить все файлы например в папку D:\mods\m4a1_reference.smd - и её открыть.
0  
люди у меня studiomdl выдает ошибку ************ ERROR ************
C:\Users\Алиев\Desktop\Новая папка/m4a1_reference.smd.smd doesn't exist, что тут можно поделать?
0  
Алексей, попробуй через Ms3d, там без активации даже можно декомпилить jester
0  
Чего тогда мне делать?!
0  
а на win 7 Kratisto's Mdl Decompiler 1.2 не работает!
+1  
да вообше сайт весь супер
0  
единственную верную информацию о qc-срипте нашел сдесь
большое спасибо джокеру
0  
статейка зачот, выложил знания, юмор biggrin . все сдалал по инструкции - работает yes yes yes yes yes yes yes автор красава, жги ещё
Имя *:
Код *: