你可以使用 虚幻引擎 的 变形器图(Deformer Graph) 插件创建和编辑变形器图资产,从而为虚幻引擎中的所有蒙皮网格体执行和自定义网格体变形。你可以使用变形图表创建和修改逻辑来调整网格体几何形状,从而微调网格体变形行为,或者在虚幻引擎内创建全新的变形。变形器图最常用于微调角色的皮肤和织物在运动中的逼真行为,或者用于一次性动画,因为使用变形逻辑比手工制作动画更容易创建这类动画。

网格体变形器形式多样,比如变形目标、布料模拟,甚至还有在机器学习(ML)变形器等外部DCC(数字内容创建)软件中创建的生成模型。
本文档简要介绍虚幻引擎中的变形器图系统。
如何使用变形器图
你可以在此处了解如何在虚幻引擎中设置并开始使用变形器图。
先决条件
- 启用 变形器图(Deformer Graph) 插件。在 菜单栏 中找到 编辑(Edit)> 插件(Plugins) 并找到 动画(Animation) 分段中的 变形器图(Deformer Graph) ,或使用 搜索栏 完成此操作。启用插件并重启编辑器。

创建变形器图资产
通过在 内容浏览器(Content Browser) 中 右键点击 并找到 动画(Animation) > 变形器(Deformers) > 变形器图(Deformer Graph) 来创建 变形器图(Deformer Graph) 资产。

如果在视口中选择了网格体,则你还可以在 细节(Details) 面板中找到 网格体变形器(Mesh Deformer) 属性, 启用网格体变形器属性,然后从选择菜单中选择 变形器图(Deformer Graph) 选项来创建新的变形器图(Deformer Graph)。

以下默认变形器图资产与变形器图插件一起打包,供你在为角色和对象创建自定义网格体变形器逻辑时使用或自定义。在内容浏览器(Content Browser)中,找到 引擎(Engine)> 插件(PlugIns)> 变形器图内容(Deformer Graph Content)> 变形器(Deformers) ,即可访问这些变形器图。

资产 | 说明 |
---|---|
DG_LinearBlendSkin | 此图表应用标准线性混合蒙皮管线。系统支持所有蒙皮特性使用此图表。 |
DG_LinearBlendSkin_Morph | 此图表应用标准线性混合蒙皮和变形目标管线。系统支持这些管线的所有特性使用此图表。 |
DG_LinearBlendSkin_Morph_Cloth | 此图表应用标准线性混合蒙皮、变形目标和布料模拟(管线。系统支持这些管线的所有特性使用此图表。此图表是 DG_LinearBlendSkin和DG_LinearBlendSkin_Morph 变形器图的超集,可用来替代这些图表而不会造成性能损失。较简单的变形器图资产 DG_LinearBlendSkin 和 DG_LinearBlendSkin_Morph 单独存在,供想要自行构建实现的人参考。 |
DG_LinearBlendSkin_Morph_Cloth_RecomputeNormals | 此图表应用标准线性混合蒙皮、变形目标和布料模拟管线。它还应用额外的通道来重新计算顶点法线。它可以使用重新计算切线(Recompute Tangents)设置来模拟GPU皮肤缓存(GPU Skin Cache)的现有行为。 |
在网格体的细节面板中选择变形器图时,如果你没有看到 Engine 文件夹,或者没有看到默认变形器图作为可用选项,请确保你在 内容浏览器(Content Browser) 的 视图设置(View Settings) 中启用了 插件内容(Plugin Content) 。

有关创建和使用变形器图资产的更多信息,请参阅如何创建自定义变形器图指南。
打开变形器图
启用 变形器图插件(Deformer Graph Plugin) 后,你可以 双击 内容浏览器(Content Browser) 中的变形器图资产,或在游戏对象 细节(Details) 面板的 网格体变形器(Mesh Deformer) 属性中双击,打开 变形器图编辑器(Deformer Graph Editor) 。

变形器图界面
以下参考所适用的变形器图界面,在你创建和编辑自定义变形器图资产时,可用于在虚幻引擎中将网格体变形。

界面 | 说明 |
---|---|
1. 编译(Compile) | 编译变形器图。 |
2. 视口(Viewport) | 查看变形器图逻辑对网格体的影响。 |
3. 控制板(Palette) | 包含唯一变形器图蓝图节点的工具箱。 |
4. 资源管理器(Explorer) | 添加和管理变形器图子图表、组件绑定、变量和资源。 |
5. 图表编辑器(Graph Editor) | 与其他 蓝图编辑器(Blueprint Editor) 类似,使用一系列唯一变形器图节点管理和编辑变形器图逻辑。 |
6. 编译输出(Compile Output) | 在变形器图编译成功和失败后,查看编译器日志和信息。 |
7. 细节(Details) | 访问特定于组件和节点的信息和属性。 |
8. 着色器文本编辑器(Shader Text Editor) | 用于使用 高级着色器语言(HLSL)修改 自定义计算内核(Custom Compute Kernel) 节点编程的文本编辑器。 |
控制板面板
你可以使用变形器图的 控制板(Palette) ,拖放自定义变形器图节点和内核,供你在创建网格体变形逻辑时引用或使用。

有关控制板面板中可用组件的完整列表和说明,请参阅本文件底部的控制板组件参考列表。
变形器图子图表
在变形器图内,你可以使用3种类型的 子图表(Subgraph) 。

默认情况下,变形器图只包含每帧执行一次的 更新图表(Update Graph) 。
你可以选择性地添加 设置图表(SetUp Graph) ,以在所属对象 初始化 时执行。
此外,你还可以创建和使用 触发图表(Trigger Graph) ,并且可以应蓝图或C++代码的请求执行这些图表。收到执行触发图表的请求时,系统会将它们排队并执行,其顺序位于初始设置图表(若存在) 之后 ,且位于每帧更新图表 之前 。
你可以为变形器图添加子图表,方法是点击资源管理器(Explorer)面板的 图表(Graphs) 分段旁边的 添加(Add)(+),或者点击资源管理器(Explorer)面板顶部的绿色(+)新增(Add New) 按钮。点击任一项后,你可以从下拉菜单中选择创建 设置图表(Setup Graph) 或 触发图表(Trigger Graph) 。

变形器图中无法添加额外的更新图表,并且只能添加一个设置图表。你可以根据项目需要添加多个触发图表。然后,可以重命名触发图表,方法是在 资源管理器(Explorer) 面板中 双击 所需触发图表的名称,或者选择触发图表并按 F2 键。
组件绑定
组件绑定(Component Bindings)是对包含在所属对象中的可用组件的引用。

你可以为变形器图创建额外的组件绑定,方法是点击 资源管理器(Explorer)面板 的 组件绑定(Component Bindings) 分段旁边的 添加(Add)(+),或者点击 资源管理器(Explorer) 面板顶部的绿色(+)新增(Add New) 按钮。

下面是一些组件绑定的示例,你可以在创建变形器图逻辑时使用这些绑定:
组件绑定 | 说明 |
---|---|
骨骼网格体组件(Skeletal Mesh Component) | 添加对所属对象的 骨骼网格体(Skeletal Mesh) 组件的引用。可以使用骨骼网格体引用许多属性和组件,如 网格体顶点(Mesh Vertices) 、 三角形(Triangles) 和 场景时间(Scene Time) 。 |
场景组件(Scene Component) | 场景(Scene) 组件会从变形器图占据的 场景 、角色或主题中提取数据和信息。游戏时间以及其他有用信息可从场景组件中提取。 场景信息也可以从骨骼网格体或蒙皮网格体组件绑定中收集,但在特定情况下,使用单独的场景组件绑定可能对控制或组织有帮助。 |
蒙皮网格体组件(Skinned Mesh Component) | 蒙皮网格体组件可以代表任何类型的蒙皮网格体。此组件可以是附加到角色的辅助对象,也可以代表没有骨骼的角色或对象。 |
变量
在 资源管理器(Explorer)选项卡 的 变量(Variables) 分段,你可以创建和管理外部可见变量,供你在变形器图中调整和控制逻辑时引用。

你可以创建变量,方法是点击 资源管理器(Explorer) 面板的 变量(Variables) 分段旁边的 添加(Add)(+),或者点击 资源管理器(Explorer) 面板顶部的绿色(+)新增(Add New) 按钮。

创建新变量后,你可以在资源管理器(Explorer)面板中选择该变量,在细节面板中打开它的属性。

在细节面板中,你可以使用 变量名称(Variable Name) 属性命名变量,并定义其 数据类型(Data Type) 。可为变量分配任何数据类型或组件,以供与其他变形器图节点一起使用。
资源
与变量类似,你可以在资源管理器(Explorer)面板的 资源(Resources) 分段中创建和管理 着色器资源(Shader Resources) 。资源是对特定值和组件的内部引用,变形器图内的其他节点可以通过引用这些值和组件来执行网格体变形功能。

你可以创建资源,方法是点击 资源管理器(Explorer) 面板的 资源(Resources) 分段旁边的 添加(Add)(+),或者点击 资源管理器(Explorer) 面板顶部的绿色(+)新增(Add New) 按钮。

创建资源后,你可以在资源管理器(Explorer)选项卡中选择它,在细节面板中打开其属性。

你可以调整以下资源参数:
属性 | 说明 |
---|---|
资源名称(Resource Name) | 在提供的字段中为资源命名。 |
数据类型(Data Type) | 设置资源可以存储的数据类型。 |
组件绑定(Component Binding) | 设置资源绑定到的组件绑定。 |
数据域(Data Domain) | 设置资源的数据域。 在第一个下拉菜单中,你可以选择维度。你可以从以下维度中进行选择:
当维度设置为三角形(Triangle)或顶点(Vertex)时,你可以额外指定每个条目应存储多少个数据值。从 x1 开始,对于每个条目的一个数据点,你还可以从 x3 、 x4 或 x8 中选择。 数据点不仅在维度上必须匹配,而且在每个条目存在的数据值数量上也必须匹配。如果你在变形器图逻辑中遇到输入/输出引脚不兼容或资源无响应的情况,请确保你的 数据域(Data Domain) 属性设置为兼容值。 |
与变量不同,你可以在变形器图内 设置 以及 引用 资源值和组件。创建资源后,你可以将资源 拖放 到变形器图编辑器中,并从 获取(Get)实例(用于引用资源中包含的现有值)、设置(Set) 实例(用于设置或定义供以后使用的资源)或 获取/设置(Get/Set) 实例(可用于对存储值执行设置和引用两种操作)中进行选择。

在创建 获取/设置资源(Get/Set Resource) 、 获取资源(Get Resource) 或 设置资源(Set Resource) 节点后,你可以修改资源实例与 资源缓冲区 的交互方式。你可以定义这一行为,方法是在 图表(Graph) 中选择节点,并在节点的 细节(Details) 面板中设置 写入类型(Write Type) 属性。

你可以从以下写入类型属性选项中选择:
选项 | 说明 |
---|---|
写入(Write) | 将值写入资源缓冲区。 |
写入原子性添加(Write Atomic Add) | 用图表值覆盖资源缓冲区中的值。 |
写入原子性最小值(Write Atomic Min) | 用图表 最小 值覆盖资源缓冲区中的值。 |
写入原子性最大值(Write Atomic Max) | 用图表 最大 值覆盖资源缓冲区中的值。 |
细节面板
变形器图细节(Deformer Graph Details) 面板将显示有关每个变形器图节点的信息和设置。要查看节点的属性,在图表编辑器中选择该节点后,细节面板即会显示其属性。

在选择内核节点(Kernel Node)时,可以添加和修改 输入(Input) 和 输出(Output) 绑定。
为了达到功能效果,输入和输出绑定必须与它们所连接的数据类型精确匹配。请确保所有内核输入(Kernel Input)或内核输出(Kernel Output)绑定都设置为与所需的连接值或提取值匹配。
着色器文本编辑器
你可以使用 着色器文本编辑器(Shader Text Editor) 对 自定义计算内核(Custom Compute Kernel) 节点编程, 以控制特定的网格体变形行为。

着色器文本编辑器使用 高级着色器语言(HLSL)对内核进行编程。
变形器图中每添加一个自定义计算内核,着色器文本编辑器面板中就会打开一个新的选项卡。
在自定义内核选项卡之间切换(convert:false)
在每个自定义计算内核(Custom Compute Kernel)选项卡内,你都可以访问节点的 声明(Declarations) ,它们是只读信息,表示图表编辑器对节点进行的修改,如添加的输入和输出绑定。
着色器文本编辑器的声明部分显示内核的hlsl声明(convert:false)
你还可以访问节点的 着色器文本(Shader Text) ,可以在其中编写自定义HLSL代码,用来创建网格体变形。
着色器文本编辑器的着色器文本部分显示内核的自定义hlsl编程(convert:false)
有关HLSL编码标准的更多信息,请参阅Microsoft高级着色器语言参考文档和编程指南。
有关使用着色器文本编辑器的工作流程示例,请参阅如何创建变形器图指南。
控制板组件参考
在本小节,你可以参考变形器图控制板(Palette) 中提供的可用组件及其功能说明的列表。

控制板组件 | 节点 | 说明 |
---|---|---|
动画属性(Animation Attributes) | alt text | 添加对动画属性(Animation Attributes)的引用,你可以利用它们来触发或激活变形器逻辑。 |
布料(Cloth) | ![]() |
添加并附加对与骨骼网格体关联的布料模拟模型的引用。更多信息请参阅布料模拟模型。 |
连接(Connectivity) | ![]() |
将蒙皮网格体组件连接到现有顶点或顶点数据集。 |
调试绘制(Debug Draw) | ![]() |
使用连接的蒙皮网格体组件绑定在视口中绘制网格体的调试视图。调试数据以 字符串 形式提取,可使用图表中的节点 输出 引脚进行访问。 细节面板中的选项包括:
|
变形目标(Morph Target) | ![]() |
通过使用蒙皮网格体组件,Morph Target节点可以将 增量位置(Delta Position) 和 增量法线(Delta Normal) 隔离为 向量3(Vector 3)** 值。 |
场景数据(Scene Data) | ![]() |
提取可用来控制或触发变形器图逻辑的场景数据。你可以创建 场景组件绑定,也可以使用 骨骼网格体组件绑定 来引用骨骼网格体在运行时占用的当前场景。 |
骨架(Skeleton) | ![]() |
从骨骼网格体组件绑定中提取骨架数据。可用的输出包括:
|
蒙皮网格体(Skinned Mesh) | ![]() |
从 蒙皮网格体(Skinned Mesh) 组件绑定中提取网格体数据。可用的输出包括:
|
自定义计算内核(Custom Compute Kernel) | ![]() |
创建 自定义计算内核(Custom Compute Kernel) ,可以使用 高级着色器语言(HLSL)对其编程,以执行自定义网格体变形。有关创建和使用自定义计算内核的更多信息,请参阅如何创建自定义变形器图指南。 |
执行蒙皮网格体(Execute Skinned Mesh) | ![]() |
你可以使用 蒙皮网格体(Skinned Mesh) 组件作为输入,执行供在 内核(Kernel) 中使用的网格体数据线程。在细节面板中,你可以将函数的 域(Domain) 设置为每个 顶点 用一个线程或每个 三角形 用一个线程运行内核。 Execute Skinned Mesh 节点将输出 IntVector 3 值,该值可与 自定义计算内核(Custom Compute Kernel) 连接并一起使用。要想仅隔离 X 、 Y 或 Z 轴上的输出数据,请使用输出引脚旁的 三角形 展开 输出 引脚。每个轴都有一个单独的 整型(Integer) 输出引脚。 |
编写蒙皮网格体(Write Skinned Mesh) | ![]() |
Write Skinned Mesh 输出节点是变形器图的最后操作,用于写入对网格体的 顶点 或 三角形 执行的修改。 蒙皮网格体(Skinned Mesh) 输入引脚将连接到初始网格体 组件绑定 。然后,可以使用向量3(Vector 3)位置(Position) 输入引脚,以及向量4(Vector 4)切线X(Tangent X) 、 切线Z(Tangent Z) 和 颜色(Color) 输入引脚,将新的网格体属性写入网格体。 |
布尔常量(Bool Constant) | ![]() |
设置常量 布尔 值。节点可以接受布尔变量值,你也可以使用 值(Value) 属性在图表中或在节点的 细节(Details) 面板中手动切换布尔值。 |
组件常量(Component Constant) | ![]() |
使用组件绑定设置 组件常量 。可以在图表中设置组件常量,或者使用节点 细节(Details) 面板中的 值(Value) 属性手动定义组件常量。 |
浮点常量(Float Constant) | ![]() |
设置常量 浮点 值。节点可以接受来自其他组件的 浮点 值,你也可以在图表中或在节点的 细节(Details) 面板中手动设置值。 |
整型常量(Int Constant) | ![]() |
设置常量 有符号整型 值。节点可以接受来自其他组件的 零 和 正 整型值,你也可以在图表中或在节点的 细节(Details) 面板中手动设置值。 |
无符号整型常量(UInt Constant) | ![]() |
设置常量 无符号整型 值。节点可以接受来自其他组件的 任何 整型值,你也可以在图表中或在节点的 细节(Details) 面板中手动设置值。 |
双精度常量(Double Constant) | ![]() |
设置常量 双精度 值。节点可以接受来自其他组件的任何双精度值,你也可以在图表中或在节点的 细节(Details) 面板中手动设置值。 |
整型向量2常量(Int Vector 2 Constant) | ![]() |
在 X 和 Y 轴上设置常量 向量2(Vector 2) 值。节点可以接受来自其他组件的任何向量2值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 X 和 Y 整型值。你还可以使用输出引脚附近的三角形,将向量2值拆分成 X 和 Y 的整型值。 |
整型向量3常量(Int Vector 3 Constant) | ![]() |
在 X 、 Y 和 Z 轴上设置常量 向量3(Vector 3) 值。节点可以接受来自其他组件的任何向量3值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 X 、 Y 和 Z 整型值。你还可以使用输出引脚附近的三角形,将向量3值拆分成 X 、 Y 和 Z 值的整型值。 |
整型向量4常量(Int Vector 4 Constant) | ![]() |
在 X 、 Y 、 Z 和 W 轴上设置常量 向量4(Vector 4) 值。节点可以接受来自其他组件的任何向量4值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 X 、 Y 、 Z 和 W 整型值。你还可以使用输出引脚附近的三角形,将向量4值拆分成 X 、 Y 、 Z 和 W 值的整型值。 |
线性颜色常量(Linear Color Constant) | ![]() |
为存储为 浮点4 值的 R 、 G 、 B 和 A 值设置常量 颜色(Color) 值。节点可以接受来自其他组件的任何浮点4或颜色(Color)值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 R 、 G 、 B 和 A 浮点值。你还可以使用输出引脚附近的三角形,将颜色(Color)值拆分成单独的 R 、 G 、 B 和 A 值的浮点值。 |
四元常量(Quat Constant) | ![]() |
在 X 、 Y 、 Z 和 W 轴上设置常量 四元(Quat) 或 浮点4 值。节点可以接受来自其他组件的任何四元(Quat)或浮点4值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 X 、 Y 、 Z 和 W 浮点值。你还可以使用输出引脚附近的三角形,将四元(Quat)值拆分成单独的 X 、 Y 、 Z 和 W 值各自的浮点值。 |
旋转体常量(Rotator Constant) | ![]() |
在 X(俯仰[Pitch])、 Y(偏转[Yaw])和 Z(滚动[Roll])轴上设置常量 旋转体(Rotator) 或 浮点3 值。节点可以接受来自其他组件的任何旋转体(Rotator)或浮点3值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 俯仰(Pitch) 、 偏转(Yaw) 和 滚动(Roll) 值。你还可以使用输出引脚附近的三角形,将旋转体(Rotator)值拆分成 俯仰(Pitch) 、 偏转(Yaw) 和 滚动(Roll) 的浮点值。 |
变换常量(Transforms Constant) | ![]() |
设置常量 变换 值。节点可以接受来自其他组件的任何变换值,你也可以在节点的 细节(Details) 面板中手动设置 X 、 Y 和 Z 轴上的位置(Location)、旋转(Rotation)和缩放(Scale)值。 |
向量2常量( Vector 2 Constant) | ![]() |
在 X 、 Y 和 Z 轴上设置常量 向量2(Vector 2) 值。节点可以接受来自其他组件的任何向量2值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 X 、 Y 和 Z 浮点值。你还可以使用输出引脚附近的三角形,将向量2值拆分成 X 、 Y 和 Z 轴的浮点值。 |
向量3常量( Vector 3 Constant) | ![]() |
在 X 、 Y 和 Z 轴上设置常量 向量2(Vector 2) 值。节点可以接受来自其他组件的任何向量3值,你也可以使用三角形或在节点的 细节(Details) 面板中展开输入引脚,手动在图表中设置 X 、 Y 和 Z 浮点值。你还可以使用输出引脚附近的三角形,将向量3值拆分成 X 、 Y 和 Z 轴的浮点值。 |
向量4常量( Vector 4 Constant) | ![]() |
在 X 、 Y 、 Z 和 W 轴上设置常量 向量4(Vector 4) 值。节点可以接受来自其他组件的任何向量4值,你也可以使用三角形或在节点的细节面板中展开输入引脚,手动在图表中设置 X 、 Y 、 Z 和 W 浮点值。你还可以使用输出引脚附近的三角形,将向量4值拆分成 X 、 Y 、 Z 和 W 轴的浮点值。 |