设置 2D 唇形同步(2D Visemes)
设置 2D 唇形同步(2D Visemes)
一些虚拟形象(最常见的是卡通或低模虚拟形象)拥有用于语音的“2D 唇形同步(Visemes)”精灵图集或分离的贴图,而不是更常见的混合形态(blendshape)唇形同步。与混合形态唇形同步不同,这些无法在导入时自动应用,因此需要进行一些设置才能正常工作。
前提条件
本教程假设以下情况:
- 虚拟形象或对象已经拥有唇形同步贴图(本教程不是关于如何创建这些贴图,而是关于如何应用它们)。
- 虚拟形象已经被导入并创建完成。
教程
唇形同步设置
首先,请确保你的虚拟形象包含一个 VisemeAnalyzer(唇形同步分析器)组件。如果在导入和创建虚拟形象时检测到了唇形同步的混合形态,那么在 Head Proxy 插槽下会有一个 VisemeAnalyzer,你可以直接跳到驱动贴图部分。
否则,请导航到 Head Proxy 插槽并附加一个 VisemeAnalyzer 组件和一个 AvatarVoiceSourceAssigner(虚拟形象语音源分配器)组件。将 AvatarVoiceSourceAssigner 的 TargetReference(目标引用)设置为 VisemeAnalyzer 的 Source(源)字段。
贴图设置
在继续之前,最好先了解一下虚拟形象唇形同步贴图的提供方式。通常存在两种情况:一种是“图集(atlased)”贴图,即包含每个单独唇形同步状态的一张完整贴图;另一种是“分离的(separated)”贴图,即每个唇形同步状态对应一张单独的贴图。使用哪种类型并不重要,但实现它们的具体过程会略有不同。
为了保持结构清晰,建议将接下来的所有内容放在将要存放唇形贴图的网格(mesh)下的新插槽中。打开一个新的检查器(Inspector)并导航到最适合存放唇形同步的网格插槽(通常,会有一个单独的头部网格用于此类用途)。创建一个子插槽并给它起一个具有描述性的名称。
图集贴图
将一个 AtlasInfo(图集信息)组件和一个 UVAtlasAnimator(UV 图集动画器)组件附加到新创建的插槽上。在 AtlasInfo 组件中,将 GridSize 设置为图集贴图的网格宽高,并将 GridFrames 设置为图集上独立唇形贴图的数量。例如,如果有 11 个排布为 4x3 网格的唇形同步状态贴图,则将 GridSize 设置为 (4, 3),将 GridFrames 设置为 11。
找到(或创建并应用)将持有你的图集唇形贴图的材质(material)。将 TextureScale 标签拖动到 UVAtlasAnimator 的 ScaleField 字段中,并将 TextureOffset 标签拖动到 UVAtlasAnimator 的 OffsetField 字段中。将之前添加的 AtlasInfo 组件拖动到 UVAtlasAnimator 的 AtlasInfo 字段中。
记下每一帧贴图在整张贴图中的位置。简而言之,整张贴图会根据 GridSize 被“分割”成具有一定比例的矩形。Frame 字段从中选择一个正方形输出,范围从 0 到 GridFrames - 1。选择顺序是从上到下、从左到右,因此第 0 帧对应左上角部分,第 1 帧对应前一帧右侧(如果只有 1 列则为下方)的部分,依此类推。
分离贴图
附加一个 AssetMultiplexer<ITexture2D>(资产多路复用器)组件到新创建的插槽上。根据虚拟形象唇形同步的数量添加并设置相应数量的贴图。记下你为每个索引(index)设置的对应贴图。
找到(或创建并应用)将作为你当前唇形同步贴图的材质。将 AlbedoTexture 标签拖动到 AssetMultiplexer 的 Target 字段中。
驱动贴图
为了本教程的目的,我们将提供两种驱动贴图的方法。一种是使用 ProtoFlux 的更直接、直观的方法;另一种是使用组件(Components)的没那么直接但(主观上)更有条理的方法。这两种方法在性能上没有显著差异;这只是关乎如何组织结构以及你想做什么。这仅仅是为了展示实现同一目标有多种方法。
ProtoFlux 方法
从 VisemeAnalyzer 获取你想映射的每个唇形同步字段的源(在撰写本文时,总共应有 16 个源,从 Silence 到 LaughterProbability)。将所有这些源连接到一个 Value Max Multi 节点中。将此节点的输出连接到一个 Index Of First Match 节点的 Match 字段。
此外,将所有的源连接到 IndexOfFirstMatch 的其余字段中,并且按索引匹配相关唇形状态的适用顺序排列。例如,如果你设置的 FF 唇形同步状态在第 4 个索引/帧上,确保该唇形状态的源插入到 IndexOfFirstMatch 的第 4 个索引(整体上应该是第 6 个输入接口)。
最后,驱动 UVAtlasAnimator 的 Frame 或 AssetMultiplexer 的 Index 字段,并将 IndexOfFirstMatch 的输出连接到该驱动节点上。
组件方法
在你创建的插槽下,添加一个 DirectVisemeDriver 组件和一个 ValueGradientDriver<int> 组件。在 ValueGradientDriver 中,将 Progress 设置为 1.00 并关闭 Interpolate(插值)。在 DirectVisemeDriver 中有多少种唇形同步类型,就在其中添加多少个点(point)(在撰写本文时,有 16 个点)。对于每个点,将其 Position 字段拖动到 DirectVisemeDriver 上第一个可用的唇形同步驱动(viseme driver)中。对于 ValueGradientDriver 中的每个 Value,输入你想为其关联的唇形同步状态所使用的 UVAtlasAnimator 的相关帧数或 AssetMultiplexer 中的索引。
最后,将 UVAtlasAnimator 的 Frame 标签或 AssetMultiplexer 的 Index 字段拖动到 ValueGradientDriver 的 Target 字段中。
结语
到目前为止,你的虚拟形象的 2D 唇形同步应该已经完全设置好了。对于那些不需要映射到任何贴图的未使用唇形状态,你可以安全地删除其在 ValueGradientDriver 中关联的点(强烈建议你从高索引到低索引依次删除,以防混淆)。
有关某些组件或步骤如何工作的更深入细节,强烈建议查看相关主题的各个维基页面。
与其他嘴部贴图集成
某些虚拟形象可能会有唇形同步之外的嘴部表情,你可能希望这些表情优先于正常的唇形同步贴图显示。
无论你使用的是组件还是 ProtoFlux,你都可以在工作插槽上创建一个 ValueMultiplex 组件,并使用它来驱动 UVAtlasAnimator 的 Frame 或 AssetMultiplexer 的 Index。然后,最有可能的是使用 ProtoFlux 根据你希望显示的是唇形同步还是其他贴图,来驱动上述 Multiplex(多路复用器)的 Index。

No comments to display
No comments to display