> 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-he-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 创建动画。

### 对象动画

* 请确保你已打开 ***摄影表*** > ***动作编辑器*** 选项卡，并点击 ***新建*** 来添加一个动画片段。
* 按你的需要重命名，并确保切换 ***Fake User*** （盾牌图标），这样你的动画就会被保存。
* 先选中对象，并按 ***I***&#x5728;第一帧设置关键帧。然后移动对象，旋转或缩放它，再在时间轴的另一帧中按 ***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)

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

### 骨架动画

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

当绑定完成并且蒙皮变形效果良好后，你就可以开始动画了！这个过程与对象动画非常相似，但不是在 ***对象模式***&#x4E2D;进行，而是在 ***姿态模式***.

* 前往 ***姿态模式*** 并确保你已经打开了 ***摄影表*** > ***动作编辑器*** 选项卡，并点击 ***新建*** 来添加一个动画片段。
* 按你的需要重命名，并确保切换 ***Fake User*** （盾牌图标），这样你的动画就会被保存。
* 将鼠标放在 ***视口***&#x4E0A;，按 ***一个*** 全选，然后按 ***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)

如果你是动画制作的新手，可以看看这个包含一些实用技巧的新手教程：

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

## 蒙皮动画与变换动画

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

蒙皮网格动画是指使用带有骨骼骨架的网格，这些骨骼会对网格顶点进行权重绑定。骨架会被动画化，进而驱动网格动画。这个过程可能相当耗费计算资源，尤其是在需要动画化大量顶点时。

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

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

总体而言，虽然蒙皮网格动画可以产生更细致、更逼真的动画，但在诸如电子游戏这类对性能要求很高的应用中，变换动画通常更受青睐。

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

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

中查看如何创建、浏览和删除动画。

[![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)

*将每个对象的动画下推到 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)

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

请注意，这只有在每个对象只有一个动画时才有效。如果对象有多个动画片段，最好分别导出。

{% 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)

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

## 实现动画

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

## 动画最佳实践

* 尽可能保持骨架简单，只为你打算动画化的模型部件创建骨骼。骨骼会影响性能，所以请确保只添加真正必要的部分。
* 如果动画会在你的场景中循环播放，请确保最终姿势与起始姿势完全一致，以获得更好的过渡效果。
* 永远不要让角色没有动画，即使它们实际上什么也没做。为角色静止时创建一个“idle”动画。idle 动画可以包含一些细微动作，比如呼吸，也许还会偶尔看看别处。
* 不要让骨骼保持未摆姿势，比如手、手指、头或脖子。细节在优秀的动画中非常重要，僵硬的动作只会让它看起来更不真实。
* 避免使用过多关键帧，除非确有必要。你添加的关键帧越多，出现糟糕插值和更大动画文件的可能性就越高。
* 请选择所有骨骼（包括变形骨骼），并在动画的第一帧和最后一帧设置关键帧。这样可以避免出现没有信息的骨骼，从而导致一个动画无意中影响另一个动画。
* 导出时，请确保文件中只有一个骨架。在导入动画时，骨架也会一并导入。所有动画都必须由同一个基础骨架来执行，所以请删除任何你不需要的内容。
* 一定要给你的骨骼和动画重命名。保持一切井井有条！
* 导出 *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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
