Редактирование моделей
Установка и настройка инструментария
Для работы с моделями необходим плагин meshexp.DLE для 3Ds max 5:
- Поместить файл meshexp.dle в папку plugins графического редактора 3DS Max;
- Открыть менеджер дополнительных утилит через меню Customize/Plug-in Manager;
- Найти в нем строчку MESHEXP.DLE (в колонке Name). Обратите внимание, напротив имени утилиты в колонке Status стоит deferred. Необходимо загрузить плагин;
- Щелчком левой кнопки мыши выделить строчку с названием экспортера и, нажав правую кнопку, вывести меню, в котором выбрать пункт Selected Plug-in/Load. Зеленая точка в графе Status указывает на то, что плагин подключен, и можно приступать к работе.
Для просмотра моделей в игровом формате необходимо:
- Поместить файл WinVG.exe в папку с моделями (в игре это каталог установки Периметра\resource\models\main\);
- Запустить exe-файл;
- После запуска выбрать пункт меню File->Set effect directory и указать путь: каталог установки Периметра \RESOURCE\FX\;
- Просматривать файлы можно, открывая их через пункт меню File->Open или, выбирая модели в списке в правой части экрана;
- Повернуть модель в экране просмотра можно, зажав левую клавишу мыши и перемещая мышь. Перемещать модель в экране просмотра можно, зажав правую клавишу мыши, и перемещая мышь.
Экспортирование модели в игровой формат
Изменив модель в 3Ds Max 5, необходимо сохранить ее для использования в игре:
- Выбрать пункт меню File/Export;
- В окне сохранения выбрать тип файла M3D ver2.0 (*.M3D);
- Нажать кнопку Save;
- В появившемся окне Export Scene to .M3D File необходимо указать информацию об анимации (если она используется). Для этого необходимо нажать кнопку Add и заполнить поля:
- Name - имя анимационной цепочки
- start frame - номер первого кадра анимационной цепочки (для первой 0)
- finish frame - номер последнего кадра анимационной цепочки
- number frame - количество кадров анимации, чем больше, тем точнее. Не имеет смысл ставить цифру больше чем (finish-start).
- precision vertex - минимальное число, при котором цепочка считается константной. (Скорее всего никогда не придется менять его.)
- bump scale - влияет на рельефность бамп текстуры.
При создании модели следует обратить внимание чтобы в ней были те же самые ноды group* и logic* с аналогичной иерархией. В зданиях так-же должен быть объект _base_.
Если вы хотите изменить игровую модель, вы можете произвести экспорт в файл модели с заменой. При экспорте с заменой нет надобности указывать Name, start frame, finish frame, number frame, эти параметры будут заполнены автоматически.
Текстуры
В версии игры 3+ появилась возможность вместо bump map использовать Normal map. Для этого нужно Положить рядом с bump текстуру, приписав к ней _normal. Приоритет загрузки: _normal используется, если существует, иначе _bump, если существует.
Анимация моделей
Периметр - система анимации
v1.0 / 21.03.2006
Анимация юнита задаётся в виде графа, связями между узлами в нём являются анимационные цепочки. Сами узлы обозначают начало и конец цепочек. У зацикленных цепочек начало и конец совпадает. При запросе какой-либо цепочки по графу ищется путь до её начала от текущего положения (конец включённой в данный момент цепочки), затем цепочки согласно этому пути переключаются.
Кроме цепочки, из кода может быть запрошен и просто узел графа, работает это аналогично запросу цепочки.
Список цепочек:
идентификатор | значение | тип |
---|---|---|
CHAIN_SWITCH_ON | включение | общие |
CHAIN_SWITCHED_ON | включено | общие |
CHAIN_SWITCH_OFF | выключение | общие |
CHAIN_SWITCHED_OFF | выключено | общие |
CHAIN_UPGRADE_PREPARE | подготовка апгрейда | общие |
CHAIN_UPGRADE | апгрейд | общие |
CHAIN_BUILD[N] | этап строительства | здания |
CHAIN_UNBUILD[N] | деконструкция этапа строительства | здания |
CHAIN_CLOSED | закрыто | общие |
CHAIN_OPEN | открытие | общие |
CHAIN_OPENED | открыто | общие |
CHAIN_CLOSE | закрытие | общие |
CHAIN_FIRE | стрельба | оружие |
CHAIN_FIRE_PREPARE | подготовка к стрельбе | оружие |
CHAIN_RESET | сброс | оружие |
CHAIN_CHARGE | зарядка | общие |
CHAIN_CHARGED | заряжено | общие |
CHAIN_DISCHARGE | разрядка | общие |
CHAIN_DISCHARGED | разряжено | общие |
CHAIN_DETACHED | фрейм отсоединён от энергосистемы | фреймы |
CHAIN_ATTACHED | фрейм подсоединён к эренгосистеме | фреймы |
CHAIN_DETACH | отсоединение | фреймы |
CHAIN_ATTACH | присоединение | фреймы |
CHAIN_DETACHED_INPUT | заезд в отсоединённый фрейм | фреймы |
CHAIN_DETACHED_OUTPUT | выезд из отсоединённого фрейма | фреймы |
CHAIN_ATTACHED_OUTPUT | выезд из присоединённого фрейма | фреймы |
CHAIN_ATTACHED_INPUT | заезд в присоединённый фрейм | фреймы |
CHAIN_PRODUCTION | производство | заводы |
CHAIN_DIE | смерть | общие |
CHAIN_MOVE | движение | юниты |
CHAIN_STOP | остановка | юниты |
CHAIN_TAKEOFF | взлёт | лётные |
CHAIN_LANDING | посадка | лётные |
Значение и тип довольно условны, часть цепочек напрямую из кода не используется, идентификаторы в этом случае не принципиальны и нужны только для наглядности.
Используемые из кода цепочки обозначены серым.
Список узлов:
идентификатор узла | значение |
---|---|
CHAIN_NODE_SWITCHED_ON | включено |
CHAIN_NODE_SWITCHED_OFF | выключено |
CHAIN_NODE_OPENED | открыто |
CHAIN_NODE_CLOSED | закрыто |
CHAIN_NODE_UPGRADE_START | начало апгрейда |
CHAIN_NODE_BUILD[N] | этап строительства |
CHAIN_NODE_CHARGED | заряжено |
CHAIN_NODE_DISCHARGED | разряжено |
CHAIN_NODE_FIRE | стрельба |
CHAIN_NODE_DETACHED | отсоединено от энергосистемы |
CHAIN_NODE_ATTACHED | присоединено к энергосистеме |
CHAIN_NODE_DETACHED_OPENED | отсоединено от энергосистемы / открыто |
CHAIN_NODE_ATTACHED_OPENED | присоединено к энергосистеме / открыто |
CHAIN_NODE_DEAD | смерть |
CHAIN_NODE_GROUND | юнит на земле |
CHAIN_NODE_FLIGHT | юнит в воздухе |
CHAIN_NODE_UNDERGROUND | юнит под землёй |
Используемые из кода узлы обозначены серым, это делается только у фреймов и ядер/трансмиттеров.
Для обычных юнитов при движении включается CHAIN_MOVE, при остановке – CHAIN_STOP. Подземным юнитам под землёй тоже включается CHAIN_STOP.
Зданиям при строительстве включается CHAIN_BUILD[N], в построенном сотоянии – CHAIN_SWITCHED_ON. Есть исключения – фреймы, ядра/трансмиттеры, порталы анимируются по-своему, см. в коде. Заводам при производстве включается CHAIN_PRODUCTION, по окончании производства – CHAIN_OPEN.
Скверна анимируется по-своему, в зависимости от типа, см. в коде.
Для боевых юнитов стрельба визуализируеттся в отджельной анимационной группе, если в оружии установлен флаг WEAPON_HAS_FIRE_CONTROLLER или в корневой анимационной группе, если установлен флаг WEAPON_ROOT_FIRE_ANIMATION. При стрельбе включается CHAIN_FIRE, по окончании стрельбы - CHAIN_SWITCHED_OFF. Если надо визуализировать зарядку оружия (установлен флаг WEAPON_NEED_CHARGE), то во время зарядки включается CHAIN_PRODUCTION.
Хранится анимация в AttributeLibrary, “Описание анимации”. Цепочки там объединены в анимационные группы, для независимой анимации частей объекта.
идентификатор группы | значение |
---|---|
ANIMATION_GROUP_ROOT | корневая группа, для основной анимации |
ANIMATION_GROUP_CITY | фрейм – анимация города |
ANIMATION_GROUP_PILLAR | фрейм – анимация колонн |
ANIMATION_GROUP_ANIMATE | фрейм – анимация для оживления в подключенном состоянии |
ANIMATION_GROUP_LIGHTING | ядра – источник света на колонне |
ANIMATION_GROUP_CHARGING | ядра – визуализация зарядки |
ANIMATION_GROUP_FIRE | оружие – отдельная группа для визуализации стрельбы |
Редактируемые параметры цепочки:
параметр | значение |
---|---|
chainID | идентификатор цепочки |
chainName | имя цепочки в 3D модели |
phase | начальная фаза цепочки, [0, 1]. Для цепочек, проигрываемых в обратном направлении ставить 1, для обычных 0 |
period | длительность цепочки, мс. Для цепочек, проигрываемых в обратном направлении ставить отрицательную |
begin | идентификатор начала цепочки |
end | идентификатор конца цепочки |
periodDeviation | разброс длительности, если ненулевой, то period += rnd(perionDeviation), phase = rnd(1) |
enableReverse | если = 1, то при запросе обратной по отношению к текущей цепочки (т.е. у них одинаковые начало и конец, но разное напревление) переход на неё происходит сразу (сделано исключительно для корректного отображения зарядки у ядер) |
counter | служебные данные |
soundID | идентификатор звукового события, привязанного к цепочке |
Подключение готовой модели в игру
Для интеграции модели в игру необходимо:
- Положить текстуру в каталог установки Периметра \resource\models\main\textures;
- Дополнительно положить текстуру в каталог расы:
- каталог установки Периметра \resource\models\main\Empire - для Империи
- каталог установки Периметра \resource\models\main\Exodus - для Исхода
- каталог установки Периметра \resource\models\main\Harkbackhood - для Возврата
- Поместить в каталог установки периметра\resource\models\main файлы *.m3d (модели) и *.l3d (набор логики).
Текстуры могут иметь любой размер. Можно добавлять свои, дополнительные текстуры. Текстур обычно две RGB текстура и текстура микрорельефа – Bump. Normal Mapping не поддерживается.
Требования к моделям
При создании модели следует четко придерживаться иерархии сцены, с которой можно ознакомиться в прилагаемых примерах. Обязательно наличие объектов group* и logic* с аналогичной иерархией. В зданиях также должен быть объект _base_. Иерархия строится на основе привязок (в 3Ds Max 5 на главной панели слева третий значок “Select and Link” ) Dummy объектов и мешей модели. Правильную иерархию можно посмотреть не только в прилагаемых к Золотому Изданию игры исходных моделях, а так же в программе для просмотра моделей WinVG.exe. Логика иерархии прописана в коде игры, поэтому следует четко придерживаться иерархии. Каждый элемент под названием Group, это Dummy в 3DsMax с тем же названием. Иерархия древовидная.
Ограничения по анимации - не поддерживается скелетная анимация и морфинг, можно только двигать, вращать, масштабировать объект целиком (масштабировать можно по всем или по одной оси).
Кроме этого, есть анимация прозрачности материала, координат материала и видимость-невидимость. Можно использовать и анимировать источники света “Omni” и некоторые его параметры.
Спецификация формата моделей и логики
(скачать m3dl3d.docx: drive dropbox) (автор - @!!ex)
Статья по модификации моделей (автор GREM)
{Итак, я все же собрался ее написать. Только не судите строго, а если
чего неправильно - критикуйте.}
Будем рассматривать пример Лимо, так как он мной лучше всего изучен.
Допустим, что у вас уже есть какая-то модель, осталось только затекстурировать и вставить в игру. И тут я обнаружил первое ограничение - можно нанести карту только на весь объект (в 3д максовском смысле, то что в одном габаритном контейнере) сразу, на части наносить разные карты нельзя, хотя проекций можно использовать много. Всякие карты отражений и рельефности надо включать в один материал. Далее, те участки модели, которые будут изменять цвет в зависимомти от вашего выбора (в сражениях или сетевой игре цвет можно выбрать, я про него говорю) надо вынести в отдельные объектs. А вот как этот объект отделить от остальных, чтоб он действовал, я пока не знаю, но это связано с материалом.
С текстурами у меня все...
Теперь как организовать анимацию...
Чтоб модель вообще работала, нужно насоздавать объектов dummy со следующими именами и привязаны друг к другу они должны быть так (тут же я укажу и привязку модели к логическим объектам, обозначение:
"обект 1" > "объект 2" > "объект 4"
:
> "объект 3"
означает: объект 4 зависит от объекта 2, который зависит в свою очередь от объекта 1, обеъкт 3 также непосредственно зависит от объекта 1):
logic center > logic bashnia > logic dulo > logic fire > logic targeting a > logic targeting b
> logic bound {это простой бокс, охватывающий всю модель}
Теперь объекты, управляющие моделью:
group center > group bashnia > group dulo > group fire > omni01 {источник света, который нужен для вспышки лазера}
: : :
: : > group targeting a > group targeting b
: : :
: : > [имя ствола]
: :
: > [имя башни лимо]
:
> [имя корпуса лимо]
Рекомендую логические объекты с названиями, отличающимися только словами logic и group создавать в одних и тех же координатах.
Надо отметить, что корпус, или башня, или ствол могут состоять из нескольких частей, тогда все части прицепляются либо друг к другу, либо "параллельно".
Что бы всышка лазера была, я объект omni01 копировал просто из оригинальной модели, я ее вам тоже дам.
И еще тонкость: чтоб ствол вращался в правильном направлении, group dulo надо повернуть на 180 в любую сторону.
Анимацию лучше оставить какая была, для этого сохраняем оригинальные файлы limo.m3d и limo.l3d куда нибудь в безопасное место, а свою работу сохраняем повер старых (как сохранить вы должны знать, если у вас есть плагин meshexp.dle). Старая анимация отобразится при сохранении в диалоге экспорта.