> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-zh/3d-jian-mo-yu-dong-hua/animations.md).

# 动画

学习如何创建可嵌入到导入 Decentraland 的 3D 模型中的动画。

动画是赋予事物生命的艺术。而让你的场景更生动的最佳方式之一，就是给你的 3D 模型添加一些动画。

{% hint style="info" %}
**💡 提示**：安装 [Decentraland Tools Blender 插件](https://extensions.blender.org/add-ons/decentraland-tools/)。它包含一些实用功能，可帮助你编辑和导出 3D 模型、可穿戴物品和表情动作。
{% endhint %}

实现它有几种方法：通过 **对象动画**，通过 **绑定骨架（骨骼动画）**，或使用 **形态键（变形目标动画）**.

**对象动画** 最适合简单模型，例如弹跳的球、旋转的地球仪或漂浮的椅子，而且它不需要骨架。需要说明的是，对象动画不同于 **顶点动画**。在对象动画中，模型会作为一个整体进行动画，而在顶点动画中，对象的每个顶点都可以分别动画。

**形态键（也称为变形目标或混合形状）** 是一种顶点动画形式， **被 Decentraland 引擎支持**。它们尤其适用于面部表情、口型同步，或任何仅靠骨骼难以实现的变形。嵌入 glTF/GLB 文件中的形态键动画将在世界中播放，就像骨骼动画或对象动画一样。

如果你的模型更复杂，例如人物、生物或机械，那么你就需要一个 **骨架**。骨架本质上就是一个数字骨骼，它会移动并变形网格。将网格绑定到骨骼上的过程称为蒙皮，在这个过程中，你要定义每个骨骼会影响哪些顶点组，以及这种影响的强度有多大，从而确保模型以尽可能好的方式变形。

不过，无论使用哪种方法，3D 模型的所有动画都必须嵌入到它 *glTF* 文件中，因为你不能引用单独文件中的动画。

## 创建动画

下面介绍如何使用 Blender 创建动画。

### 对象动画

* 确保你已经打开 ***Dope Sheet（关键帧表）*** > ***动作编辑器*** 选项卡，并点击 ***新建*** 来添加一个动画片段。
* 按你的需要重命名，并确保切换 ***伪用户*** （盾牌图标），这样你的动画才会被保存。
* 通过选择对象并按下 ***I***。然后移动对象、旋转或缩放它，并在时间轴的另一帧中，再按下 ***I*** 再次按下以使用当前变换设置另一个关键帧。
* 动画的最后一帧应与第一帧相同，所以只需复制第一帧并粘贴到最后一帧。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-efdf5b9c23ab8b9fe1c9dba379a9f19927fca580%2F01_object_animation_02.gif?alt=media\&token=36d8ed74-3fa5-4df8-bef2-fe2d6b265396)

*创建动画片段并添加关键帧。*

### 骨架动画

对于骨架动画，你需要一个骨架。如果你想自己制作，请参阅 [创建骨架](https://www.notion.so/686e6f59a1604585b059f990a36b2d55) ，了解如何设置一致的骨架。

当绑定完成且蒙皮能够产生良好的变形后，你就可以开始制作动画了！这个过程与对象动画非常相似，但不是在 ***对象模式***&#x4E2D;进行，而是在 ***Pose Mode***.

* 前往 ***Pose Mode*** 并确保你已经打开 ***Dope Sheet（关键帧表）*** > ***动作编辑器*** 选项卡，并点击 ***新建*** 来添加一个动画片段。
* 按你的需要重命名，并确保切换 ***伪用户*** （盾牌图标），这样你的动画才会被保存。
* 将鼠标放在 ***视口***，按下 ***一个*** 以全选，然后按下 ***I*** 为整个骨架设置关键帧。
* 移动到时间轴中的另一个帧，并按你想要的方式操控骨骼，以获得你想要的姿势。根据你设置骨架的方式，你可以更改骨骼的位置、旋转和缩放。
* 当你得到满意的结果后，再为整个骨架设置另一个关键帧。一直这样做，直到完成动画。记住，如果动画要循环，第一帧和最后一帧要保持相同。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-56d38d4203ef345849a93c8bfe86ec7c517342cd%2F02_rig_animation_02.gif?alt=media\&token=c8df4f01-b0a7-402a-9a98-12df37364547)

如果你是动画制作的新手，看看这个教程，其中有一些适合初学者的实用技巧：

[![Video Preview](https://img.youtube.com/vi/-iWslh4uQIk/maxresdefault.jpg)](https://youtu.be/-iWslh4uQIk)

## 蒙皮动画与变换动画

**就性能而言，变换动画通常比蒙皮网格动画更好，因为它在显示动画所需的计算资源方面开销更小。**

蒙皮网格动画涉及使用一个带有骨骼骨架的网格，这些骨骼会加权到网格的顶点。骨骼会被动画化，进而让网格动起来。这个过程计算量可能相当大，尤其是在需要动画化的顶点数量很多时。

另一方面，变换动画是直接对对象的变换属性（例如位置、旋转和缩放）进行动画处理。与蒙皮网格动画相比，这可以使用更少的计算资源，因为通常需要动画化的变换属性比网格中的顶点要少。

此外，变换动画通常可以预先计算并以更紧凑的格式存储，例如关键帧数据，这样可以快速访问和回放，而无需在实时中进行大量计算。

总体而言，虽然蒙皮网格动画可以产生更细致、更逼真的动画，但在视频游戏等性能关键型应用中，通常更偏向使用变换动画。

## 创建并导出多个动画片段

你的模型可以拥有任意多个动画片段。你可以在 [此处这一节](https://www.notion.so/5e962e5d54a24bcb9b906748007eb4cc).

中了解如何从 Blender 中将多个动画导出到单个 GLB 文件。

[![Video Preview](https://img.youtube.com/vi/YxAB4bujO_w/maxresdefault.jpg)](https://www.youtube.com/watch?v=YxAB4bujO_w\&ab_channel=Decentraland)

## 将多个动画导出为一个动画

不同于骨骼动画，在骨骼动画中你可以绑定多个对象并将它们的动画合并到一个动画片段中；在对象动画中你做不到这一点。动画会被分别导出，并且一次只能播放一个对象。一个解决办法是把多个动画合并成一个，这样你就会得到一个包含所有对象同时运动的动画片段。

为此，将 ***非线性动画轨道*** 中每个对象的动画向下推送，如下所示。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-202a85c0ab83178cd4cab88cd54cea29d5741928%2F03_object_animation_push_down_02.gif?alt=media\&token=aa794d1f-2457-4b80-9533-db1aa11f5d72)

*将每个对象的动画推送到 NLA 轨道。*

一旦所有动画都列在 NLA 编辑器中，选择所有对象，前往 **文件 > 导出 > glTF2.0**。展开 Include 并勾选 Selected Objects。展开 Animation，再展开 Animation，然后取消勾选 **按 NLA 轨道分组**。你可以在 Merged Animation Name 中重命名动画片段，然后只需按下 **导出 glTF 2.0**.

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-07d1d6ede0e3413282e94383abfc8f51cedfc722%2F04_export_single_animation_clip.png?alt=media\&token=a13e6ca7-62e0-48f0-be63-1351fc82de04)

*设置即可将多个动画导出为一个。*

请记住，只有当对象各自只有一个动画时，这才有效。如果对象有多个动画片段，最好分别导出它们。

{% hint style="info" %}
**💡 提示**：与其自己创建动画，你也可以下载通用动画并将其应用到你的模型上。例如，对于具有类似人类特征的 3D 角色，你可以从 [Mixamo](https://www.mixamo.com/#/).
{% endhint %}

## 采样

下载免费或付费动画。

采样是优化动画的好方法。采样率决定动画中关键帧烘焙的频率。例如，如果采样率设为 2，就表示每 2 帧创建一个关键帧。采样率为 3 时，每 3 帧烘焙一个关键帧，依此类推。采样率越高，文件越轻。

不过，缺点是，由于动画数量或动画+模型的组合，动画文件可能最终过于庞大。 **然而，其缺点是动画会变得越来越不流畅，因为它会丢失一些重要的关键帧（这些关键帧在动画中是以不均匀的方式分布的）。还要注意的是**.

通常， **2 或 3 的采样率** 就足够了。这些数值可以在不影响质量的情况下优化动画。

你可以找到 ***采样率*** 在导出设置中，位于 ***动画***.

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-5bb9203e0a74492dfa68b1c7d3596c39baf62f95%2F05_sampling_rate.png?alt=media\&token=0c7dc5e2-3450-4508-ad0f-113626418059)

{% hint style="info" %}
**💡 提示**：如果动画的帧数能被采样率整除，那是好事！这意味着最后一帧会被烘焙，从而保留动画从结束到开始的过渡。
{% endhint %}

## 实现动画

本文档介绍如何将动画添加到 3D 模型中。请参阅 [**处理动画**](https://docs.decentraland.org/creator/development-guide/3d-model-animations/) ，了解如何在场景中启用和处理动画。

## 动画最佳实践

* 尽量保持骨架尽可能简单，只为你打算动画化的模型部分创建骨骼。骨骼会影响性能，所以只添加真正必要的部分。
* 如果动画要在你的场景中循环，请确保最终姿势与初始姿势完全一致，以获得更好的过渡效果。
* 永远不要让角色没有动画，即使它们实际上什么也没做。为角色静止时创建一个“待机”动画。待机动画可以包含诸如呼吸之类的细微动作，也许偶尔还会有一些目光转动。
* 不要让手、手指、头或脖子之类的骨骼处于未摆姿势的状态。细节在好的动画中非常重要，而僵硬的动作只会让它更不可信。
* 除非绝对必要，否则避免过多关键帧。你添加的关键帧越多，出现不良插值以及动画变得更重的可能性就越高。
* 选中所有骨骼（包括变形骨骼），并在动画的第一帧和最后一帧设置关键帧。这样可以避免某些骨骼没有信息，从而导致一个动画无意中影响另一个动画。
* 导出时请确保文件中只有一个骨架。导入动画时，骨架也会随之导入。所有动画都必须由同一个基础骨架来执行，所以请删除任何不需要的内容。
* 始终重命名你的骨骼和动画。保持一切井然有序！
* 在导出 *glTF* 模型时，确认你导出了所有对象和动画。有些导出器默认只会导出 ***当前所选内容*** 。
* 导出模型后，在 [Babylon Sandbox](https://sandbox.babylonjs.com/) 中检查所有动画是否正常工作，以及名称是否符合预期。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/creator/content-creator-zh/3d-jian-mo-yu-dong-hua/animations.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
