Source engine коллизия модели своими руками

Source Inside

Source Tools

Обзор

Основным преимуществом движка Source является физическая имитация твердых тел. Эта симуляция имплементирует основную механику и физику Ньютона такие как гравитация, траэктория, трение, столкновения, прыжки и плавание. Модели поддерживают эту имитация предоставляя информацию о их модели коллизий, типе материалов, весе В режиме однопользовательской игры все физические энтити контроллируются и имитируются сервером (физика на стороне сервера) и коннектится с клиентом. В режиме многопользовательской игры мелкие объекты подобные жестянкм или бутылкам которые не влияют на геймплей полностью имитируются на стороне клиента и поэтому не синхронизируется между клиентами. Это необходимо в связи с тем что движение физических энтитей создает значительный сетевой траффик с того момента как они изменяют их позицию и базовую ориентацию в кажом фрейме. Сообщение по сети этих изменений может почти полнотсью захлебнуть все соединения как только начнут двигаться множество физ. объектов (взрывы, т.д.). Физ. объекты на стороне клиента не влияют на движение игрока и значительно меньше чем сам игрок, так что игрок не может спрятаться за ними. Во время разрушения бьющихся объектов, они разбиваются на меньшие фрагменты имитирующиеся на стороне клиента.

Добавление физических энтитей

Для маппера довольно просто помещать физические энтити в Хаммере. Для однопользовательских карт класс энтити physics_prop должен быть использован для создания контроллируемых серверной стороной энтитей. Игрок выполняет корректную коллизию с этими энтитями, может проходить сквозь них, двигать их с разных сторон или поднимать их. К сожалению этот класс не может использоваться в многопользователськой игре так как взаимодействие игрока с физическими энтитями не спекулируются на стооне клиента и может вызвать неестественное, отрывчастое движение. Поэтому должен быть использован специальный класс энтити prop_physics_multiplayer, который имплементирует более упрощенное поведение коллизии ( COLLISION_GROUP_PUSHAWAY ). Многопользовательские физ. энтити только могут толкаться, но нельзя ходить сквозь них или поднимать. Если они больше игрока, он просто отталкивается. Становятся ли многопользовательские физ. энтити серверными или имитируются на стороне клиента, определяется в объекте модели.

Физические свойства модели определяются в ее .QC файле с помощью 3 секций: $surfaceprop, $collisionmodel, $keyvalues . Первая секция $surfaceprop устанавливает свойства поверхности модели как описано в текстовом файле \scripts\surfaceproperties.txt . Тут описываются свойства типа трения, эластичностьзвуки коллизий. Следующая секция $collisionmodel устанавливает модель коллизий и вес объекта. Для простмотра модели коллизий для энтитей в игре включите консольную переменную « vcollide_wireframe 1 ». Третяя секция «prop_data» включенная в $keyvalues . Сдесь описываются свойства объекта например кол-во здоровья, разбиваемость модели и физический режим. Ниже приводится пример:

Режим физики в объекте определяет серверная или клиентская физика будет у этой энтити. Существует 2 серверных режима и один клиентский, описаны они в props_shared.h :

Если свойство физического режима не установлено в propdata.txt или в QC file, режим физики может быть получен из функции GetAutoMultiplayerPhysicsMode () основанный на размере и весе модели. Модель становиться с серверной физикой, если ее меньше определенной границы (устанавливается консольной переменной sv_pushaway_clientside_size ).

Читайте также:  Как заварить днище автомобиля своими руками электросваркой

Группы коллизий

По нескольким определенным причинам нет необходимости чтоб все динамические физ. энтити вызывали коллизии между собой. Это может быть по разным причинам геймплея, но больше это результат производительности. Особенно создание множеством мелких, быстро движущихся кусков осколков могут значительно снизить производительность. Для визуального эффекта бющихся осколков или взрывающихся частице-подобных объектов достаточно их коллизии с статическими предметами мира, но не самих с собой или других динамических объектов. Для имплементации специального поведения коллизий движок Source позволяет определять группы коллизий и указывать должны элменты этих групп сталкиваться или нет. Каждая энтить принадлежит только одной группе одновременно, устанавливается это функцией SetCollisionGroup () . Новые группы и новые правила могут быть просто добавлены. Физические подсистемы запрашивают виртуальную функцию bool CGameRules::ShouldCollide (int group0, int group1) для определения должна ли вызываться проверка коллизии между двумя объектами. Изначально определены группы:

По умолчанию, сталкивается с статическими и динамическими объектами

Сталкивается только с миром и статическими вещами

Тоже что и предыдущее, но переключает триггеры

Источник

Source Inside

Source Tools

1\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\materialsrc\\models\\*.tga
Не забывайте указывать вместо слов «ваш мод» и «ваш аккаунт» свои аккаунт и название вашего мода!
Теперь сохраняем этот файл как texture.bat и запускаем его, после чего произойдёт конвертация текстуры из формата tga в формат vmt, в папке: C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\materials\\models появятся 2 файла:
taburetka.vmt и taburetka.vtf
С текстурой всё.
Возвращаемся в 3dsmax и создаём там кость, выбираем вкладку Systems, командной панели, тыкаем на bones и создаём одну кость.
Теперь о том как в максе присоединять кость к модели:

1 способ.
Веделяете всю модель и применяете к ней модификатор skin, нажимаете на кнопку add в свитке parameters:

и в окне указываете единственную кость. Далее жмём на кнопку Edit Envelopes, появятся контейнеры, как на рисунке, увеличиваем значение в поле radius… как видите из рисунка, я увеличил радиус и левая сторона табуретки окрасилась в красный цвет… далее выделяем квадратик с правой стороны табуретки и опять увеличиваем радиус, вся наша модель должна быть окрашена в красный цвет, вы также можете включить режим wireframe, чтобы увидеть сетку, на ней будут видны вертексы, точки этой модели.
Чтобы убедится в том, что наша модель полностью присоединена к кости, выделите эту кость и подвигайте, модель должна перемещаться вместе с костью.
2 способ.
Второй способ, на мой взгляд самый лёгкий:
Выделяете всю модель и нажимаете на кнопку Select and Link, в панели Main Toolbar, , далее наводите курсор на модель, зажимаете левую кнопку мыши и наводите курсор на кость (курсор примет другой вид), отпускаете. Всё кость присоединилась, можете это также проверить.
Ну и теперь осталось только сделать экспорт модели в формат smd.
Нажимаем File => Export и сохраняем как reference с именем taburetka.smd в папку с названием, mymodel, которая должна находится здесь: C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод
Настало время создать qc файл. В папке C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\mymodel создадим с помощью блокнота файл, в нём напишем это:

$cd «C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\mymodel» // Это путь к qc файлу
$modelname «mymod/taburetka.mdl» //здесь указываем название модели, а mymod это папка в которой будет лежать готовая модель, вы должны создать эту папку вручную, до компиляции, вот здесь: C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\models
$scale 1.0 // масштаб модели
$body «body» «taburetka.smd» // тут указываем наш smd
$cdmaterials «models/» // путь к текстуре
$surfaceprop «wood» // материал, из которого сделана модель
$sequence idle «taburetka» fps 30 aCT_iDLE 1 // тут указывают smd с анимацией, у нас её нет, поэтому мы используем наш единственный smd
$keyvalues < «prop_data» <"base» «Wooden.Medium» >// это модели того на что будет разлетаться основная модель, ну скажем если постоянно колотить эту модель гвоздодёром, то она разлетится, в данном случае, на деревянные щепки, другие виды осколков можно посмотреть в файле propdata в папке scripts.
$collisionmodel «taburetka.smd» // здесь указывается физическая модель, если указать основную модель то будет создан неправельный физбокс, ну например, между ножек табуретки не будут пролетать пули, поэтому нужно создавать правильный физбокс и писать здесь smd физбокса, об этом чуть позже.
<
// Mass in kilograms
$concave // эт я незнаю чё такое, кто знает пишите в комментах =))
$mass 2.0 // ну, а это масса модели в килограммах
>

Сохраняем этот файл как taburetka.qc

Примечание:
Если вы собираетесь компилировать статичную модель то надо заменить параметр:
$keyvalues
на
$staticprop

Теперь в папке: C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод
Создадим, с помощью блокнота, батник… в нём пишем:
C:\\progra

1\\Valve\\Steam\\Steamapps\\ваш аккаунт\\sourcesdk\\bin\\studiomdl.exe -fullcollide C:\\progra

1\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\mymodel\\taburetka.qc
И сохраняем как mdl.bat
Запускаем его. Модель должна скомпилится и появится в папке: C:\\program Files\\Valve\\Steam\\Steamapps\\Sourcemods\\ваш мод\\models\\mymod
Запускаем Model Viewer и смотрим какая там у нас получилась модель, у меня вот:

Если будут проблемы с текстурами, например она будет расположена не так как в максе (у меня на рисунке кстати так и есть), то надо использовать в максе модификаторы UVW Mapping или Unwrap UVW.
В моделвьювере я поставл галочку напротив physics Model, как видите физбокс неправильный, и если мы будем стрелять в пространство между ножек то пули будут сбивать табуретку, а не пролетать через это пространство.
Сейчаз будем учится делать эти самые правильные физбоксы.
Физбокс это упрощенная модель, которая состоит из простых боксов, проще говоря эта модель нужна для физики, когда вы несколько раз поэкспериментируете, то поймёте что это такое.
В нашем случае физбокс будет такой же по сложности, как и сама модель, потому как табуретка и так очень простая модель.
Так что (в максе) мы просто выделяем все боксы нашей табуретки, и применяем к ним модификатор Edit poly, выделяем все полигоны и назначаем их в группу сглаживания 1

Физбокс любой модели тоже должен быть покрыт текстурой, но настраивать её не надо, потому как в игре этого видно не будет. Если ещё не привязана кость, то привяжите и экспортируйте как reference с именем taburetka_phys.smd
В qc файле указываете этот физбокс: $collisionmodel «taburetka_phys.smd»
Компилируем модель, открываем модельвьювер и видим нормальный физбокс:

Теперь и пули сквозь дырки пролетать будут и физически эта модель будет кувыркаться в игре (от ваших выстрелов) также как и в жизни =)
Всё это было разобрано на примере простой модели, у вас могут возникнуть проблемы со сложными моделями, а именно с физбоксами… если быть ещё точнее с нормалями… я не нашёл другого способа, кроме того как выствить точки опоры каждого бокса понулям.
Наверное это поначалу сложно понять, щас попытаюсь объяснить.
Например я задумал сделать арку, сделал модель, сохранил, далее начинаю обкладывать эту модель простыми боксами, делаю физбокс, потом удаляю оригинал и оставляю эти боксы, сохраняю как физическую модель, компилю и вижу:

Ого…
Это происходит из-за того что при клонировании и перемещении создаваемых мною боксов, точка опоры смещается относительно центра и происходит такая ерунда, я решил эту проблему вот как:
Создаю арку и кость, соединяю их и когда модель уже готова к экспорту я выставляю точки опоры и у модели и у кости на ноль (причём как координаты перемещения, так и вращения), выставить на ноль их надо следующим образом:
Выделите модель, перейдите во вкладку Hierarchy, нажмите на affect pivot Only и задайте в полях обведённых красным — нули (не забывая что это нужно проделать для координат перемещения и вращения):

Тоже самое проделайте с костью… теперь делайте экспорт обычной модели.
Дальше создаём физбокс для этой модели… и делаем опять всё тоже самое с физмоделью и с костью, делаете экспорт физмодели… компилируете и получаете нормальный физбокс:

Я долго разбирался с этим, и пользуюсь этим способом, может можно как-то иначе не знаю… возможно в Softimage нет таких проблем… я с этой программой не разбирался.

Источник

Source Engine — Коллизия Моделей своими руками

Для просмотра онлайн кликните на видео ⤵

Создание моделей столкновений | Source EngineПодробнее

Создание коллизии в 3d max Для UE4Подробнее

[Source SDK] Создание своего оружия и патроновПодробнее

Source Engine — Как добавить скин модели? / $CBox-$BboxПодробнее

Source Engine — Valve Hammer — Хинты внутри и снаружи зданияПодробнее

Source Engine — Lets Crush the Source 1 (Как сломать сорс 1)Подробнее

Source Engine — Hammer++ Как быстрей работать?Подробнее

Что не так с ИГРАМИ на SOURCE?Подробнее

урок 11 Перевод source моделей в goldSRC, Еще раз про bat компиляциюПодробнее

Своя коллизия в Блендере для Unreal Engine 4.Collisions in Blender for Unreal Engine 4.Подробнее

Уроки Source 2 — Hammer (HL:A) — Скачиваем Инструменты и короткое обьяснение! #1Подробнее

Source Engine — Valve Hammer — Mortar Gun (Орудие Альянса)Подробнее

Создание реквизита для движка исходного кода за 6 минут (Blender)Подробнее

Портирование из Unreal Engine в Source EngineПодробнее

Source Engine — Trigger_Look И Point_AngleSensor (почти братья)Подробнее

Unreal Engine 4.25.Урок 13 КоллизияПодробнее

Source SDK — 3D SKYBOX (1 Часть — вступление)Подробнее

Как создать игру на Source — #0Подробнее

Valve Hammer — Displacement (Как создавать большие диспы за минуты)Подробнее

Источник

Оцените статью