Компиляция моделей и полный список параметров

Материал из Наша Wiki - Наша энциклопедия Half-Life
Перейти к: навигация, поиск

Описание

Дня начала определяем, какой тип модели нам нужен:

• Если модель будет движущаяся и/или анимированная, то делаем ее prop_dynamic или prop_dynamic_override (динамическая) (Например, рычаги, кнопки).

• Если модель должна иметь физику (падать, дергаться и т.д.), делаем ее prop_physics (физическая) (Например, коробки, бутылки).

• Если модель не будет двигаться и будет иметь статические тени, то делаем ее prop_static (статическая)


Чтобы скомпилировать модель (на примере 3Ds Max), нужно иметь 5 простых вещей:

1) Движок Source.

2) Несколько SMD файлов полученных из 3D Max.

3) QC-файл (конфигурация, которая объясняет компилятору, куда и с какими свойствами компилить модель).

4) Сам компилятор.

5) Голова не плечах и прямые руки.

Работать мы будем с моделью лесенки, вот она:

Ladder1.jpg

SMD-файлы описывают свойства модели (геометрия и анимация). Их мы получим при помощи экспортера 3Ds Max, который можно скачать здесь. http://www.wunderboy.org/3dapps.php#max_smd Рекомендуемые окончания файлов (чтобы не запутаться):

*_ref — геометрия

*_phy — физическая оболочка модели, о ней позже

*_ani— анимация

*_exp — вертексная анимация, к примеру, лица.


Например, reference SMD (меш, геометрия) должна быть названа mymodel_ref.smd.

При экспорте из 3D Max выбираем формат Source SMD, и открывается окошко:

Compic2.jpg

ВНИМАНИЕ! При экспорте части модели ни в коем случае не должны быть сгрупированы! (выделить все > Group>Ungroup)

ВНИМАНИЕ! Экспортер очень плохо работает с модификатором ProOptimizer! При экспорте гарантированный краш 3D Max! Для исправления создаем куб, преобразовываем в EditPoly и аттачим К НЕМУ нашу модель, далее с помощью Element удаляем куб. Экспортируем.

Export reference SMD: опция для экспорта геометрии и физической оболочки (опции не трогаем). Export sequence SMD: опция для экспорта только анимации.

Подробнее>> (Указываем длину анимации (первый и последний кадр). Опция Reverse sequerence предназначена для инвертирования анимации. Т.е. задом наперед. Очень удобно инвертировать анимацию, например, открытия двери, когда нужна анимация закрытия.)

PS. Для удобства работы с текстовыми файлами (и не только) рекомендуем использовать бесплатную программу Notepad ++. Скачать ее можно с официального сайта. http://notepad-plus-plus.org/download/v5.9.2.html

Компиляция статической модели (prop_static, не анимированного статичного prop'а) :

$cd "C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\mymodel"
$modelname "porch\ladder01.mdl"
$scale "1"
$body "body" "ladder01_ref"
$cdmaterials "models\porch"
$surfaceprop "rock"
$staticprop
$sequence idle "ladder01_ref" fps 30.00
$collisionmodel "ladder01_phy"
{
 $concave 
}

$cd "C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\mymodel" // Это путь к самому qc файлу. В этой же папке должны лежать smd-файлы.

$modelname "porch\ladder01.mdl" //здесь указываем название модели. "porch\" - это папка, в которой будет лежать готовая модель, вы должны создать эту папку вручную, до компиляции, вот здесь: C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\models P.S. полный путь к готовой модели будет выглядеть так: "C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\models\porch\ladder01.mdl"

$scale 1 // параметр, с помощью которого можно изменить масштаб компилируемой модели.

$body "body" "ladder01_ref"// тут указываем наш smd с геометрией (reference)

$cdmaterials "models\porch" // путь к текстуре, само название текстуры указывать не нужно.

Внимание! название текстуры, которую вы применили к модели в 3ds max, должно совпадать с названием текстуры, которая будет в указанной папке. Полный путь к текстуре будет выглядеть так : "C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\materials\models\porch\*название текстуры*)

$surfaceprop "rock" // тип материала, из которого сделана модель. (Полный список переменных для этого параметра можно увидеть здесь. http://developer.valvesoftware.com/wiki/Material_surface_properties ).

Подробнее>> (Определяет, как поверхность реагирует на другие объекты. Также помогает определить вес модели (когда используется команда для его расчёта).) Заметка: Такая же команда есть в материалах. Если у модели они не совпадут, то будет выбрана версия из QC. Не до конца ясно, зачем функциональность дублируется, и поверхность описывается как в материалах, так и в файле для импорта модели...

$staticprop // указываем, что модель будет статична.

Подробнее>> (Информирует studiomdl о том, что у модели нет движущихся частей; в результате можно осуществить некоторые весьма важные оптимизации. Если вы собираетесь использовать модель как prop_static, то эту команду использовать необходимо, - однако, она не запретит использовать модель где-то еще (на самом деле, большинство моделей на физике тоже используют $staticprop)).

Внимание! Эта команда отключает все анимации в модели и они не будут работать.

$sequence idle "ladder01_ref" fps 30.00 // Команда нужна для анимации. Idle - название анимации, "mymod_props\nature\rock_001_ref" - путь к самой анимации, fps 30.00 - количество кадров в секунду.

Подробнее>> (Несмотря на то, что эта модель используется с параметром $staticprop и не анимируется, движку Source для правильной работы потребуется "пустая" idle-анимация. Такая анимация должна состоять из одного кадра, откуда следует, что свойство fps ни на что не будет влиять (но оно все равно будет при проигрывании).)

$collisionmodel "ladder01_phy" // тут указываем наш физбокс, если указать основную модель, будет создан неправильный физбокс.

Подробнее>> (Если collision-модели нет, то объекты будут пролетать модель насквозь (что в некоторых случаях и является желаемым результатом). Если вы собираетесь анимировать модель столкновений, используйте $collisionjoints. О создании физбокса к модели читайте ниже.)

$concave // делает физбокс выпуклым или вогнутым.


Дополнительные параметры:

$autocenter // команда, передвигающая центр модели в центр bounding box'а (невидимая прямоугольная коробка определяющая размеры объекта) и создает в центре аттачмент "placementOrigin". Очень удобно при создании осколков моделей для файла propdata.

$lod // команда, с помощью которой к модели подключаются меши с меньшим количеством полигонов. Движок сам будет выбирать детализированность модели, учитывая мощность компьютера и расстояние от игрока до объекта. Другими словами — это нужно для оптимизации.

Примеры QC файлов

Компиляция динамической модели (prop_dynamic/prop_dynamic_override, анимированного prop'а):

$cd "C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\mymodel"
$modelname "porch\ladder01.mdl"
$scale "1"
$body "body" "ladder01_ref"
$cdmaterials "models\porch"
$surfaceprop "rock"
$keyvalues  { prop_data { "base" "Wooden.Tiny"  } }
$sequence idle "ladder01_ref" fps 30.00
$collisionmodel "ladder01_phy"

{
    $concave 
    $mass 1.0
}

Другие физические параметры: (пишутся в скобках после $concave ) и они не обязательны:

$mass 1.0 //Установка массы объекта.

$automass //автоматический выбор массы объекта опираясь на объем объекта и данные вписаные в параметре prop_data.

$masscenter // поможет установить центр массы объекта.

$inertia 1.00 // Инерция (сохранение скорости тела).

$damping 0.00 // Линейное изменение скорости объекта.

$drag 0.00 // сопротивление воздуха.

$rotdamping // угловое ускорение.

$keyvalues { "prop_data" {"base" "Wooden.Medium" } // В $keyvalues можно использовать следующие параметры: prop_data, physgun_interactions, particles, door_options и анимации для игроков (типа vehicle_entry, vehicle_exit, vehicle_escape_exit (выход из машины, мы это рассматривать не будем):


1) prop_data // основные данные о физике:

Основные:

base // опция выбора основных свойств модели одновременно (такие как разрушаемость и физическое поведение). Полную таблицу можно просмотреть здесь http://developer.valvesoftware.com/wiki/Prop_data_base_types

health // количество повреждений, которое нужно для уничтожения объекта (0 значит, что объект неуничтожим)

allowstatic // позволяет ставить физ. объект как статический prop_static (иначе выдаст ошибку в консоли и модели не будет на карте).

physicsmode 1 // когда настройки физики объекта ставятся как prop_physics_multiplayer

   1 // (Solid) отталкивает игрока
   2 // (Non-solid) отталкивается игроком
   3 // (Non-solid, clientside) симуляция физики только со стороны клиента (экономит трафик).

blocklos 1 // NPC не будут видеть игрока и других персонажей через этот объект (используется в prop_door_rotating)

AIWalkable 0 // могут ли NPC проходить через этот объект?

Повреждения:

dmg.bullets  1.0 // повреждения от пуль:
   Бумага, ткань и стекло = 0.5
   Дерево = 0.75
   Мясо (жив. организмы) = 1.25
   
dmg.club 1.0 // повреждения от "тупых" повреждений (бросок, падение):
   Ткань = 0.75
   Бумага и керамика = 1.25
   Дерево = 2.0
   
dmg.explosive 1.5 // повреждения от взрывов:
   Бумага, ткань, керамика, мясо и дерево = 1.5
   

damage_table 1 // фильтр повреждений. Полная таблица фильтра здесь. http://developer.valvesoftware.com/wiki/Impact_Damage_Table

1 // Игрок   (чтобы получить повреждения, объект должен весить более 2 кг и двигатся как минимум со скоростью 36 юнитов\сек.)
2 // Игрок в машине (чтобы получить повреждения, объект должен весить более 80 кг и двигатся со скоростью более 36 юнитов\сек.) 
3 // NPC 
4 // Стекло 
   

Взрывающиеся физ. объекты:

explosive_damage 100 // количество едениц повреждения от взрыва

explosive_radius // радиус повреждения от взрыва

Осколки (о создании своих осколков написано в этой статье http://developer.valvesoftware.com/wiki/Creating_Custom_Breakable_Gibs ):

breakable_model //- это модели того, на что будет разлетаться основная модель после разрушения, ну, скажем, если постоянно колотить эту модель гвоздодёром, то она разлетится, в данном случае, на деревянные щепки. Другие виды осколков можно посмотреть в файле propdata в папке scripts. Основные из них:

   WoodChunks // деревянные осколки
   GlassChunks  // стекляные осколки
   ConcreteChunks  // осколки камней
   MetalChunks  //  металлические осколки

breakable_count 10 // количество осколков после разбивания объекта. Если не установлено, будет определено автоматически опираясь на размеры объекта.

breakable_skin 1 // дает возможность изменить скин осколков. Работает только с деревянными осколками.

multiplayer_break client // определяет, на какой стороне (клиент\сервер) будут спавниться осколки.

   both //везде
   server // только на сервере
   client  // по дефолту

Горящие физ. объекты:

    $keyvalues
{
   prop_data
   {
      fire_interactions
      {
         ignite      halfhealth 
         explosive_resist   yes
         flammable          yes
      }
    }
 }

ignite halfhealth // загорится, когда потеряет половину прочности.

explosive_resist yes // вместо того, чтобы поломаться, она загорится.

flammable yes // загорится от огня или взрывов.

2) Particles (прицепить партикл). Например :

particles
{
       effect
       {
               name                        "<particle effect name>"
               attachment_type                <attachment type>
               attachment_point        <name of attachment point>
       }
}

attachment_type // тип аттачмента:

start_at_origin //спавнится в центре в начале карты

start_at_attachment // спавнится в точке аттачмента, после чего движется независимо.

follow_origin //следовать центру

follow_attachment // движется и поворачивается согласно аттачменту.

attachment_point // точка спавна для аттачмента (если применимо).

3) Physgun interactions. (Взаимодействия с гравиганом.) Например:

$keyvalues
{
       physgun_interactions
       {
                preferred_carryangles         "0 0 0"
                onworldimpact                 stick
                onfirstimpact                 break
                onfirstimpact                 paintsplat
                onlaunch                 spin_zaxis
                onbreak                 explode_fire
                damage                         none
       }
} 

preferred_carryangles // устанавливает, как должен быть повернут объект, когда его держат в руках.

onworldimpact // когда ударится об что-то после броска грави пушкой:

stick // прилипнуть к поверхности.

bloodsplat // сделать брызги крови.

onfirstimpact // когда первый раз ударится об что-то после броска

break // сломается

paintsplat // сделать пятно краски (броски банок с краской).

impale // проколоть\пронзить первый объект после броска.

onlaunch // после броска грави пушкой..

Default // объект летит со нормальной скоростью

spin_none // бросок объекта без вращения

spin_zaxis // бросок объекта +придать вращение (металлический диск от пилы из Рэвенхольма).

onbreak // после разбивания предмета

explode_fire // поджигание находящихся рядом предметов (которые могут гореть).

damage none // объект не двигается во время толчка гравипушкой. Он все еще может принять ущерб, но он не будет двигаться.

allow_overhead yes // разрешение на поднятие объекта выше головы..

onpickup create_flare // зажигать сигнальный огонь (и/или свет) с аттачмента "fuse" при подымании объекта. Используется в модели красной сигнальной палочки с надписью emergency flare.

Двери

Пример:

$keyvalues
{
       prop_data
       {
               blocklos 1
       }
       door_options
       {
               default
               {
                       open        Doors.FullOpen1
                       close        Doors.FullClose1
                       move        Doors.Move1
                       locked                DoorHandles.Locked1
                       unlocked        DoorHandles.Unlocked1
               }
               hardware0
               {
                       locked                DoorSound.Null
                       unlocked        DoorSound.Null
               }
               hardware1
               {
                       locked                DoorHandles.Locked1
                       unlocked        DoorHandles.Unlocked1
               }
               hardware2
               {
                       locked                DoorHandles.Locked2
                       unlocked        DoorHandles.Unlocked2
               }

               skin1 
               {
                       open        Doors.FullOpen4
                       close        Doors.FullClose4
                       move        Doors.Move4
                       surfaceprop        wood
               }
       }

}

Поясню:

blocklos 1 // NPC не будут видеть игрока и других персонажей через дверь.

hardware0 // Первый тип средств открывания двери, по умолчанию — ручка.

hardware1 // рычаг

hardware2 // клавиатура

skin1 // соответствующие звуки к скины, включая свой surfaceprop.


Аттачменты

Аттачменты нужны для того чтобы прицепить (припарентить) любую энтитю к кости модели.

$attachment "attach1" "bone001" 0.00 0.00 1.00 rotate 0.00 0.00 0.00

attach1 // имя аттачмента

bone001 // кость к которой указываем аттачмент

0.00 0.00 1.00 // это сдвиг аттачмента относительно центра кости

rotate 0.00 0.00 0.00 // поворот по осям XYZ относительно центра кости

В хаммере объект цепляем к модели model энтитю Entity с помощью инпутов:

-> Entity -> SetParent : model
-> Entity -> SetParentAttachment : attach1  | Delay: 20

SetParentAttachment // телепортировать энтитю в точку аттачмента и прицепить

Или аналогичная команда:

SetParentAttachmentMaintainOffset // прицепить энтитю к аттачменту без телепортирования

Кабель в модели

Чтобы сделать кабель в моделе, сначала делаем 3 кости с названиями: point1, point2 и point3. Прописываем (в QC файле) костям аттачменты, за которые зацепим провода. :

$attachment "point1" "staticprop" 0.00 0.00 9.50 rotate 0.00 0.00 0.00
$attachment "point2" "staticprop" -128.00 0.00 9.50 rotate 0.00 0.00 0.00
$attachment "point3" "staticprop" 0.00 0.00 25.50 rotate 0.00 0.00 0.00

Пример кабеля, проходящего через 3 точки (2 отрезка):

$keyvalues
{
   Cables
   {
       "Cable"
       {
           "StartAttachment" "point1"
           "EndAttachment" "point2"
           "Width" "0.6"
           "Material" "cable\cable"
           "NumSegments" "10"
           "Length" "200"
       }
       "Cable"
       {
           "StartAttachment" "point2"
           "EndAttachment" "point3"
           "Width" "0.6"
           "Material" "cable\cable"
           "NumSegments" "6"
           "Length" "250"
       }
   }
}

StartAttachment <attachment name> // Точка, откуда начинается отрезок кабеля.

EndAttachment <attachment name> // Точка, где заканчивается отрезок кабеля.

Width 0.6 // указывает толщину кабеля.

Material cable/cable // Материал кабеля. Их можно выбрать в "materials/cables".

NumSegments 10 // количество сегментов в кабеле. Чем их больше, тем меньше будет заметна угловатость веревки.

Length 200 // длина провода. Если длина меньше, чем расстояние между точками, то она будет натянута. Если больше — будет провисать.


Скины модели

Если вы хотите сделать скины для модели с возможностью переключения, используем команду $texturegroup. После строки $cdmaterials пишем:

$texturegroup "my_skin_group"
{
       { "ladder01a" }
       { "ladder01b" }
       { "ladder01c" }
}

my_skin_group // любое название группы.

ladder01a / ladder01b / ladder01c // названия текстур

ВНИМАНИЕ! В данном случае первая текстура ladder01a должна быть базовая! То есть наложена на модель в 3D эдиторе. Иначе скины переключатся не будут.

Если Вы хотите изменять две текстуры на два или более аналогичных скина просто дописывайте их в строчку:

$texturegroup "my_skin_group"
{
       { "rock_001a" "rock_002a" "rock_003a" }
       { "rock_001b" "rock_002b" "rock_003b" }
       { "rock_001c" "rock_002c" "rock_003c" }
}


Теперь полный пример:

$cd "C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\mymodel"
$modelname "porch\ladder01.mdl"
$scale "1"
$body "body" "ladder01_ref"
$cdmaterials "models\porch"
$texturegroup "my_skin_group"
{
       { "rock_001a" "rock_002a" "rock_003a" }
       { "rock_001b" "rock_002b" "rock_003b" }
       { "rock_001c" "rock_002c" "rock_003c" }
}
$surfaceprop "rock"
$staticprop
$sequence idle "ladder01_ref" fps 30.00
$collisionmodel "ladder01_phy"
{
 $concave 
 $autocenter
}

Создание физбокса

Физбокс. Физбокс - это упрощенная модель, которая состоит из примитивов (максимум 256), в нашем случае - немного искаженных боксов. Проще говоря, физбокс — эта та модель, которую мы чувствуем, а не которую видим (чтобы увидеть физбоксы в игре введите в консоли vcollide_wireframe 1). Когда вы подкидываете модель, ходите по ней, стреляете в нее, вы все это делаете с физбоксом. После того, как вы несколько раз поэкспериментируете - то поймёте что это такое. Итак, немного наглядности, чем же отличаются сама модель от ее физбокса? Наглядный пример:

Comp2.jpg

Как делать физбокс? Как я уже сказал, физбокс состоит из примитивов, они являются главными составляющими физбокса. Создадим бокс и немного исказим таким образом, чтобы он покрывал всю первую ступеньку.

Comp5.jpg

Скопируем получившийся объект на все ступеньки:

Comp6.jpg

Объединим полученные ступеньки в один объект (attach) и применим к ним первую группу сглаживания, иначе создастся неправильный физбокс.

Подробнее>> Чтобы физбокс и модель не были в разных координатах после компила:

У нас в сцене есть 2 модели - сама модель и физбокс. Выберите основную модель и приаттачьте к ней физбокс, затем выберите режим редактирования "Element", выделите основную модель и удалите. Зачем мы это сделали? Для того, чтобы физбокс принял координатные свойства от основной модели. Не забудьте применить к физбоксу текстуру, без нее не скомпилиться, можно применить и текстуру от основной модели. Все, можете экспортировать. )

ВНИМАНИЕ! У всех примитивов из которых состоит физбокс должны быть установлена одинаковая смуз група. Если иначе ваш физбокс не будет простреливатся или через него нельзя будет пройти.

Comp8.jpg

Хочу заметить, что физбокс не является единым мешем, а 8-ю боксами, нельзя сливать все воедино. Например, для трубы физбокс будет выглядеть так (16 боксов):

Comp9.jpg

Comp10.jpg

Но не обязательно в точности повторять форму.

Comp11.jpg

P.s 128 объектов физбокса - максимальное кол-во.

Проверим нашу лесенку в model viewer:

Comp12.jpg

Все отлично, модель готова к эксплуатации. Если бы вы в qc указали основную модель в качестве физбокса, то получили бы такой результат:

Comp13.jpg

Компиляция модели

Сохраните ваш qc в папке "C:\games\Steam\steamapps\sourcemods\Название_мода\mymodel" под названием model.qc

Теперь в папке: C:\games\Steam\steamapps\sourcemods\Название_мода создадим с помощью блокнота батник, в нём пишем: C:\games\Steam\Steamapps\ваш_аккаунт\sourcesdk\bin\source2007\bin\studiomdl.exe -fullcollide C:\games\Steam\Steamapps\Sourcemods\ваш мод\mymodel\model.qc pause

ВНИМАНИЕ! если в пути есть пробелы, берем содержимое (пусть) в кавычки " ". Сохраняем батник под названием mdl1.bat. Запускаем. Начинается компиляция модели, обычно это занимает не больше нескольких секунд. Ваша модель должна появиться в C:\Games\Steam\steamapps\sourcemods\*название вашего мода*\models\mymodel\porch

Давайте же проверим, все ли прошло гладко. Заходите в SourceSDK, запускайте ModelViewer, жмите File>Load Model. Появится окно, сейчас вы находитесь в папке "models". Логично, что вам нужно пройти в mymodel\porch и там выбрать Ladder01.mdl

Если на модели черно-розовая текстура, значит есть какие-то проблемы с текстурой, скорее всего вы напутали что-то с путями (распространенная ошибка). Либо в QC, либо в материале текстуры.

Вашей модели нет? Значит компил прошел печально. Правильный компил должен выглядеть так.

Comp3.jpg

В конце пишет Completed "***.qc" Если вам пишет "Системе не удается найти указанный путь.", то проверьте, правильно ли написан путь до studiomdl.exe в батнике, если же напишет "Error opening c:\games\steam\steamapps\sourcemods\thehope\mymodel\models.qc" — проверьте путь до qc (возможно название qc файла написано неправильно)

Если вы все сделали правильно, вы увидите такую картину:

Comp4.jpg

Внимание!! Если вы видите красно желтые ошибки в окне компиляции значит нужно запустить Source SDK и указать игру Counter-strike Source. Это связано с системной переменной, которая изменится после переключения.

Удачных компилов!

Авторы: Stridemann, Тим