Мне известно два способа добавления коллизий моделям. Первый – с помощью редактора 3ds Max, второй – с помощью утилиты ChunkMerge, которая в совокупности с утилитами NifConvert и ChunkExtract объединены в программе NifUtilsSuite, имеющей удобный графический интерфейс и просмотрщик моделей и коллизий. В данной теме я попробую разобрать оба способа.
Создание моделей с коллизиями в программе 3ds Max.В составе Nif-плагина для 3ds Max есть консольная утилита NifMopp.exe, которая при экспорте модели с коллизией генерирует MOPP данные в блоке bhkMoppBvTreeShape. Однако из нескольких версий плагина, которые я опробовал, корректно работает только плагин для 3ds Max 2013 от товарища Ehamloptiran. Плагин находится в постоянной доработке, и может быть скачан по ссылке внизу сообщения. Поговаривают, что он работает и с 2014 версией редактора, однако я не пробовал. К слову, эта версия плагина вполне корректно экспортирует настройки шейдера, даже если в редакторе материал не настроен, тангент и бинормали, сводя последующие настройки модели в NifSkope к минимуму, а также правильно масштабирует коллизии как при импорте, так и при экспорте.
Таким образом для данного туториала подготавливать модели я буду в программе 3ds Max 2013 х64 с установленным вышеозначенным плагином.Коллизии сложной формы для статичных объектов.Начнем с создания коллизий сложной формы для статичных объектов, и для примера я воспользуюсь моделью дерева, сделав из него static, хотя модели деревьев в Skyrim имеют другую структуру. Процесс сводится к созданию меша, который будет играть роль модели столкновения, и добавления к нему модификатора bhkRigidBody. В идеале геометрия модели столкновения должна быть предельно простой, но при этом соответствовать геометрической форме модели, для которой создается. Можно, конечно, создать копию исходной модели, можно скопировать её сетку, для этого в модификаторе bhkRigidBody есть соответствующая кнопка, но подобные коллизии будут инициировать ненужные расчеты столкновений, что может негативно сказаться на производительности в игре. Я изобретать новую сетку не стал, скопировал с исходной модели. После импорта модели первым делом я свелдил все вершины с порогом 0,001 и назначил все фейсы на одну группу сглаживания. Далее накидываем модификатор bhkRigidBody, ограничение объема выбираем Packed Strips Shape, и нажимаем кнопку Clone Mesh.
В результате у нас копируется сетка красного цвета, которую мы и будем использовать в качестве модели столкновения. Можно переименовать её например в collision, и применяем к ней модификатор bhkRigidBody (
у дерева этот модификатор после копирования сетки необходимо удалить!) с ограничением объема опять же Packed Strips Shape.
Остальные параметры можно не менять, на данный момент (версия плагина от 11/08/2014) они не работают. По этой причине данным способом нельзя создать коллизии с несколькими материалами, только с одним. Будем надеяться, что разработчик плагина в будущем добавит поддержку материалов.
Можно экспортировать модель, не забыв отметить чекбокс Collision.
Открываем модель в NifScope и донастраиваем несколько пунктов. У меня экспортировалось вот в таком замечательном виде.
Из настроек надо отредактировать флаги BSXFlags, выбрать материал в блоке bhkCompressedMeshShapeData, и включить отображение цвета вертексов в геометрии модели, с последующим обновлением массива вершин. Особенность плагина такова, что при экспорте цвет вертексов будет включен только при наличии у модели модификатора VertexPaint.
Основные настройки шейдера находятся в приемлемом виде сразу после экспорта, однако если необходимо поменять какие либо параметры, то заглядываем и туда. Посмотреть коллизии можно с помощью вьювера программы NifUtilsSuite, там видно все коллизии, даже те, которые не отображает NifSkope.
Правда этот вьювер некорректно масштабирует коллизии, в результате чего они не совпадают с моделью.
Теперь переходим в Creation Kit и помещаем наше дерево в игровой мир.
И далее смотрим в игре. Можно видеть, как в дерево втыкаются стрелы.
Коллизии формы выпуклого многогранника для объектов с поддержкой физикиТеперь создадим модель столкновений, имеющую форму выпуклого многогранника, называемого convex shape. Этот многогранник должен условно повторять форму модели, для которой создаётся, и не должен содержать вогнутых поверхностей. Коллизии вогнутой формы можно создать из нескольких выпуклых. В расчетах столкновений такие коллизии проще, поэтому используются в основном для различных предметов с поддержкой физики, хотя иногда используются и для статичных объектов.
Создавать коллизию будем на примере классического для подобных случаев объекта – чайника.
Для создания convex shape воспользуемся модификатором MassFX Rigid Body. Из настроек достаточно изменить только количество вертексов, из которых будет состоять наш многогранник. В зависимости от сложности геометрических форм модели оно должно составлять в большинстве случаев от 10 до 30 вершин, однако встречаются модели и с большим числом. Например, convex shape Звезды Азуры состоит из 68 вертексов. Их число должно быть по возможности минимальным, но чтобы форма получающегося многогранника соответствовала форме исходной модели. Здесь же мы должны посмотреть центр тяжести многогранника, и выписать эти цифры, позже понадобятся. Теперь нажимаем кнопку Convert to Custom Shape и получаем отдельный меш, из которого и сделаем коллизию, путем добавления ему модификатора bhkRigidBody с ограничением объема Convex Shape.
Модификатор MassFX Rigid Body у чайника необходимо удалить, и можно экспортировать модель в nif формат. Дальнейшую настройку произведем в NifSkope. Настроить надо BSX флаги, некоторые параметры, отвечающие за физические взаимодействия, материал модели, а так же включить вертексное освещение в геометрии модели.
Кое что о параметрах.
Layer – на физику не влияет, отвечает за цвет сетки в Oblivion Construction Set. Нужно ли его менять в моделях для Skyrim?
Center – центр тяжести модели. Сюда заносим результаты расчетов центра тяжести модификатора MassFX Rigid Body разделенные на 70. Однако есть некоторые нюансы. Например, для чайника я пренебрег смещениями по осям x и y, поскольку первое вызвано длиной носика, а второе несимметричностью многогранника. Смещение же по оси z я уменьшил, сместив центр тяжести вниз, чтобы чайник при падении вставал преимущественно на дно. Чем ниже центр тяжести – там больше такая вероятность. При нулевом значении он из любого положения будет вставать на дно, по принципу неваляшки.
Mass – масса модели. Нулевое значение делает модель неподвижной в игре.
Max Linear Velocity и
Max Angular Velocity – максимальные линейная и угловая скорости соответственно. Поставил значения близкие к ванильным.
Motion System – система движения. В большинстве ванильных моделей с поддержкой физики используется MO_SYS_SPHERE_INERTIA или MO_SYS_SPHERE, однако с этими системами чайник неестественно долго раскачивается, мне больше понравился MO_SYS_BOX_STABILIZED. В видеороликах можно увидеть разницу.
Inertia – инерция движения модели. Информации нет, в большинстве моделей ненулевые значения присвоены только атрибутам m11, m22, m33. Чем меньше значение – тем быстрее будут колебания и раскачивания модели.
Radius – радиус действия системы движения. По моим наблюдениям значение должно составлять 1/400 – 1/800 часть от минимального габарита модели.
Остальные параметры как на скриншотах.
Ну и собственно результат. В первом ролике использована система движения MO_SYS_SPHERE_INERTIA, во втором - MO_SYS_BOX_STABILIZED.
Продолжение следует.По мере наличия свободного времени материал будет пополняться, если у кого-то появятся замечания или дополнительная информация по вышеизложенному, пишите, будем корректировать и дополнять урок.