> 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/chuan-dai-wu-yu-biao-qing/biao-qing/creating-emotes.md).

# 创建表情动作

创建 Decentraland 表情的提示与指南。

本文档将介绍文件规格、Blender 中动画的基础知识、正确导出表情动作（Emote）的方法，以及如何将其导入 Builder。

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

#### 动画规范表

| 帧率        | 30 fps             |
| --------- | ------------------ |
| 最大时长      | 10 秒（300 帧）        |
| 每个文件的动画数量 | 1                  |
| 导出格式      | .glb               |
| 采样率       | 默认 1（如有需要可用 2 或 3） |
| 最大文件大小    | 1 MB               |
| 最大动画距离    | 1 米（前/后、左/右）       |
| 最大动画高度    | 4 米                |

你可以在下方找到对动画规范更详细的说明 [**下方**](#the-animation-specifications).

### **资源**

本文档介绍 Rig 1.0 的设置、控制器以及功能。

[Decentraland Blender 骨架](https://github.com/decentraland/docs/blob/main/creator/images/emotes/Avatar_File.blend)

{% hint style="info" %}
如果你使用 Maya，可以下载这个 [Maya 骨架](https://github.com/decentraland/docs/blob/main/images/emotes/DCL_Maya_Rig.ma) 和 [选择器](https://github.com/decentraland/docs/blob/main/images/emotes/emoteAvatar.pkr) 由……提供 [SparkleStudios](https://www.sparkles.studio/) ❤️。
{% endhint %}

## **开始前**

### **帧率**

在开始之前，检查帧率很重要。Decentraland 的动画必须使用 30 fps 的帧率。提供的骨架文件里很可能已经设置好了，但由于 Blender 的默认值是 24 fps，最好在开始前再确认一次（错误的帧率会影响动画速度）。该选项可以在 Output Properties（打印机图标）中的 Format 下找到，如下所示：

![开始前请确保帧率设置为 30 fps。](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/framerate.png)

开始前请确保帧率设置为 30 fps。

### **姿态模式**

在 Blender 中，骨架可以在三种不同模式下查看：Object Mode、Edit Mode 和 Pose Mode。动画只能在 Pose Mode 中制作（在该模式下，控制器会显示颜色）。选中骨架后，你会在右上角的下拉菜单中找到该选项。

![切换到 Pose Mode。](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/changing_pose_mode.gif)

切换到 Pose Mode。

### **动画界面**

在骨架文件中，除了视图窗口的两个窗口（正视图和侧视图）外，底部还有三个窗口：一个 ***曲线编辑器***, ***一个摄影表***，以及一个 ***时间轴***.

* ***曲线编辑器***：在这个编辑器中，可以编辑所选控制器的每个变换属性的动画曲线。这些曲线显示了插值是如何计算的，并且可以通过编辑它们来实现动画中想要的效果。在这里以及在摄影表中，都会启用 ***仅显示所选*** 工具，这意味着它只会包含与所选控制器相关的通道。点击箭头图标即可切换启用或关闭。
* ***摄影表***：在这里你可以编辑关键帧。你也可以在这里创建新动画或浏览已创建的多个动画。请记住，要访问动画，必须选中 ***动作编辑器*** 。该选项就在 *摄影表* 图标旁的下拉菜单中。
* ***时间轴***：这里可以找到时间轴和播放控制。在这里， ***自动关键帧*** 处于开启状态，这意味着每次操作控制器时都会自动创建关键帧。你可以随时点击播放控制旁边的圆点来关闭该功能。

有了这个工作区，你就拥有开始制作动画所需的一切！

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-2d729d156ebf035dc72696c43a7ffd4d5e5ec5c0%2Fworkspace.png?alt=media)

这些是底部窗口。上面的窗口是 ***曲线编辑器，*** 中间的窗口是 ***摄影表，*** 而最下面的是 ***时间轴。*** 上方红色箭头表示 ***仅显示所选*** 工具，下面的箭头表示 ***自动关键帧***.

{% hint style="info" %}
**💡 提示！**

由于 Blender 可高度自定义，现在也是设置最适合你的布局的好时机，可以添加、调整或移除窗口。每个动画师都有自己的偏好，所以请随意按你想要的方式编辑布局！
{% endhint %}

## 开始使用

#### **起始姿势**

在提供的骨架文件中，已经有一个动作， ***Starting\_Pose***。考虑到所有 avatar 动作都从待机姿势开始， **我们非常建议你从这个姿势开始制作动画，并在最后一帧再次使用它**。这样可以让从 Idle 到 Emote 的过渡更自然，动画也更流畅。

{% hint style="info" %}
**💡 提示！**

如果你想制作循环动画，就不必从起始姿势开始。请随意使用最适合你动画的姿势！\*\*
{% endhint %}

**动画区域**

在提供的 avatar 文件中，你会找到一个名为 ***Animation\_Area\_Reference***&#x7684;集合。它由三个对象组成，可直观地帮助你设置动画边界： ***Animation\_Area\_Reference***, ***Ground\_Reference*** 和 ***Root\_Animation\_Area***.

* Animation\_Area\_Reference 是一个 4x4 的立方体，即包围盒。avatar 网格和道具在整个动画过程中都应保持在这个区域内。只要始终保持在立方体区域内，道具可以自由移动。
* Ground\_Reference 是一个平面，用于帮助检查动画过程中是否出现穿地。它还包含重要信息：较小的圆直径为 2 米，定义了 avatar 根部可以移动的区域。这意味着，在地面上时，avatar 每个方向最多只能移动 1 米：前、后、左、右。
* Root\_Animation\_Area 是一个圆柱体，用于定义你可以移动 avatar 根部/重心（CTRL\_Avatar\_UpperBody 或 Avatar\_Hips）的区域。该圆柱体高 4 米，这意味着只要没有网格超出包围盒，根部就可以一直向上移动。avatar 的腿、手臂和其他身体部位可以超出圆柱体，只要它们不超出 Animation\_Area\_Reference。

![动画区域参考。](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a48e59343fbec3349689698c72254df70c4b8bca%2FAnimation_area.png?alt=media)

总之，只要根骨保持在圆柱体内，avatar 就可以向右、左、前和后移动，也就是四个方向各 1 米。

![avatar 移动。](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a62cdaaf09e00175618c07551c6ccefe70c6331f%2Favatar_movement.gif?alt=media)

至于高度，只要 avatar 保持在包围盒内，就可以一直向上移动（最大 4 米）。下面是一些做得正确的 avatar 高度示例（整个身体都在包围盒内）以及一些做得错误的示例（网格超出了包围盒）。

| ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-464566443d2a433e20fbd406280637a5e24919d1%2Fheight_right_1.png?alt=media) | ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-c2f9db3d3abc06ca18566ab68d18bfcf06dad1c9%2Fheight_right_2.png?alt=media) |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

| ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-0b3314df6e0c461f99c00b0b4161a948900372d1%2Fheight_right_3.png?alt=media) | ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-3beefb8916d995d729c17a88cfaa374a0ca9bc35%2Fheight_wrong_1.png?alt=media) |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-cdc730bf5a86baa0c44ad2736643add6bc066617%2Fheight_wrong_2.png?alt=media)

以下是一些位于动画区域边界内的 emote 示例。

| ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-cccc86deab269b8c471e963c1fd41e07266cf359%2Fwhack-a-frog.gif?alt=media) | ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b4e40c0e90247b1a4786f40a2ed3149d5976c85a%2Flove-grenade.gif?alt=media) |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

{% hint style="info" %}
**💡 注意！**

请留意这些边界，因为越界可能会导致游戏问题。
{% endhint %}

## **创建动画**

该 blend 文件中已有一个可供编辑的动画片段： *StartingPose\_Avatar*。你可以根据需要复制并重命名该动画片段。无需从头创建！

在 *浏览动作* 部分，只需点击 ***创建新动作*** 按钮即可复制当前动画。要重命名片段，只需点击文本并输入其他名称。

Blender 4.4 引入了 *槽位动作*，这是以前版本中 *浏览动作* 部分右侧的图标。如果你创建的是没有道具的 emote，就没必要去调整这个设置，可以保持原样。如果你在制作 avatar 动画，请确保槽位动作是 Avatar\_Animation。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-558ab224b6ac0639b6484a592e9cb1a14ee2c0fa%2Fduplicating_animation.gif?alt=media)

通过复制现有动画，或点击 ***解除关联动作*** 然后 ***新建***.

### **浏览和删除动画**

在 Blender 中，同一个文件里可以有多个动画轨道。你可以通过点击 Browse Action 下拉菜单来浏览它们。所有带有 F（Fake User）的动画都会被保存。要删除动画，请按住键盘上的 Shift 并点击 X。这样之后，动画旁边会显示一个 0，这意味着在你下次关闭 Blender 或重新打开文件时，它会被删除。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-cf5ab4ab85c3c5344d1bde1da1f0dc51dd797f96%2Fdeleting_animation.gif?alt=media)

浏览动画：带有 F 的会被保存，带有 0 的会被删除。

另一种无需重新加载 Blender 就能删除动画的方法，是将 Display Mode 从 View Layer 改为 Blender File。展开 Actions，然后右键点击任何不需要的动画并选择 Delete 即可删除。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b763cc4adab4c8f81a7c5d21babc91943b32d10a%2Fdeleting_animation2.gif?alt=media)

你可以在大纲视图的 Display Mode 下，直接从 Blender File 中删除动画。

{% hint style="info" %}
**💡 提示！**

不要总是编辑同一条动画轨道。在做重大修改之前，先复制动画。这样你就会有一个备份版本，以防你后悔删除或更改了某些内容。这也是一个记录当前进度的好方法！
{% endhint %}

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-558ab224b6ac0639b6484a592e9cb1a14ee2c0fa%2Fduplicating_animation2.gif?alt=media)

复制动画片段。

### **命名**

**动画名称应以大写字母开头，如果名称由多个单词组成，单词之间应使用 \_ 分隔。** 不要使用空格或特殊字符。以下是一些命名示例：

* Snowfall
* Rainbow\_Dance
* Throw\_Money
* Talk\_To\_Hand

### **Emote 覆盖**

当变形骨骼没有在某个参数上设置关键帧时，就会发生 Emote 覆盖。没有关键帧时，该骨骼就不会知道自己应该在什么位置、旋转了多少、缩放了多少，从而使该通道保持开放。结果就是，如果你在世界中播放一个 emote，然后在前一个 emote 仍在播放时触发自己的 emote，位置、旋转和缩放的信息就会被前一个 emote 覆盖，导致两者混合在一起。除非这是有意为之，否则它会影响你的动画，有时结果会很有趣，但有时会把 emote 搞得一团糟。下面是一个 emote 覆盖的示例。

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-948a1c8627c2ee0c84f5c9fc27d4ad669ae8a715%2F01_emote_override.gif?alt=media)

为了避免这种情况，请选择所有包含骨骼的图层（可在 ***对象数据属性*** > ***骨架*** > ***层***&#x4E2D;找到）。然后，在 ***姿态模式***&#x4E2D;，将时间轴光标停在动画的第一帧，并让鼠标位于 ***视口显示***&#x65F6;，按 ***一个*** 以全选。在 ***曲线编辑器***&#x4E2D;，双击 ***眼睛*** 图标旁的骨架通道图标，以使所有通道可见。选中所有骨骼后，按 ***I*** 来设置关键帧。最后一帧也同样操作。

**务必选择变形骨骼，这一点非常重要！** 变形骨骼位于最底部的最后一层，并在 ***视口***.

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a471e63b0f50b75e417fad7897d2d41b2626fa98%2Fkeyframe_bones.gif?alt=media) 在第一帧和最后一帧为所有骨骼设置关键帧，可防止 emote 覆盖。

## **动画规范**

### **动画时长**

动画的最大时长为 **10 秒** 或 **300 帧**。记得在第一帧和最后一帧为每个控制器的属性设置关键帧。

{% hint style="warning" %}
⚠️ 在 Graph Editor 中关闭可见性的通道不会被设置关键帧、删除，甚至不会在 Action Editor 中显示。除非这是有意这样做的，否则请特别注意可见性。
{% endhint %}

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-24b31b5701d0890c05da348141fa35138c3d0eaf%2Fchannel_visibility.gif?alt=media)

在设置关键帧前先使通道可见！

### **动画数量**

如果是标准 emote（没有道具），导出的文件只能包含一个动画。对于 emotes 2.0，你可以有一个给 avatar 的片段和一个给道具的片段。如果制作过程中复制过动画，请务必在导出前把它们全部删除，只保留最终版本。目前还不支持需要多个动画才能工作的顺序型 emote（动作开始、动作循环和动作结束）。

### **格式**

动画应导出为 .**GLB**。文件中只能包含变形骨架和动画。 **网格、控制器以及任何其他对象都不应导出**。有关如何导出的更多细节可见 [**下方**](#exporting).

### **采样**

由于约束无法导出，导出动画片段的唯一方法就是对其进行烘焙，也就是说，所有变形骨骼的位置、旋转和缩放都会在动画的每一帧中被设置关键帧。如果片段太长，比如最长 300 帧，那么导出后就会有 300 个关键帧，而且关键帧越多，文件就越大。

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

然而，其缺点是动画会变得越来越不流畅，因为它会丢失一些重要的关键帧（这些关键帧在动画中的分布并不均匀）。另外还要注意， **采样并不是把动画帧数除以采样率**.

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

{% hint style="info" %}
**💡 提示！**

如果动画的帧数可以被采样率整除，那就很好！这意味着最后一帧也会被烘焙，从而保留动画从结束到开始的过渡。
{% endhint %}

### **文件大小**

最大文件大小为 **3 MB**。如果导出后文件超过了这个大小，请检查是否不小心导出了网格，或者动画是否超过 10 秒。如果仍然超过 3 MB，请尝试调整采样率，因为更高的数值会提升优化效果。

如果 emote 包含任何额外的 3D 模型，这些模型中的纹理大小不能超过 1024 像素。

## **导出**

由于我们只希望导出骨架和动画，请在导出前关闭网格可见性以及除骨架之外的任何对象，如下所示：

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-6b440bf9c2ecf20222424f25f503f93c329b0f34%2Fmesh_visibility.gif?alt=media)

导出前关闭网格可见性！

要导出，请前往 *文件* > *导出* > *glTF2.0 (.glb, .gltf)*

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b8d83737f404def3627abe723ea26fc005fdafc6%2Fexport_gltf.gif?alt=media)

在导出设置中，展开 Include，在 Limit to 中勾选 Visible Objects。然后展开 Data 选项卡，再展开 Armature，并启用 Export Deformation Bones Only。

| ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b5ae77f9a0c99da2cb55a9cbeb8d3366a3ca7d40%2Fexport_settings.png?alt=media) | ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-7dedc999a0a6f4ca60fb4638efa3aec0dd39c39a%2Fexport_settings_GIF.gif?alt=media) |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

如果你需要对动画进行采样，展开 Animation 选项卡，再展开 Sampling Animations，并选择所需的采样数量。

| ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b2d89cdef462668dbd73d5eb427923fbe1946647%2Fsampling_rate.png?alt=media) | ![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-376c2e0af4cbe87e163d87e866314419d9946477%2Fsampling_rate_GIF.gif?alt=media) |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

动画导出就到这里！

## 参考

如果你还是不确定从哪里开始，或者需要一些参考或灵感，这里有一些动画片段可以帮助你。这些都可以作为很好的学习素材！

[Idle.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/idle.glb)

[Jump.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/jump.glb)

[Walk.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/walk.glb)

[Run.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/run.glb)

[Pose\_Jump.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/pose_jump.glb)

[Pose\_Spin.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/pose_spin.glb)

[Spotlight.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/spotlight.glb)

[Fashionista.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/fashionista.glb)

[Chic.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/chic.glb)

[Flag\_Emote.glb](https://github.com/decentraland/docs/blob/main/images/emotes/Flag_Emote.glb)

[Flag\_Emote.blend](https://github.com/decentraland/docs/blob/main/images/emotes/Flag_Emote_Final.blend)


---

# 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/chuan-dai-wu-yu-biao-qing/biao-qing/creating-emotes.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.
