• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Важно Динамическая модель (3DS Max, анимация и меши)

Статус
В этой теме нельзя размещать новые ответы.

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.172
Благодарности
6.153
Баллы
1.565
Динамическая модель

Динамическая модель определяется иерархией «костей» (скелет), одним или несколькими мешами, которые соответствуют этому скелету и анимацией, принадлежащей этому комплекту. Иерархия «костей», меши и анимация создаются в 3DS Max. Чтобы использовать такую модель в ZenGin архивах (двоичная форма представления данных в Готике) необходимо экспортировать данные из 3DS Max в *.ASC файлы. Эти файлы собираются в папке Gothic\_work\data\Anims для дальнейшего использования.
Далее, иерархия «костей», меши и анимация регистрируются в файлах сценария модели (MDS) для определения прототипа модели. Движок Готики читает MDS файл и конвертирует указанные в нём экспортированные из 3DS Max ASC файлы во внутреннее представление. Спецификация MDS файлов рассматривается в следующей главе.

Особенности создания

При создании иерархии «костей», мешей и анимации, которые должны экспортироваться в движок Готики, нужно обращать внимание на следующие особенности:
1. В ASC файлах, которые используются для модели, узлы иерархии модели должны быть правильно названы.
Следующее названия приведут к ошибкам:
  • Файл jump_up.asc содержит узел ZM_Hand_R
  • Файл jump_back.asc содержит узел ZM_HandR
2. Начальная часть имени узла указывает, как этот узел должен использоваться. Имя каждого узла должно начинаться с одной из этих приставок, иначе он будет проигнорирован.
  • BIP01: Меши, в которых встретится такой узел будут проигнорированы, однако, их анимация будет обработана.
  • ZM_: Это узлы меша. Только меши, состоящие из этих узлов экспортируются в движок Готики. Узлы этого типа должны всегда замыкаться на BIP01 узел. Анимация этих узлов игнорируется.
  • ZS_: Это слот-узлы. В этих узлах меши динамически связываются один с другим. Узлы этого типа должны всегда замыкаться на BIP01 узел. Анимация этих узлов обрабатывается.
3. Масштабирование во время анимации не разрешено.
4. Единственные виды объектов, которые учитываются, являются объектами геометрии и вспомогательными объектами. Оба эти вида объектов обрабатываются одинаково.
5. Анимации частичного тела:
Узлы, относительно которых производится перемещение «костей» обозначаются словом FIX или FIXSUB. Первое фиксирует только этот узел, второе относится ко всем исходящим от этого подузлам. Это относится только к BIP01 или ZS_ узлам.
Примеры имен узлов:
  • BIP01 Hals FIXSUB
  • ZS_RIGHTHAND FIX
3DS Max ASCII Exporter используется как для экспортирования геометрии меша, так и анимации. Геометрия и анимация могут экспортироваться только в отдельные ASC файлы. Иерархия «костей» экспортируется в каждый файл.
Следующие установки нужно активировать как при экспорте меша, так и анимации:
  • Object Types: Geometry
  • Static Output, Frame#: 0
  • Known Controllers: Sample
  • Frames per Sample: Controllers: 1
  • Frames per Sample: Animated Objects: 1
Следующие установки активируются только при экспорте меша:
  • Mesh Definition
  • Materials
  • Texture Coordinates
Следующие установки активируются только при экспорте анимации:
  • Transform Animation Keys
Формат MDS файла

Файл сценария модели имеет примерно следующую структуру:

Код:
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 файл, который содержит регистрируемый меш вместе со скелетом.
1.1 aniEnum

Перечисление фаз анимации. Имеется несколько возможностей определения анимации, однако, логически в игре различий между ними нет.
1.1.1 ani

Пример:
Код:
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
Имя фазы анимации. Фазы анимации делятся на различные группы, причем принадлежность к определённой группе определяется префиксом имени фазы:
  • s_: State-Ani (состояние анимации)
  • t_: Transition-Ani (переход состояния анимации)
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
Поле флага является строкой, в которой каждый флаг представлен буквой. Если флаги не установлены, строка должна состоять из точки ».». Лишние точки во флаге пропускаются.
Флаги имеют следующие значения:
  • М: Передвижение модели, которое задано в 3DS Max, передается при проигрывании визуальному объекту (Vob), в котором находится модель. Если этот флаг отсутствует, анимация не вызывает передвижения модели в игре.
  • R: Вращение модели, условия аналогичны флагу М.
  • E: Этот флаг говорит о том, что эта фаза анимации запустится только, когда активная в настоящее время фаза анимации достигнет последнего фрейма в том же самом слое и закончится. Рассмотрим следующий случай: ani «s_walk», ani «t_walk_2_stand», ani «s_stand», причем, для всех этих анимаций существуют ASC файлы. Здесь имеет смысл присвоить фазе анимации t_walk_2_stand флаг E. Так как эта фаза анимации имеет свой ASC файл, она должна точно стыковаться с предыдущей фазой анимации s_walk. Если флаг E будет отсутствовать, то запуск следующей фазы анимации t_walk_2_stand будет выполнен в игре сразу после отпускания клавиши передвижения, в результате непроигранные фреймы и BLEND_OUT фазы будут пропущены, что приведет к оборванности движения и будет некрасиво выглядеть. С флагом Е фаза анимации s_walk проиграется полностью и только затем запустится фаза перехода t_walk_2_stand в состояние остановки персонажа.
  • F: Если этот флаг установлен, позиция высоты модели не выравнивается относительно высоты земли, над которой модель находится. Должен устанавливаться для летающих объектов, которые не огибают поверхность земли.
  • I: Флаг простоя анимации (idle). Такая анимация незначительно перемещает модель и позволяет движку игры оптимизировать проигрывание этой фазы анимации. Пример: анимация человека, который спокойно стоит и дышит.
ASC_NAME
Имя 3DS Max ASC файла.
ANI_DIR
Направление, в котором должна проигрываться определенная фаза анимации. Возможные значения: R - обратное, F - прямое.
START_FRAME / END_FRAME
Начальный и конечный фрейм фазы анимации. Значение -1 говорит, что проигрываются все фреймы до конца, как задано ASC файлом.
1.1.2 aniAlias

Пример:
Код:
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
Имя фазы анимации от которой произведена переопределённая фаза анимации.
1.1.3 aniBlend

Пример:
Код:
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
Имя следующей фазы анимации, в которую должен быть выполнен плавный переход.
1.1.4 aniSync

Пример:
Код:
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% длины всех фреймов. Таким образом разные движения можно склеить одно с другим без нарушения общей логики движения (в примере переход с шага на бег). Но в этом случае, склеиваемые анимации должны логически стыковаться одна с другой, например, шаг и бег должны начинаться с одной ноги.
1.1.5 aniBatch

Пример:
Код:
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 одновременно. Может использоваться для разделения фаз анимаций верхней и нижней частей туловища человека.
1.1.6 aniComb

Пример:
Код:
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.
1.1.7 aniMaxFPS

Пример:
Код:
aniMaxFPS (12.5)
Синтаксис:
Код:
aniMaxFPS (FPS_VALUE)

Команда aniMaxFPS задает максимальную скорость кадров фазы анимации (frame rate). Параметр FPS_VALUE – это число с плавающей точкой.
1.1.8 aniDisable

Пример:
Код:
aniDisable ("t_perception")
Синтаксис:
Код:
aniDisable (ANI_NAME)

Команда aniDisable запрещает проигрывание фазы анимации с именем ANI_NAME по какому либо событию, например, нажатие клавиши и т.д..
1.1.9 Блок событий фазы анимации

Блок событий фазы анимации опционален и следует сразу за фазой анимации 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 определяет, должен ли источник эффекта быть в узле только при запуске, или же он должен быть привязан к узлу на время жизни всего эффекта. Возможны следующие состояния:
  • а) отсутствует NodeName, отсутствует ATTACH
  • б) присутствует NodeName, отсутствует ATTACH
  • с) присутствует NodeName, присутствует 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 параметры определяют эффект землетрясения.
  • floatRange – дальность в см от эпицентра, на которой появляется этот эффект.
  • floatDuration – время эффекта в мс.
  • floatMinAmplifier и floatMaxAmplifier – соответственно макс. и мин. амплитуда колебаний камеры.
1.2 Замечания

Следует обращать внимание на следующие особенности:
  • Имена любых файлов и фаз анимаций не должны содердать пробелов.
  • *events в блоке событий фазы анимации должны быть отсортированы в порядке возрастания FrameNumber.
  • При больших по амплитуде анимациях хотелось бы, чтобы персонаж в случае столкновения с объектами отчетливо от них отделялся, однако при незначительных по амплитуде анимациях хотелось бы переместить персонаж как можно ближе к объекту. Решение состоит в том, чтобы ввести анимацию второй категории. В MDS файле для такой анимации можно указать CVS:хх фактор (CollisionVolumeScale), который по умолчанию, как и FPS:хх фактор, равняется 1. Установка его значения, например, на 0.5 или 0.1 уменьшила бы объем, занимаемый фазой анимации и персонаж смог бы быть приближен к объекту. Фазы анимации, для которых может использоваться этот параметр, являются статическими, например, труп персонажа, сидящий или спящий персонаж.
Автор статьи - Vam.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу