Skip to main content

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 <имя текстуры> <режим рендеринга> - Установка специального режимы рендеринга для указанной текстуры

Доступные режимы рендеринга:

  1. additive
  2. masked
  3. masked_solid
  4. fullbright
  5. smooth
  6. nosmooth
Примечание

Если вам нужны два режима рендеринга на одной и той же текстуре, вы должны сделать отдельную запись, так как вы не можете поместить 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

tip

Документирование данной группы свойств ещё не завершено.

Периодическое сжатие и растяжение кости, масштабирует выбранную кость. Может вызывать падение игры.

Описание свойств

Название свойстваОписание свойства
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
}
}