Live Link Face to Unreal MetaHuman Retarget
**注意:**我将此脚本作为工作项目的一部分编写,我无法共享它。但我希望我的笔记能帮助你找到自己的解决方案。 关于元人类 我最近开始使用虚幻引擎中令人兴奋的 MetaHuman (MH) 功能。通过Quixel Bridge编辑器,您只需点击几下即可创建和自定义一个高度逼真的头像,并将其发送到您的虚幻项目。一切都经过微调,以充分利用虚幻着色器,让您无言以对 😍 我邀请您看一看,那里有大量资源。
**注意:**我将此脚本作为工作项目的一部分编写,我无法共享它。但我希望我的笔记能帮助你找到自己的解决方案。
关于元人类
我最近开始使用虚幻引擎中令人兴奋的 MetaHuman (MH) 功能。通过Quixel Bridge编辑器,您只需点击几下即可创建和自定义一个高度逼真的头像,并将其发送到您的虚幻项目。一切都经过微调,以充分利用虚幻着色器,让您无言以对 😍 我邀请您看一看,那里有大量资源。
关于直播链接面
作为一名动作捕捉导演,我的兴趣迅速转移到实时重定向功能上,即如何将演员的面部表演实时转移到超人类身上。 Epic 为此提供了一个应用程序,它利用了 iPhone 的原深感摄像头:Live Link Face(LLF)。只需单击几下即可将您的手机链接到您的虚幻项目并开始驱动您的 MetaHuman 面部。再一次,它“史诗般”地运行得又快又好!
但是有一个障碍......该应用程序显然设计为与 Unreal 实时工作,您可以在其中使用 Sequencer 记录面部数据以及身体动作捕捉、蓝图功能等。但是,如果用作独立应用程序,那就另当别论了。
LLF 为每个拍摄 4 个文件保存:
-
包含动画的 CSV 文件
-
演出视频文件
-
包含一些技术信息的json文件
-
jpg 缩略图
没有 Maya 场景,没有虚幻资产,甚至没有一个简单的 fbx 文件,我们可以使用它在 MotionBuilder 等第三方软件中导入和清理运动。只是一个 CSV 文件,其中填充了随机的 blendshape 名称和数百万个值。就像你圣诞节从埃德娜姨妈那里得到的那个西葫芦削皮器一样,这是一个很好的姿态,但我到底要怎么做呢!? 🤔
快速查看文档证实了这个想法:
Unreal 引擎或 Live Link Face 应用程序当前未使用此数据文件。但是,此文件中的原始数据可能对想要围绕面部捕捉构建其他工具的开发人员有用。
所以,我想我们现在只能靠自己了!
让我们深入挖掘
这不是最方便的格式,但如果您仔细查看这个 CSV 文件,它就在那里:对于每个时间码帧(第一列),您可以获得定义该帧面部表情的所有形状的值。这些形状来自 Apple 的ARKit 框架,它使用 iphone 的 TrueDepth 摄像头来检测面部表情并生成 blendshape 系数。我们所要做的就是提取这些时间/值对,然后存储在一些方便的容器中。这就是Pandas库🐼及其数据帧将创造奇迹的地方!
现在我该怎么处理这一切?
我需要将动画值重新复制到 Unreal 可以导入和读取的目标模型上。让我们看一下MetaHuman 项目,您可以在 UE Marketplace 上找到它。
面部和身体动作是分开处理的。蓝图应用于骨骼的面部版本,其中仅包含根部、脊椎、颈部、头部和众多面部关节,因为虚幻依赖于基于关节的运动。
我可以通过创建动画姿势并将其导出为 FBX 来从 Unreal 中取出这个骨架。现在我们可以在motionbuilder中打开它,然后... HOLY MOLY GUACAMOLE,这都是什么!? 😵 我不是在谈论 Hellraiser 面部装备,而是在谈论根关节属性。它包含大量的自定义属性!
我快速运行了一行代码并计算了大约 1100 个条目:
-
以 CTRL_expressions_ 开头的 254 个属性,这些属性显然是 blendshapes,例如 CTRL_expressions_jawOpen
-
757 以 head_ 开头的属性,这似乎是额外的修正(修复例如同时激活的两个 blendshape 之间的碰撞)。
-
以 cartilage_, eyeLeft_, eyeRight_ 或 teeth_ 开头的 35 个属性,哪些可能是更正?
-
最后但同样重要的是:53 个属性,其名称与 LLF 的 CSV 文件中的 ARKit 形状相同,例如 EyeBlinkLeft 或 JawOpen。
因此,我们可以假设最后 53 个属性对应于应用程序中的 ARKit blendshapes,并且应该在重定向期间接收我们的键值。
Unreal是如何计算动画的?
在进入我们最喜欢的代码编辑器之前,让我们看看 Unreal 如何读取动画并将其应用到 MetaHuman。我从项目中打开 Face_AnimBP 蓝图,该蓝图用于处理从 LLF 应用程序到装备的实时重定向面部动画。
宾果游戏,来了!在 Live Link Face 框内,我发现似乎是一个映射块。它正在做所有的连接。对于 LLF 使用的每个 ARKit blendshape,它通过指定介于 0(无影响)和 1(完全影响)之间的影响值,将相应的 CTRL 表达式和 head 校正映射到元人类上。您可以在下面看到 BrowOuterUpLeft 如何触发 3 个具有不同权重的表达式 browLateralL、browRaiseInL 和 browRaiseOuterL,同时对任何其他表达式没有影响。
为了确认,我在 MotionBuilder 中的不同属性上创建了随机键,并将镜头作为 FBX 文件导出到 Unreal。它就像一个魅力!
-
ARKit 自定义属性上的键被读取和重定向,但前提是动画首先通过映射块,因此动画蓝图是强制性的。
-
但是,如果我在 CTRL 形状和 head 矫正器上放置键,我可以将我的动画直接应用到 MH 上,而不需要动画蓝图。
如您所见,我们有两种解决方案正在形成:简单的方法是将动画值从 CSV 文件传输到 ARKit blendshape 属性,或者将它们转换为 MH 表达式和校正值的漫长方法。两个都试试?
ARKit blendshapes 上的重定向
如前所述,这是在公园里轻松漫步。我们的 CSV 文件和我们的根骨骼共享相同的 ARKit blendshape 信息。我们需要做的就是转移密钥。以下是我遵循的主要步骤:
-
使用 Pandas 读取 CSV 文件并提取所有数据。我为此创建了一个 BlendShape 类,它接收 ARKit 形状名称以及动画键,作为时间码/值对。
-
对于所有创建的 BlendShape 对象,我在骨架根中搜索相应的属性名称并为所有时间码/值对创建键。
-
场景帧率在这里非常重要,应该与应用程序的帧率相匹配,否则不会在正确的帧处创建关键帧。
完成后,调整时间跨度以构建动画并查看根的 ARKit 属性。它们应该是动画的。
将您的动画作为 FBX 导出到 Unreal 并在 Face_AnimBP 蓝图中对其进行测试。不要忘记它需要经过那个映射块,以便 Unreal 可以将 ARKit blendshape 值转换为 MH 属性值,然后将其转换为关节信息。酷豆!
在 MetaHuman 属性上重新定位
现在让我们动手并探索第二种解决方案!我们希望能够直接在我们的 MH 角色上使用重定向文件,而无需经历所有这些映射小技巧。但为此,我们需要找到一种方法在 MotionBuilder 中重新创建此映射节点。提醒一下,它将每个 ARKit 形状链接到相应的 MH ctrl 和 head 属性,权重值范围从 0 到 1。所以我们首先需要从 Unreal 中提取这些值和权重🥵
看了一会后,我注意到 Unreal 节点可以导出为 T3D ascii 文件,其中包含有关节点正在做什么的所有信息。我试过了,我必须承认这不是一见钟情。幸运的是,它只有 13 行长!
但是,我们不要以封面来判断一本书。同样,如果您仔细观察,我们需要的一切都在这里。是时候看看我的正则表达式忍者训练是否有成效了。在玩了三种模式之后,我设法从 T3D 文件中提取:
-
ARKit blendshapes 名称
-
MH 属性名称
-
我添加到我的 BlendShape 类(表征 ARKit 形状)的每个属性的映射权重、目标 MH 属性和映射权重。完毕!我现在拥有重新定位所需的所有信息。
回到 MotionBuilder,我可以再次运行我的魔术循环。不过,这次我们必须更加小心:
-
读取 T3D 文件并为所有 ARKit 形状创建 BlendShape 实例。
-
使用 Pandas 读取 CSV 文件并提取每个 ARKit 形状的动画键。我将这些时间码/值对填充到我的 BlendShape 类实例中。
-
MotionBuilder 查找根属性的速度不是很快,可能是因为数量较多。为了避免多次搜索相同的属性,我先循环遍历 MH 属性,然后遍历时间码。对于每一帧,我检查哪些 ARKit blendshapes 触发了我的属性,并根据我的映射信息获取动画值。例如,如果 ARKit 值为 0.8,而该属性的映射值为 0.5,那么我的动画键将为 0.8x0.5u003d0.4。如果有多个 ARKit 形状触发它,我取最大影响对应的最大值。
-
同样,请注意以录制时使用的相同帧速率重新定位。
我在我的根属性上看到了键!让我们将它作为 FBX 导出到 Unreal 并将其分配给我的 Face 组件。 WUNDERBAR! Unreal 正在读取动画并将其传输到面部关节,而无需再通过该映射节点。
收尾
为了完成脚本并使其更加用户友好,我添加了以下功能:
-
批处理选项,以防您指向包含多个 CSV 文件的文件夹
-
偏移起始时间码的可能性,使动画文件与其他源同步
-
一个简单的 PySyde UI 供用户输入所需的路径文件
-
一些日志和异常处理,以确保我们的批处理正常执行
我们完成了,大家辛苦了! 😉
结论
只需要耐心和观察,以及一些古老的 Regex 巫术,就可以将 Live Link Face 应用程序记录的动画值作为 CSV 文件传输到我们全新的虚幻 MetaHuman 中。虽然不完美,但结果足以将动画移动到清洁阶段。
因此,这是一种录制演员面部动画的快速方法,即使他们无法实时表演。在后期使用 MotionBuilder 等动画软件和类似这样的相当简单的 python 脚本处理它们的能力使 Live Link Face 成为 MetaHumans 角色的廉价且可靠的面部动作捕捉解决方案。
我希望这将帮助您编写自己的解决方案。如果您需要任何帮助,请随时给我发消息,或者下次您在城里时给我买羊角面包和卡布奇诺 🥐☕ 干杯!
更多推荐
所有评论(0)