-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tutorials for blend animation and retargeting
- Loading branch information
1 parent
4297672
commit 6a66104
Showing
12 changed files
with
213 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
.. _doc_retargeting_3d_skeletons: | ||
|
||
Retargeting 3D Skeletons | ||
======================== | ||
|
||
To share animations among multiple Skeletons | ||
-------------------------------------------- | ||
|
||
Godot has Position/Rotation/Scale 3D tracks (hereafter called Transform tracks) | ||
with Nodepaths to bones for Skeleton bone animation. If you think that you can | ||
share animations between multiple Skeletons as long as the bone names are the | ||
same, that is not correct. | ||
|
||
Godot allows each bone to have a parent-child relationship and can have rotation | ||
and scale as well as position, which means that bones can have different Transform values. | ||
|
||
The Skeleton stores the Transform values necessary for the default pose as Bone Rest. | ||
If Bone Pose is equal to Bone Rest, it means that the Skeleton is in the default pose. | ||
|
||
.. note:: Godot 3.x and Godot 4.0+ have different Bone Pose behaviors. | ||
In Godot 3.x, Bone Pose is relative to Bone Rest, but in Godot 4.0+, | ||
it includes Bone Rest. See this `article <https://godotengine.org/article/animation-data-redesign-40>`__. | ||
|
||
Skeletal models have different Bone Rests depending on the environment from | ||
which they were exported. For example, the bones of a glTF model output from Blender | ||
have Edit Bone Orientation as the Bone Rest rotation. However, there are skeletal | ||
models without any Bone Rest rotations, such as the glTF model output from Maya. | ||
|
||
To share animations in Godot, it is necessary to match Bone Rests as well as Bone Names, | ||
moreover to remove unwanted tracks in some cases. In Godot 4.0+, you can do that using | ||
the scene importer. | ||
|
||
Options for Retargeting | ||
----------------------- | ||
|
||
Bone Map | ||
~~~~~~~~ | ||
|
||
When you select the Skeleton3D node on the scene importer, you can find the Retarget | ||
section on the inspector. | ||
|
||
.. image:: img/retargeting1.webp | ||
|
||
With the Skeleton node selected in the importer, first set up a new BoneMap and SkeletonProfile. | ||
Godot has a preset called SkeletonProfileHumanoid for humanoid models. | ||
This tutorial will proceed with the assumption that you will use SkeletonProfileHumanoid. | ||
|
||
.. note:: If you need a profile for a model such as a beast or creature, you can export | ||
a SkeletonProfile from SkeletonEditor with some information converted from Skeleton. | ||
|
||
When you use SkeletonProfileHumanoid, the auto-mapping will be performed when the | ||
SkeletonProfile is set. If the auto-mapping does not work well, you can map bones manually. | ||
|
||
.. image:: img/retargeting2.webp | ||
|
||
Any missing, duplicate or incorrect parent-child relationship mappings will be indicated | ||
by a magenta / red button (depending on the editor setting). It does not block the import process, | ||
but it warns that animations may not be shared correctly. | ||
|
||
.. note:: The auto-mapping uses pattern matching for the bone names. So we recommend | ||
to use common English names for bones. | ||
|
||
After you set up the BoneMap, several options are available in the sections below. | ||
|
||
.. image:: img/retargeting3.webp | ||
|
||
Remove Tracks | ||
~~~~~~~~~~~~~ | ||
|
||
If you import resources as an AnimationLibrary that will be shared, we recommend to enable these options. | ||
However, if you import resources as scenes, these should be disabled in some cases. | ||
For example, if you import a character with animated accessories, | ||
these options may cause the accessories to not animate. | ||
|
||
Except Bone Transform | ||
^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
Removes any tracks except the bone Transform track from the animations. | ||
|
||
Unimportant Positions | ||
^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
Removes Position tracks other than ``root_bone`` and ``scale_base_bone`` | ||
defined in SkeletonProfile from the animations. In SkeletonProfileHumanoid, | ||
this means that to remove Position tracks other than Root and Hips. | ||
Since Godot 4.0+, animations include Bone Rest in the transform value. If you disable this option, | ||
the animation may change the body shape unpredictably. | ||
|
||
Unmapped Bones | ||
^^^^^^^^^^^^^^ | ||
|
||
Removes unmapped bone transform tracks from the animations. | ||
|
||
Bone Renamer | ||
~~~~~~~~~~~~ | ||
|
||
Rename Bones | ||
^^^^^^^^^^^^ | ||
|
||
Rename the mapped bones. | ||
|
||
Unique Node | ||
^^^^^^^^^^^ | ||
|
||
Makes Skeleton a unique node with the name specified in the Skeleton Name. | ||
This allows the animation track paths to be unified independent of the scene hierarchy. | ||
|
||
Rest Fixer | ||
~~~~~~~~~~ | ||
|
||
Reference Poses defined in SkeletonProfileHumanoid have the following rules: | ||
|
||
* The humanoid is T-pose | ||
* The humanoid is facing +Z in the Right-Handed Y-UP Coordinate System | ||
* The humanoid should not have a transform as Node | ||
* Directs the +Y axis from the parent joint to the child joint | ||
* +X rotation bends the joint like a muscle contracting | ||
|
||
These rules are convenient definitions for blend animation and Inverse Kinematics (IK). | ||
If your model does not match this definition, you need to fix it with these options. | ||
|
||
Apply Node Transform | ||
^^^^^^^^^^^^^^^^^^^^ | ||
|
||
If the asset is not exported correctly for sharing, the imported Skeleton may have | ||
a transform as a Node. For example, a glTF exported from Blender with no Apply Transform | ||
executed is one such case. It looks like the model matches the definition, | ||
but the internal transforms are different from the definition. | ||
This option fixes such models by applying transforms on importer. | ||
|
||
.. note:: If the imported scene contains objects other than Skeletons, this option may have a bad effect. | ||
|
||
Normalize Position Tracks | ||
^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
Position track is used mostly for model movement, but sharing the moving animation | ||
between models with different heights may cause the appearance of slipping | ||
due to the difference in stride length. This option normalizes the Position track values | ||
based on the ``scale_base_bone`` height. The ``scale_base_bone`` height is stored in the Skeleton, | ||
and the normalized Position track values is multiplied by that value on playback. | ||
If this option is disabled, the Position tracks is not normalized | ||
and the Skeleton's ``motion_scale`` is always imported as ``1.0``. | ||
|
||
With SkeletonProfileHumanoid, ``scale_base_bone`` is Hips, therefore the Hips' height is used as the Motion Scale. | ||
|
||
Overwrite Axis | ||
^^^^^^^^^^^^^^ | ||
|
||
Unifies the models' Bone Rest by overwriting it to match the Reference Pose defined in the SkeletonProfile. | ||
|
||
.. note:: This is the most important option for sharing animations in Godot 4.0+, | ||
but be aware that this option can produce horrible results **if the original Bone Rest set externally is important**. | ||
If you want to share animations with keeping the original Bone Rest, | ||
consider to use the `Realtime Retarget Module <https://github.com/TokageItLab/realtime_retarget>`__. | ||
|
||
Fix Silhouette | ||
^^^^^^^^^^^^^^ | ||
|
||
Attempts to make the model's silhouette match that of the reference pose defined in the SkeletonProfile, | ||
such as T-Pose. This cannot fix silhouettes which are too different, and it may not work for fixing bone roll. | ||
|
||
With SkeletonProfileHumanoid, this option does not need to be enabled for T-pose models, | ||
but should be enabled for A-pose models. However in that case, the fixed foot results | ||
may be bad depending on the heel height of the model, so it may be necessary to add | ||
the SkeletonProfile bone names you do not want fixed in the Filter array, as in the below example. | ||
|
||
.. image:: img/retargeting4.webp | ||
|
||
Also, for models with bent knees or feet, it may be necessary to adjust the ``scale_base_bone`` height. | ||
For that, you can use Base Height Adjustment option. |