vertex_delta = mean_delta + (coeff* basis) + nearest_neighbor_delta
3.训练数据
3.1.训练设置
骨骼网格:这是要变形的骨骼资产。 训练输入动画:用作训练数据的动画列表 动画序列:这些是真实姿势。它们可以是随机创建的姿势序列。 几何缓存:其中包括在每个真实姿态上模拟的真实网格。您可以从 Alembic 文件中导入。 网络输入:这定义了网络的输入。一般是骨骼旋转。
一般情况下,您需要运行离线模拟,在几何缓存中生成地面实况数据。对于服装,您可以使用 Houdini Vellum 或 Chaos Cloth。 在模拟过程中,您需要对网格进行多帧模拟,直到网格停止移动。 通常在模拟过程中最好关闭重力(目前网络只将关节旋转作为输入,不考虑重力)。 使用随机创建的姿势,例如由 MLDeformer Maya 插件创建的姿势。请勿仅使用常规动画中的姿势,因为我们已经发现网络可能会过度拟合。 确保对每个关节的所有三个旋转维度进行采样。角度范围可以很小,但不能为 0。如果某些维度没有采样,网络就会变得过度拟合。 使用足够数量的姿势。我们建议使用 5000 个姿势,但越多越好。 检查顶点三角是否合理偏小。您可以通过查看 "训练基础 "网格上的绿线来检查顶点离差。顶点离差过大会导致训练效果不佳。
3.3.Alembic 导入设置
InputDim 和 OutputDim:表示网络中输入和输出的数量。引擎会自动更新这些值。 InputDim = num_joints * 3 OutputDim = sum(num_basis) 隐藏层数:该数组用于设置 "隐藏层 "的数量以及每层中 "神经元 "的数量。 这些数字应从 InputDim 逐步移动到 OutputDim。例如,如果输入是 63,输出是 256,那么隐藏层的维数就是 [64, 128]。 通常情况下,2-4 个隐藏层就足够了。 训练前,隐藏层不能为空。如果留空,编辑器会自动填充其值。 一般情况下,只要遵守上述规则,隐藏层的大小对最终结果的影响很小。否则(例如,如果隐藏层尺寸小于输入尺寸和输出尺寸),就会导致结果不佳。 Num Epochs:训练时循环整个训练集的次数。默认值 10000 是安全的,但对于大多数资产来说通常过高。对于有 5k 个姿势的数据集,建议使用 2500 次。
Num Basis(基数):这是对该部分建模时使用的基准数。基数越多,模型就越精确,但也需要更多的内存,因为模型需要存储更多的基数。 选中 "Use PCA(使用 PCA)"时可编辑该参数,否则不可编辑,该参数等于 "Num Basis Per Section(每区段基数)"。 权重贴图创建方法和顶点索引:它们用于使用顶点贴图定义剖面。有三种定义剖面的方法: 从文本:通过编写文本字符串使用顶点索引定义剖面。 骨骼网格组件中有使用网格信息预定义的字符串。
您也可以使用自定义字符串定义一个部分,如本部分的第一张图片。例如 "0-5, 9, 12, 37-50"。如果您在顶点 Houdini 中定义了一个组,并希望将顶点指数复制到虚幻中,这将非常有用(请记住添加逗号)。 选定骨骼:通过选择骨骼来定义截面。受所选骨骼影响的所有顶点都会包含在内(注意:辅助关节也需要选中)。顶点三角将乘以皮肤权重,以创建与非选定区域的平滑混合。
属性名称:用于定义截面的属性名称 要创建顶点属性,您可以使用 "已选骨骼 "子菜单中的 "创建属性 "按钮,也可以使用骨骼网格上任何现有的浮动顶点属性。 要绘制顶点属性,需要使用骨骼网格编辑工具插件。进入 "编辑工具"→"编辑皮肤权重"→"绘制地图",然后选择要修改的属性。
您需要确保顶点顺序相同,因为虚幻有时会对骨骼网格数据中的网格重新排序。 在 Houdini 中导出顶点权重的 python 代码段示例如下
为了确保顶点顺序一致,有时您可能需要在 Houdini 中对顶点重新排序。您可以在虚幻中根据顶点顺序为顶点分配新的索引,并使用排序节点对顶点进行排序。下面的 python 代码段展示了一个创建名为 "assigned_index "的新属性用于排序的示例。 邻居姿势:近邻数据集中的模型。该数据集是指用于改进模型复杂几何细节的数据集。在网络训练完成后,可以对其进行编辑。如果保持为 "无",则不会应用近邻 delta。 近邻网格:近邻数据集中的网格。网络训练完成后可对其进行编辑。如果留为 "无",则不会应用近邻三角网格。 近邻姿态和近邻网格可以通过关键姿态提取工具自动生成,也可以通过外部工具手工选择或两者结合生成。
5.3.最近邻数据集的最佳实践
始终检查顶点delta的合理大小。使用下拉菜单可视化近邻数据集的顶点delta。
检查数据集
近邻模型的状态。
模型状态
网络状态:网络上次训练的时间
推理状态:资产的当前状态。您可以使用该字段来确定修改属性后是否需要重新训练或更新。
重新导入骨骼网格或训练数据时例外。推理状态不会更新,但需要重新训练资产。同样,如果近邻数据被重新导入,也需要重新更新。
变形目标状态:上次更新变形目标的时间。
网络结构:上次训练的网络结构。其格式为 InputDim [HiddenLayerDims] OutputDim。这是当前加载的网络结构,可能与训练设置中的 HiddenLayerDims 属性不同,后者是将要训练的网络结构。
更新:更新模型的变形目标。
清除引用:清除对其他资产(动画序列或几何缓存)的引用/依赖。如果您不想在您的版本库中检查这些大型资产,这对资产验证很有用。
使用 PCA:是否使用 PCA 计算基数。PCA 是一种根据数据集预先计算基础的程序性方法。如果未选中,则将使用网络训练基数。
使用 PCA 时,模型更容易模糊,但高频噪声较少。
不使用 PCA 时,模型的细节可能会更好,但更容易出现伪影。
使用双四元数△:该选项使用双四元数蒙皮来计算和反转顶点三角。有时我们会看到更好的结果,有时我们会看到更差的结果。
只有顶点三角是使用双四元数计算的。基本蒙皮不使用。打开此选项并不会将线性混合蒙皮转换为双四元数蒙皮。它只会影响三角的计算方式。
我们需要在变形图的引擎内容中使用 DG_DQDeform_RecomputeNormals。这是默认选项。
衰减系数:这决定了前一帧的细节在当前帧中逐渐消失的速度。计算当前帧细节的公式如下:current_frame_wrinkle = decay_factor * last_frame_wrinkle + (1 - decay_factor) * predicted_wrinkle。更改此选项无需重新训练或更新模型。
使用 RBF:使用径向基函数计算近邻三角。默认情况下(关闭),模型只查找一个最近邻,并将其细节应用到最终结果中。打开后,模型将查找多个近邻,并根据径向基函数对它们进行混合,然后应用到最终结果中。这可能会使结果更加平滑。更改此选项无需重新训练或更新模型。
RBFSigma:径向基函数中使用的西格玛参数。该值越大,混合的邻域越多,结果也就越平滑。更改此选项无需重新训练或更新模型。
定义好部分后,我们就可以训练网络了。
在初始历时中,模型中的误差应该会明显减少。如果没有出现这种情况,可能是数据出了问题。
网络训练完成后,我们可以在 "部分 "下设置 "近邻姿态 "和 "近邻网格"。然后,我们需要点击 "更新 "来更新变形目标,然后才能在视口中看到结果。
变形目标压缩设置与神经变形模型相同,但我们需要针对近邻模型进行调整。我们建议首先将 Delta Zero Threshold(零阈值)设置为 0,压缩级别设置为 1,如果内存有问题,再进行调整。Include Normals应保持关闭。
工具下拉菜单
在训练和更新模型后,您可以使用 "关键姿势提取工具 "自动创建近邻数据集。在给定输入姿势列表后,该工具会将相似的姿势归类为簇,并选取簇中心创建近邻数据集。该工具使用 KMeans 算法进行聚类。
关键姿势提取工具
近邻模型资产:用于计算聚类的资产
剖面索引:用于计算聚类的剖面索引
Num Clusters:要提取的聚类个数
提取几何图形缓存:是否同时提取几何图形缓存。如果未选中,工具将只创建动画序列。如果选中,工具将同时创建几何图形缓存。
输入:要提取姿势的数据
姿势:要聚类的姿势
(可选)缓存:每个姿势的几何缓存。只有选中 "提取几何图形缓存 "时才需要。
缓存中的帧数应等于 "姿势 "中的键数
必须包含的帧:最终输出中必须包含的帧
提取的姿势:将输出姿势写入的文件。您可以使用 "新建姿势 "按钮覆盖现有文件或创建新文件
提取的缓存:将输出几何图形缓存写入的文件。您可以使用 "新建几何体缓存 "按钮覆盖现有文件或创建新文件
新姿势:创建一个新的空动画序列
新几何图形缓存:创建一个新的空几何图形缓存
提取:运行提取关键姿势工具。这将在 "提取姿势 "和 "提取缓存 "中输出结果。它还会在输出日志中输出结果。
这些结果会组成一对数字。第一个数字是动画索引。第二个数字是帧。您可以使用这些信息在外部软件中组装数据集。
提取结果
近邻模型资产:用于计算统计的资产 测试动画:要测试的动画 区段索引:用于计算统计的区段索引 Get Stats(获取统计信息):计算统计信息并在 Output Log(输出日志)中输出结果。
统计输出
输出说明
索引:最近邻数据集中基于 0 的索引
相似姿势:数据集中与此姿势最相似的姿势
出现次数:在测试动画中作为近邻出现的次数
帧数:该姿势在测试动画中作为近邻出现的帧数
近期焦点