Динамическая модель определяется иерархией «костей» (скелет), одним или несколькими мешами, которые соответствуют этому скелету и анимацией, принадлежащей этому комплекту. Иерархия «костей», меши и анимация создаются в 3DS Max. Чтобы использовать такую модель в ZenGin архивах (двоичная форма представления данных в Готике) необходимо экспортировать данные из 3DS Max в *.ASC файлы. Эти файлы собираются в папке Gothic\_work\data\Anims для дальнейшего использования.
Далее, иерархия «костей», меши и анимация регистрируются в файлах сценария модели (MDS) для определения прототипа модели. Движок Готики читает MDS файл и конвертирует указанные в нём экспортированные из 3DS Max ASC файлы во внутреннее представление. Спецификация MDS файлов рассматривается в следующей главе.
При создании иерархии «костей», мешей и анимации, которые должны экспортироваться в движок Готики, нужно обращать внимание на следующие особенности:
1. В ASC файлах, которые используются для модели, узлы иерархии модели должны быть правильно названы.
Следующее названия приведут к ошибкам:
2. Начальная часть имени узла указывает, как этот узел должен использоваться. Имя каждого узла должно начинаться с одной из этих приставок, иначе он будет проигнорирован.
3. Масштабирование во время анимации не разрешено.
4. Единственные виды объектов, которые учитываются, являются объектами геометрии и вспомогательными объектами. Оба эти вида объектов обрабатываются одинаково.
5. Анимации частичного тела:
Узлы, относительно которых производится перемещение «костей» обозначаются словом FIX или FIXSUB. Первое фиксирует только этот узел, второе относится ко всем исходящим от этого подузлам. Это относится только к BIP01 или ZS_ узлам.
Примеры имен узлов:
3DS Max ASCII Exporter используется как для экспортирования геометрии меша, так и анимации. Геометрия и анимация могут экспортироваться только в отдельные ASC файлы. Иерархия «костей» экспортируется в каждый файл.
Следующие установки нужно активировать как при экспорте меша, так и анимации:
Следующие установки активируются только при экспорте меша:
Следующие установки активируются только при экспорте анимации:
Файл сценария модели имеет примерно следующую структуру:
Model ("Player") { meshAndTree ("Hum_Body_Naked0.ASC" DONT_USE_MESH) registerMesh ("Hum_Body_Naked0.ASC") registerMesh ("Hum_Body_CookSmith.ASC") aniEnum { modelTag ("DEF_HIT_LIMB" "zs_RightHand") ani ("s_stand" 1 "s_stand" 0.5 0.5 M. "stand_pause2.asc" F 0 -1) ani ("t_strafe_l" 1 "s_stand" 0.1 0.1 M. "Strafe_Left.asc" F 0 -1) aniBlend ("t_stand_2_run" "s_run") aniSync ("t_run_2_walk" "s_walk") aniAlias ("t_strafe_r" 1 "s_stand" 0.1 0.1 M. "t_strafe_l" R) aniBatch ("t_1h_slash1") { *aniBatch ("t_1h_slash1_top") *aniBatch ("t_1h_slash1_bot") } ani ("t_1h_shield_ready" 5 "" 0.2 0.2 .. "shield_ready.asc" F 0 -1) { *eventSwapMesh(13 "zs_Shield" "zs_LeftArm") } ... } }
Рассмотрим эти разделы:
meshAndTree (ASC_NAME [DONT_USE_MESH])
Параметр ASC_NAME указывает ASC файл, который содержит как полный скелет модели в нейтральной позе, так и её меш. При экспорте из 3DS Max указывается что должен содержать экспортируемый файл.
В качестве второго параметра опционально может использоваться ключевое слово DONT_USE_MESH. Если этот параметр используется, то каждая новая инстанция модели в игре производится без меша. Этот режим используется в моделях людей и монстров, так как для них могут использоваться различные меши, причем выбор меша осуществляется в скриптах. Если, каждая произведенная инстанция модели должна иметь всегда один и тот же меш, то второй параметр указывать не нужно. Меш в данном случае возьмется из файла, который упомянут как первый параметр в конструкции meshAndTree.
registerMesh (ASC_NAME)
Если в модели используются различные меши (например, броня / одежда людей), они должны объявляться командой registerMesh. Параметром ASC_NAME команды является ASC файл, который содержит регистрируемый меш вместе со скелетом.
Перечисление фаз анимации. Имеется несколько возможностей определения анимации, однако, логически в игре различий между ними нет.
Пример:
ani ("s_stand" 1 "s_stand" 0.5 0.5 M. "pause.asc" F 0 -1)
Синтаксис:
ani (ANI_NAME LAYER NEXT_ANI BLEND_IN BLEND_OUT FLAGS ASC_NAME ANI_DIR START_FRAME END_FRAME)
В частности:
ANI_NAME
Имя фазы анимации. Фазы анимации делятся на различные группы, причем принадлежность к определённой группе определяется префиксом имени фазы:
LAYER
Слой анимации (от 1 до 9999999).
Существует следующее правило: Одновременно в одном слое может проигрываться только одна анимация. Анимации из разных слоев могут проигрываться одновременно. При этом считается, что слой с более высоким номером имеет более высокий приоритет и покрывает анимацию с меньшим номером слоя.
NEXT_ANI
Фаза анимации, которая должна проигрываться после окончания текущей фазы. Фазы состояния имеют приставку имени s_, т.е. в этом случае ANI_NAME равняется NEXT_ANI. Фазы перехода имеют приставку имени t_, т. е. в этом случае ANI_NAME должно иметь приставку t_, а NEXT_ANI должно иметь приставку s_. Случайные фазы анимации в качестве NEXT_ANI имеют пустую строку »».
BLEND_IN
Время в секундах, в течении которого композиция анимации возрастает с 0% до 100%. Например: При BLEND_IN = 0.75 секунд имеем следующее: при t = 0sec (запуск анимации во фрейме 0) композиция 0%, при t = 0.5 композиция 66%, при t = .75 композиция 100%, при t = 1 композиция 100%.
BLEND_OUT
Время в секундах, в течении которого композиция анимации убывает от 100% (или текущего значения) до 0%. Нужно отметить, что убывание композиции начинается после проигрывания последнего фрейма анимации.
FLAGS
Поле флага является строкой, в которой каждый флаг представлен буквой. Если флаги не установлены, строка должна состоять из точки ».». Лишние точки во флаге пропускаются.
Флаги имеют следующие значения:
ASC_NAME
Имя 3DS Max ASC файла.
ANI_DIR
Направление, в котором должна проигрываться определенная фаза анимации. Возможные значения: R - обратное, F - прямое.
START_FRAME / END_FRAME
Начальный и конечный фрейм фазы анимации. Значение -1 говорит, что проигрываются все фреймы до конца, как задано ASC файлом.
Пример:
aniAlias ("t_strafe_r" 1 "s_stand" 0.1 0.1 M. "t_strafe_l" R)
Синтаксис:
aniAlias (ANI_NAME LAYER NEXT_ANI BLEND_IN BLEND_OUT FLAGS ALIAS_NAME ANI_DIR)
Команда aniAlias определяет фазу анимации, которая уже создана и используется, но может быть применена с другими параметрами. Пример: ani «t_strafe_l», aniAlias «t_strafe_r» - эти две фазы анимацию различаются только параметром ANI_DIR, конечно и имена у них разные.
ALIAS_NAME
Имя фазы анимации от которой произведена переопределённая фаза анимации.
Пример:
aniBlend ( "t_stand_2_run" "s_run" )
Синтаксис:
aniBlend (ANI_NAME NEXT_ANI BLEND_IN BLEND_OUT)
Команда aniBlend определяет фазу анимации перехода между анимациями. Для этой фазы анимации ASC файла не существует, в ней происходит только интерполяционный переход к следующей фазе анимации. Значения BLEND_IN и BLEND_OUT аналогичны рассмотренным в команде ani.
NEXT_ANI
Имя следующей фазы анимации, в которую должен быть выполнен плавный переход.
Пример:
aniSync ( "t_run_2_walk" "s_walk" )
Синтаксис:
aniSync (ANI_NAME NEXT_ANI)
Эта команда похожа на команду aniBlend, только NEXT_ANI начинается не с фрейма 0, а относительно состояния анимации этого слоя.
Пример: ani «s_walk», aniSync «t_walk_2_run», ani «s_run». Здесь является активной фаза анимации s_walk в слое 1 и она проиграна на 45%. Затем выполняется фаза t_walk_2_run, в которой осуществляется переход на фазу s_run, причем не с фрейма 0, а с 45% длины всех фреймов. Таким образом разные движения можно склеить одно с другим без нарушения общей логики движения (в примере переход с шага на бег). Но в этом случае, склеиваемые анимации должны логически стыковаться одна с другой, например, шаг и бег должны начинаться с одной ноги.
Пример:
aniBatch ("t_1h_slash1") { *aniBatch ("t_1h_slash1_top") *aniBatch ("t_1h_slash1_bot") } Синтаксис: aniBatch (ANI_NAME) { *aniBatch (BATCH_ANI_NAME) [...] }
С помощью этой команды можно преобразовать несколько фаз анимации к одной фазе анимации (максимальное значение 4). Если запускается фаза t_1h_slash1 (см. пример выше), то движок Готики запускает обе внутренние фазы анимации t_1h_slash1_top» и «t_1h_slash1_bot одновременно. Может использоваться для разделения фаз анимаций верхней и нижней частей туловища человека.
Пример:
ani ("c_bow_1" 4 "" 0.1 0.1 .. "bow_shoot.asc" F 41 41) ani ("c_bow_2" 4 "" 0.1 0.1 .. "bow_shoot.asc" F 43 43) ani ("c_bow_3" 4 "" 0.1 0.1 .. "bow_shoot.asc" F 47 47) ani ("c_bow_4" 4 "" 0.1 0.1 .. "bow_shoot.asc" F 49 49) aniComb ("s_bow_aim" 1 "s_bow_aim" 0.1 0.1 M. "c_bow_" 4)
Синтаксис:
aniComb (ANI_NAME LAYER NEXT_ANI BLEND_IN BLEND_OUT FLAGS ASC_NAME NUM_ANI)
Эта команда представляет фазу анимации, которая происходит от интерполяции нескольких фаз анимации с равным количеством фреймов. Последним параметром этой фазы анимации *NUM_ANI* является количество предшествующих фаз анимации ani.
Пример:
aniMaxFPS (12.5)
Синтаксис:
aniMaxFPS (FPS_VALUE)
Команда aniMaxFPS задает максимальную скорость кадров фазы анимации (frame rate). Параметр FPS_VALUE – это число с плавающей точкой.
Пример:
aniDisable ("t_perception")
Синтаксис:
aniDisable (ANI_NAME)
Команда aniDisable запрещает проигрывание фазы анимации с именем ANI_NAME по какому либо событию, например, нажатие клавиши и т.д..
Блок событий фазы анимации опционален и следует сразу за фазой анимации ani. Событие - это определенное действие, которое запускается во время проигрывания фазы анимации в определённом фрейме или фреймах.
Пример:
{ *eventSwapMesh (-1 "zs_LongSword" "zs_RightHand") *eventSound (10 "step.wav" 1.0) ... }
Обрабатываются следующие события:
*eventSwapMesh (FrameNumber "узел_1" "узел_2")
Во фрейме FrameNumber производится перестановка мешей на указанных узлах.
*eventPFX (FrameNumber [pfxHandle] "pfxName" "nodeName" [ATTACH])
Запускает эффект частиц с именем «pfxName» во фрейме FrameNumber. Этот эффект может быть привязан к узлу с именем «nodeName» модели. Однако, узел может и не указываться. Если в качестве имени узла используется пустая строка » », то эффект относится к узлу BIP01 модели. Опциональный параметр ATTACH определяет, должен ли источник эффекта быть в узле только при запуске, или же он должен быть привязан к узлу на время жизни всего эффекта. Возможны следующие состояния:
Опционально можно указать обработчик pfxHandle для запущенного эффекта частиц. Обработчик указывается, если эффект частиц является неограниченным во времени и он отключается событием *eventPFXStop. В событии выключения эффекта как раз и указывается этот обработчик, он представляет из себя целое положительное число.
*eventPFXStop (FrameNumber pfxHandle)
Это событие останавливает ранее запущенный эффект частиц с указанием выбранного при запуске обработчика pfxHandle в нужном фрейме FrameNumber.
*eventSFX(FrameNumber "sfxName" [R:x] [EMPTY_SLOT])
Это событие запускает звуковой эффект. «sfxName» является либо именем звуковой инстанции скриптов, либо именем Wave файла (расширение .wav не указывается), который начинает проигрываться с фрейма FrameNumber. Если дальность слышимости звука должна отличаться от установленной по умолчанию, то её можно задать параметром R:х, где х - дальность слышимости в см. Все запущенные звуковые эффекты модели по умолчанию занимают один звуковой канал, так называемый слот. Запуск нового звукового эффекта отменяет текущий эффект. Если звуковой эффект запустить с параметром EMPTY_SLOT, то под него будет выбран следующий свободный слот и текущий эффект не будет прерван.
*eventSFXGrnd (FrameNumber "sfxName" [R:x] [EMPTY_SLOT])
Это событие запускает звуковой эффект. «sfxName» является именем звуковой инстанции скриптов, которое дополнено именем материала. Остальные параметры аналогичны рассмотренным выше.
*evenMMStartAni (FrameNumber "aniName" ["nodeName"] [I:intensity] [H:holdTime])
Это событие запускает анимационный визуальный эффект (MorphMesh) начиная с фрейма FrameNumber, который находится на узле с именем «nodeName» и с анимацией «aniName». Если параметр «nodeName» не указан, то анимация запускается по умолчанию на узле BIP01 HEAD (анимация лица). Могут быть указаны параметры интенсивности intensity (0..1..?) и(или) времени удержания holdtime (в sec) анимации, если эти параметры в MMS файле не устраивают.
*eventCamTremor (FrameNumber floatRange floatDuration floatMinAmplifier floatMaxAmplifier)
Это событие запускает эффект землетрясения (дрожание камеры) во фрейме FrameNumber, остальные float параметры определяют эффект землетрясения.
Следует обращать внимание на следующие особенности:
Автор статьи - Vam.