Ретаргетинг 3D-скелетов

Для совместного использования анимаций несколькими Skeletons

В Godot есть 3D-треки положения/вращения/масштабирования (Position/Rotation/Scale) (которые в этом документе называются треками "Transform") с Nodepaths к костям для анимации костей Skeleton. Это означает, что вы не сможете использовать анимацию для нескольких скелетов, просто используя одинаковые имена костей.

Godot позволяет каждой кости иметь родительско-дочерние отношения и может иметь вращение, масштаб и положение, что означает, что кости, имеющие одинаковое имя, могут иметь разные значения Transform.

Skeleton сохраняет значения Transform, необходимые для позы по умолчанию, как Bone Rest. Если Bone Pose равен Bone Rest, это означает, что скелет находится в позе по умолчанию.

Примечание

В Godot 3.x и Godot 4.0+ поведение Bone Pose различается. В Godot 3.x Bone Pose определяется относительно Bone Rest, но в Godot 4.0+ он включает Bone Rest. См. эту статью.

Модели скелетов имеют разные опоры костей в зависимости от среды, из которой они были экспортированы. Например, для костей модели glTF, выведенной из Blender, в качестве "Edit Bone Orientation"(поворота опоры кости) выбран параметр «Bone Rest rotation». Однако существуют модели скелетов без Bone Rest rotations, например, модель glTF, выведенная из Maya.

Для обмена анимациями в Godot необходимо сопоставлять опоры костей и их названия, чтобы в некоторых случаях удалить нежелательные следы. В Godot 4.0+ это можно сделать с помощью импортера сцен.

Варианты Retargeting (ретаргетинга, перенаправление)

Bone Map (Карта костей)

При выборе узла Skeleton3D в расширенном меню импорта сцены справа появится меню с разделом "Retarget" (Переназначение). В разделе "Retarget" есть одно свойство — bone_map.

../../_images/retargeting1.webp

Выбрав узел «Skeleton», сначала настройте новые BoneMap и SkeletonProfile. В Godot есть предустановка SkeletonProfileHumanoid для гуманоидных моделей. В этом руководстве предполагается, что вы используете SkeletonProfileHumanoid.

Примечание

Если вам нужен профиль, отличный от SkeletonProfileHumanoid, вы можете экспортировать SkeletonProfile из редактора, выбрав Skeleton3D и используя меню Skeleton3D на панели инструментов 3D-окна просмотра.

При использовании SkeletonProfileHumanoid автоматическое сопоставление будет выполнено при установке SkeletonProfile. Если автоматическое сопоставление работает некорректно, можно сопоставить кости вручную.

../../_images/retargeting2.webp

Любые отсутствующие, дублирующиеся или некорректные сопоставления родительско-дочерних отношений будут обозначены пурпурной/красной кнопкой (в зависимости от настроек редактора). Это не блокирует процесс импорта, но предупреждает о том, что анимация может быть некорректно передана.

Примечание

Auto-mapping (автоматическое сопоставление) использует сопоставление названий костей по шаблону. Поэтому мы рекомендуем использовать распространённые английские названия костей.

После настройки bone_map в разделах ниже будут доступны несколько опций.

../../_images/retargeting3.webp

Remove Tracks (Удалить Треки)

Если вы импортируете ресурсы как AnimationLibrary, который будет использоваться совместно, мы рекомендуем включить эти параметры. Однако, если вы импортируете ресурсы как сцены, в некоторых случаях их следует отключить. Например, если вы импортируете персонажа с анимированными аксессуарами, эти параметры могут привести к тому, что аксессуары не будут анимированы.

Except Bone Transform (Кроме Bone Transform)

Удаляет из анимации все дорожки, кроме дорожки bone Transform (преобразования костей).

Unimportant Positions (Неважные позиции)

Removes Position tracks (удаляет треки положения) из анимации, кроме root_bone и scale_base_bone, определённые в SkeletonProfile. В SkeletonProfileHumanoid это означает, что нужно удалить все треки положения, кроме «Root» и «Hips». Начиная с Godot 4.0+, анимации включают Bone Rest в значение Transform. Если отключить эту опцию, анимация может непредсказуемо изменить форму тела.

Unmapped Bones (Неотображённые кости)

Удаляет неотображенные дорожки Transform (трансформации) костей из анимации.

Bone Renamer (Переименование костей)

Rename Bones (Переименовать Кости)

Переименовывает отображенные кости.

Unique Node (Уникальный узел)

Делает Skeleton уникальным узлом с именем, указанным в skeleton_name. Это позволяет унифицировать пути анимационных дорожек независимо от иерархии сцены.

Rest Fixer (Исправление покоя)

Справочные позы, определенные в SkeletonProfileHumanoid, имеют следующие правила:

  • Гуманоид находится в Т-позе

  • Гуманоид смотрит в сторону +Z в Правосторонней Системе Координат Y-UP (Right-Handed Y-UP Coordinate System)

  • Гуманоид не должен иметь Transform как Node

  • Направляет ось +Y от родительского сочленения к дочернему сочленению

  • Вращение по оси +X сгибает сустав подобно сокращению мышцы

Эти правила служат удобными определениями для смешанной анимации и обратной кинематики (Inverse Kinematics ) (IK). Если ваша модель не соответствует этому определению, необходимо исправить её с помощью этих опций.

Apply Node Transform (Apply Node Transform)

Если ассет экспортирован неправильно для публикации, импортированный скелет может содержать преобразование в качестве узла. Например, glTF, экспортированный из Blender без применения команды «Apply Transform», — один из таких случаев. Похоже, модель соответствует определению, но внутренние преобразования отличаются от определения. Этот параметр исправляет такие модели, применяя преобразования при импорте.

Примечание

Если импортированная сцена содержит объекты, отличные от скелетов, эта опция может иметь отрицательный эффект.

Normalize Position Tracks (Нормализация Положения Треков)

Трек положения используется в основном для перемещения модели, но совместное использование анимации движения между моделями разного роста может привести к эффекту проскальзывания из-за разницы в длине шага. Этот параметр нормализует значения трека Position (положения) на основе высоты scale_base_bone. Высота scale_base_bone сохраняется в скелете как motion_scale, и нормализованные значения трека Position умножаются на это значение при воспроизведении. Если этот параметр отключен, треки положения не нормализуются, и motion_scale скелета всегда импортируется как 1.0.

В SkeletonProfileHumanoid, scale_base_bone - это «Бедра», поэтому высота бедер используется как motion_scale.

Overwrite Axis (Перезаписать ось)

Унифицирует опоры костей моделей, перезаписывая их в соответствии с эталонными позами, определенными в SkeletonProfile.

Примечание

Это наиболее важная опция для совместного использования анимации в Godot 4.0+, но имейте в виду, что эта опция может привести к ужасным результатам **, если важен исходный внешний набор опор для костей **. Если вы хотите поделиться анимацией с сохранением оригинального кадра, подумайте о том, чтобы использовать "Модуль ретаргетинга в реальном времени <https://github.com/TokageItLab/realtime_retarget>`__.

Fix Silhouette (Исправить силуэт)

Пытается привести силуэт модели в соответствие с эталонными позами, определенными в SkeletonProfile, такими как T-поза. Это не позволяет исправить силуэты, которые слишком отличаются друг от друга, и может не сработать для фиксации изгиба костей.

При использовании SkeletonProfileHumanoid эту опцию не нужно включать для моделей в Т-позе, но её следует включать для моделей в А-позе. Однако в этом случае результаты исправления стопы могут быть неудовлетворительными в зависимости от высоты каблука модели, поэтому может потребоваться добавить названия костей SkeletonProfile, которые вы не хотите исправлять, в массив filter, как в примере ниже.

../../_images/retargeting4.webp

Кроме того, для моделей с согнутыми коленями или стопами может потребоваться корректировка высоты scale_base_bone. Для этого можно использовать параметр base_height_adjustment.