pxstudiomdl
Данный компилятор моделей является наследником компилятора Paranoia 2 Savior studiomdl
, но включает в себя новые функции для работы с моделями, имеет расширенные лимиты, и ряд исправленных багов. Рассчитан для использования с Xash3D и PrimeXT, но также он совместим с GoldSrc. Скачать компилятор можно в составе билда PrimeXT, файл находится по пути primext/devkit
.
Функционал
- Поддержка тайлинга текстур на моделях (только для PrimeXT/Xash3D)
- Поддержка фейкового тайлинга текстур для GoldSrc (до четырёх повторений текстуры)
- Поддержка полноцветных текстур в форматах TGA, BMP, PNG, DDS
- Компилятор сгенерирует прозрачность для встроенных текстур, если входные текстуры имеют альфа-канал
- Поддержка развесовки костей (bone weighting)
- Поддержка процедурной анимации костей (jiggle bones)
- Расширенные лимиты на кол-во вертексов в модели и в SMD-файле
- Отсутствующие текстуры автоматически подменяются текстурой-заглушкой
- Возможность компиляции SMD-файлов напрямую, без ручного создания QC-файла (если модель без анимаций)
Описание команд QC
Важно отметить, что ни одна из команд не должна быть написана с заглавной буквы, так как это приведёт к ошибкам компиляции.
$modelname <название>.mdl
- Установка имени для модели$cd <путь>
- Указание компилятору, где искать исходники модели. Используйте$cd ".\"
для указания пути к текущей папке. Для абсолютного пути используйте следующий пример:$cd "C:\Users\Admin\Desktop\model_sources"
$texrendermode <имя текстуры> <режим рендеринга>
- Установка рендермода для указанной текстуры. Доступные режимы рендеринга:- additive
- masked
- masked_solid
- fullbright
- smooth
- nosmooth
- alpha2coverage
- noalpha2coverage
Если вам нужны два режима рендеринга на одной и той же текстуре, вы должны сделать отдельную запись, так как вы не можете поместить masked
и additive
в одну и ту же строку.
$texrendermode body.bmp masked
$texrendermode body.bmp additive
$gamma <значение>
- Изменение гаммы во всех ваших файлах текстур. Начальный номер по умолчанию — 1,8. Для более темного увеличьте число, а для более яркого уменьшите число$origin <x> <y> <z>
- Cмещение начала координат модели. Этот параметр нужен для точной настройки модели.$eyeposition <x> <y> <z>
- Для монстров в одиночной игре, указывает где глаза монстра находятся относительно начала координат модели$cdtexture ".\"
- Указать путь к текстурам, если они не в папке с моделью$cliptotextures
- Отключает уменьшение размера текстур до границ UV-карты. Может помочь избавиться от швов на текстурах. Отключение этого флага позволяет использовать фейковый тайлинг текстур для GoldSrc.$fixedcoords
- Включает текстурные координаты с плавающей точкой (без тайлинга). Только для Xash3D.$freecords
или$freecoords
- Включает текстурные координаты с плавающей точкой (с тайлингом). Только для Xash3D.$boneweights
- Учитывать развесовку для модели. При использовании этой команды помните, что декомпиляция может быть невозможна, сохраняйте исходники модели. Доступно только в Xash3D.$scale <величина масштаба>
- Масштаб модели, по умолчанию всегда равно 1$scale_x, $scale_y, $scale_z
- Масштабирование модели по отдельным осям. Использовать с осторожностью.$body <имя меша> <имя SMD-файла>
- Добавляет меш в модель. Пример:$body "head" "barney"
$bodygroup <имя группы>
- Это позволяет вашей модели иметь взаимозаменяемые части, для генерации разных частей в модели.$flags <номер флагов>
- Добавляет к модели специальный эффект или другую модификацию, возможные флаги перечислены в таблице ниже. Для того, чтобы добавить несколько флагов, нужно сложить в калькуляторе их номера и результат прописать как номер флага.
Номер флага | Описание |
---|---|
1 | След от ракеты Quake1 + динамический свет. След частиц от оранжевого до серого. Создает след только тогда, когда модель находится в движении (не анимация). Динамический свет не остановится, пока эта модель не будет удалена из игры, поэтому используйте его только для таких вещей, как снаряды оружия. |
2 | Дымовой след от гранаты Quake1. Это создает след только тогда, когда модель находится в движении (не анимация) |
4 | Кровавый след Quake1 Gib. Это создает след только тогда, когда модель находится в движении (не анимация) |
16 | Непрерывно стреляет зелеными частицами из стороны в сторону наружу, пока модель не будет удалена из игры. |
32 | Кровь зомби |
64 | Режущий эффект Quake 1 Death Knight. Как эффект слюны Скрэга, но с оранжевыми и желтыми частицами. |
128 | Расплывающийся фиолетовый след |
256 | Уменьшает тени на модели примерно на 50%. Хорошо подходит для летающих моделей или моделей которые выигрывают от менее резких теней, таких как модели в мультяшном стиле. |
512 | Заставляет модель использовать хитбоксы для коллизии, вместо стандартного bounding box |
1024 | Постоянно освещает модель непосредственно из энтити light, независимо от того, где он находится на карте. |
$texturegroup
- Команда позволяет вашей модели иметь взаимозаменяемые текстуры. Это используется для таких вещей, как смена текстуры одежды. Форматирование заключается в том, что в каждой строке помещаются все исходные текстуры, а затем во второй или более строке помещаются замещающие текстуры.
Пример:
$texturegroup arm
{
{ "newarm.bmp" "handback.bmp" "helmet.bmp" }
{ "newarm(dark).bmp" "handback(dark).bmp" "helmet(dark).bmp" }
}
$renamebone <старое имя> <новое имя>
- Команда для переименования любых костей вашего скелета. Используется в основном для исправления несоответствий имен скелетов между другими SMD-файлами. Пример:$renamebone "Bip01 R Calf" "Bip01 R Leg1"
$attachment <номер аттачмента> <название кости> <X> <Y> <Z>
- Задаёт определённую точку, которая присоединяется к заданной кости, а затем её можно использовать для воспроизведения различных эффектов, или для получения координат этой точки из кода игры. КоординатыX,Y,Z
задают удаление точки от кости. Пример:$attachment 0 "bip01 R hand" 25 0 5
$hbox <номер хитгруппы> <название кости> <X> <Y> <Z> <X2> <Y2> <Z2>
- По умолчанию компилятор проверяет, есть ли у вас строка $hbox, и если её нет, то он автоматически создает хитбоксы на каждой кости, используя привязанную к ней скиннинговую сетку в качестве приблизительного размера. Когда вы используете эту команду, она создаст хитбоксы только на тех костях с объявленными строками $hbox. $hbox также используется для редактирования размера и групп урона хитбоксов.
У пользователей программы Blender, которые создают свои кости с нуля, а не импортируют, могут возникнуть проблемы с автоматической генерацией хитбокса из-за другого координатного направления кости
Первая и вторая координаты XYZ — это противоположные углы хитбокса, которые находятся в локальн ом пространстве костей. Чтобы получить координаты хитбокса для начальной точки для редактирования, вы можете указать компилятору сбросить их в текстовый файл с помощью команды -h, например: pxstudiomdl.exe -h mymodel.qc >hitboxes.txt
Хитбоксы разделены на несколько разных групп (автоматически хитбоксы всегда начинаются с группы 0). Группы будут определять разные теги действий в анимации c помощью актов, а так же использовать множитель урона (это поведение можно изменить в коде игры).
Так же вы можете создать свои акты, путем редактирования кода.
Номер группы хитбоксов | Описание группы | Специальные анимации |
---|---|---|
0 | Общий | ACT_FLINCH_HEAD |
1 | Голова | - |
2 | Грудь | - |
3 | Живот | ACT_DIE_GUTSHOT |
4 | Левая рука | ACT_FLINCH_LEFTARM |
5 | Правая рука | ACT_FLINCH_RIGHTARM |
6 | Левая нога | ACT_FLINCH_LEFTLEG |
7 | Правая нога | ACT_FLINCH_RIGHTLEG |
$controller <ID#> "<bone name>" <controller axis> <axis limit 1> <axis limit 2>
- Контроллер используется для изменения вращения или движения кости. Это обычно используется для вращения головы или туловища у NPC, пушки у вертолета, или для анимации рта, которая управляется звуком из привязанной к модели энтити (lip sync). ID — уникальный идентификатор контроллера.
Существует два типа осей: вращательная и линейная, например, вращательная — XR, YR и ZR , а линейная — X, Y, Z. Важно отметить, что кости контроллера наследуют свою локальную ось от родительской кости , поэтому, если ваш контроллер не вращается так, как вы хотите, вам, возможно, придётся создать перед ним родительскую кость с другой ориентацией. Оси контроллера определяют диапазон движения.
Пример: $controller 0 "Bip01 Head" XR -60 60
$sequence "<название анимации>" "<назва ние SMD-файла с анимацией>" <ключевые слова>
- Добавляет анимацию для модели, все ключевые слова разделяются пробелом. Таблица всех ключевых слов находится ниже.
Ключевое слово | Описание |
---|---|
fps <число> | Устанавливает скорость проигрывания кадров анимации в секунду после имени анимации |
loop | Указывает, что анимация должна быть зациклена |
event { <номер ивента> <аргумент 1> <аргумент 2> } | Указывает, какой ивент будет вызван при запуске анимации. Полный список актов, ивентов и их аргументов можно посмотреть в другой статье, или в коде игры. |
rotate <число> | Угол поворота анимации |
Пример: | |
$sequence "die" "die" fps 24 ACT_DIE_HEADSHOT { event 1000 1 } - Проигрывается анимация смерти игрока от выстрела в голову, вызывая ивент, который убивает персонажа на 1 кадре. |
$root <имя кости>
- Указывает, какая кость используется в качестве «корневой» кости, если имеется несколько корневых костей без родительских.$keepfreebones
- Отключает автоматическое удаление костей, к которым не прикреплена какая-либо геометрия. Может быть полезно для наложения разных моделей на общие анимации.$collapsebones
- Удаляет кости к которым не привязана геометрия$collapseboneaggressive
- Принудительно удаляет кости, к которым не привязана геометрия (более строгий режим)
Команда $jigglebone
Для этой команды выделен отдельный раздел, поскольку её описание довольно масштабное. При применении этой команды для кости, игровой движок будет динамически моделировать её физику во время игры, что позволяет создавать реалистичные вторичные движения, такие как раскачивание антенн, упругая плоть, висячие уши, брелки, флаги, плащи и т.д.
Периодические колебания симулируются путём задания значений жёсткости (stiffness) и демпфирования (damping). Жесткость: при низком значении, таком как 10, колебания будут очень размашистые и медленные, тогда как значение 500 породит очень быстрые колебания, но с малой амплитудой. Допустимые значения находятся в диапазоне от 1 до 1000.
Демпфирование – это своего рода величина сопротивления периодическому колебанию. Нулевое значение означает, что колебания не будут затухать. Демпфирование, равное 10, приводит к тому, что колебания будут затухать почти сразу. Допустимые значения находятся в диапазоне от 0 до 10.
Гравитация процедурных костей - это не глобальная гравитация, которая влияет на физические объекты, а локальная, и действует по направлению оси +Y (+Z в зависимости от редактора модели) кости.
Данная команда использует следующий синтаксис:
$jigglebone <имя кости> {
<группа свойств> {
<свойство> <значение> [<значение>]
…
}
}
Для этой команды существует несколько групп свойств, все они перечислены ниже.
Перечисленные ниже группы свойств можно комбинировать вместе, за некоторым исключением: is_rigid
и is_flexible
не могут использоваться вместе. Аналогично, has_base_spring
и is_boing
также нельзя использовать вместе.
Группа свойств is_rigid
На конец кости помещается симулируемая масса, и кость ведёт себя как жесткая палка. Этот вид порождает только вращательное движение с центром вращения в основании кости.
Описание свойств
Название свойства | Описание свойства |
---|---|
length | Расстояние от основания (в юнитах) до массы «наконечника». Маленькие значения приводят к медленному покачиванию. Большие значения приводят к более тонким движениям |
tip_mass | Насколько на «наконечник» действует гравитация. Значение 0 отключает эффекты гравитации, тогда как 1000 будет большой массой |
Пример использования
$jigglebone "Floppy" {
is_rigid {
tip_mass 100
length 20
angle_constraint 60
}
}
Группа свойств is_flexible
На конец кости помещается симулируемая масса, и кость ведёт себя как упругий и гибкий стержень. Этот вид порож дает только вращательное движение с центром вращения в основании кости.
Описание свойств
Название свойства | Описание свойства |
---|---|
yaw_stiffness | Значение жёсткости для локальной Yaw оси вращения |
yaw_damping | Демпфирование вдоль локальной Yaw оси вращения (мин: 0, макс: 10) |
pitch_stiffness | Значение жёсткости для локальной Pitch оси вращения |
pitch_damping | Демпфирование вдоль Pitch оси вращения (мин: 0, макс: 10) |
along_stiffness | Значение жёсткости вдоль оси колебания. Это используется только в том случае, если для этой кости указано allow_length_flex |
along_damping | Демпфирование вдоль оси колебания пружины. Это используется только в том случае, если для этой кости указано allow_length_flex (мин: 0, макс: 10) |
allow_length_flex | По умолчанию, при колебании кость сохраняет свою изначальную длину. Указание этого параметра позволяет изменять эту длину при колебании |
length | Расстояние от основания в дюймах до массы «наконечника». Маленькие значения приводят к сильному колебанию. Более высокие значения приводят к более тонким движениям |
tip_mass | Насколько на наконечник действует гравитация. Ноль отключает эффекты гравитации, тогда как 1000 будет большой массой |
Пример использования
$jigglebone "JigglyUpAndDown" {
is_flexible {
yaw_stiffness 100
yaw_damping 3
length 20
yaw_constraint 0 0
}
}
Группа свойств has_base_spring
Смоделированная масса помещается на основание кости. Этот вид создает только поступательное движение, перемещая всю покачивающуюся кость по осям X, Y и Z.
Описание свойств
Название свойства | Описание свойства |
---|---|
stiffness | Значение жёсткости |
damping | Значение демпфирования |
left_constraint | Максимальное расстояние, на которое позволено смещаться кости вдоль локальной оси X |
left_friction | Величина трения, применяемого в плоскости вверх/вперед, когда пружина трется о левое ограничение (left_constraint) |
up_constraint | Максимальное расстояние, на которое позволено смещаться кости вдоль локальной оси Y |
up_friction | Величина трения, применяемая в левой/вперед плоскости, когда пружина трется о ограничение вверх (up_constraint) |
forward_constraint | Максимальное расстояние, на которое позволено смещаться кости вдоль локальной оси Z |
forward_friction | Величина трения, применяемого в левой/верхней плоскости, когда пружина трётся о переднее ограничение (forward_constraint) |
base_mass | Насколько на периодические колебания действует сила тяжести |
Пример использования
$jigglebone "Bouncy" {
has_base_spring {
stiffness 100
damping 1
left_constraint -20 20
up_constraint -20 20
forward_constraint -20 20
}
}
Группа свойств is_boing
Документирование данной группы свойств ещё не завершено.
Периодическое сжатие и растяжение кости, масштабирует выбранную кость. Может вызывать падение игры.
Описание свойств
Название свойства | Описание свойства |
---|---|
stiffness | ? |
damping | ? |
left_constraint | ? |
left_friction | ? |
up_constraint | ? |
Угловые ограничения
Перечисленные ниже параметры могут быть использованы внутри групп свойств is_rigid
и is_flexible
. Вы можете использовать эти параметры сразу все вместе, или не использовать их вообще.
Также, следует учитывать, что каждое из угловых ограничений будет вызывать нетривиальные вычисления, что в теории может негативно влиять на FPS или усиливать нагрузку на CPU.
Название | Описание |
---|---|
angle_constraint | Устанавливает максимальное допустимое угловое отклонение, создающее коническую границу, через которую не может пройти покачивающаяся кость |
yaw_constraint <min> <max> | Задайте минимальное и максимальное допустимое угловое отклонение вдоль оси вращения местного рыскания. Угловые значения не должны превышать +/- 90 градусов |
yaw_friction | Ненулевое значение создаёт силу трения, когда покачивающаяся кость скользит по плоскости, определяемой пределом рыскания. Значение не должно превышать 20 единиц |
pitch_constraint <min> <max> | Задайте минимальное и максимальное допустимое угловое отклонение вдоль оси вращения местног о шага. Угловые значения не должны превышать +/- 90 градусов |
pitch_friction | Ненулевое значение создаёт силу трения, когда покачивающаяся кость скользит по плоскости, определяемой пределом шага. Значение не должно превышать 20 единиц |
Пример использования
$jigglebone "Antlion.glasswingR_bone" {
is_flexible {
yaw_stiffness 700
yaw_damping 6
pitch_stiffness 700
pitch_damping 8
tip_mass 5
length 30
angle_constraint 37
}
}
$jigglebone "JigglyUpAndDown" {
is_flexible {
yaw_stiffness 100
yaw_damping 3
length 20
yaw_constraint 0 0
}
}