ADAM揭秘 | Unity Alembic导入工具的开发历程
今天Made with Unity团队中的艺术工具工程师SerEn Low将为大家分享关于Unity支持Alembic文件格式的发展历程。SerEn Low在ADAM影片系列中,帮助整合诸如Alembic和Timeline这样的工具,确保动画流水线的顺畅和易于维护。
背景:Unity中Alembic的诞生
大约二年前,Unity研发团队开始了Alembic导入器插件的开发,主要运用于Marza 动画星球的《The Gift》的动画短片中。《The Gift》中最具挑战性的镜头之一是将从Houdini模拟中生成的Alembic数据导入Unity,生成一个由几百万颗塑料球组成的巨浪。这很好的证明,允许艺术家导入来自各种外部程序的模拟数据,是可以将Alembic集成到Unity中的。Alembic还使艺术家可以突破实时引擎中基于关节网格变形的限制。
当Oats Studios决定在制作过程中使用Alembic导入器时,还希望有一些额外的功能和优化,以便能处理布料模拟的高视觉保真效果以及实时面部表演捕捉。由于需求与Alembic导入器最初的设计目的差异很大,Unity开发团队在升级这个插件上做出了巨大的努力。
Alembic导入器的主要升级
第一个主要更新是针对Timeline的集成。这让Alembic数据在运行时可以实时输入并通过Timeline进行播放。同时在编辑状态中,用户可以在Timeline上直接拖动就可以播放Alembic动画。为了完成这个功能,我们向Alembic Importer包中添加了一个自定义PlayableBehavior (Alembic Stream Player), PlayableAsset (Alembic Shot Asset)和TrackAsset (Alembic Track)。
在Timeline中,你可以先添加一个Alembic Track,然后创建一个Alembic Shot Asset,最后通过一个Alembic Stream Player组件将它和场景中的Alembic实例进行关联。
Timeline中的一个Alembic Track和Alembic Shot Asset
场景对象上的一个Alembic Stream Player组件
第二个重要更新是针对顶点共享(Vertext Sharing)的支持。这对优化网格拓扑资源的Alembic流传输性能十分重要。典型的Alembic数据是用于进行动态模拟,比如粒子,它们的网格拓扑会不停变化。我们将共享的顶点合并,以优化回放性能。这非常的重要,因为网格在每一帧都会基于数据流进行实时重建。通过合并共享顶点,其它网格属性,例如边、UV、法线以及切线也都会被更新,动态Alembic网格现在的行为就与一个FBX网格一样。这确保了网格可以根据场景中指定的材质、着色器和光照做出反馈。
Unity中的Alembic网格显示共享顶点
第三个重要更新是在Alembic顶点数据中添加了插值。既然Alembic网格基本上是一个每帧都会重建的新网格,它就没有先前以及之后顶点位置的变化信息。这在你尝试对Alembic网格应用运动模糊进行渲染时会产生问题。有了插值,Unity中的Alembic资源可以计算位置之间的插值,并输出要进行运动向量计算所必需的速度。那意味着,你现在可以从Alembic网格导出精确的运动向量,以用于着色器计算或后期处理特效包Post-Processing Stack。这增强了最终渲染图像中的运动模糊质量,同时还因为采样数降低,使性能得到了提高。
Alembic网格上的运动向量
应用运动模糊前
应用运动模糊后
运动向量缓冲区
此外我们还实现了好几个对实际生产中有帮助的特性,以平滑生产工作流程。例如Alembic Playable Asset的自动激活,这使Alembic Playable Asset无需在Timeline中添加额外的Activation Track即可激活。Time Scale属性使你可以重新调整Alembic数据的回放时间。Turn Quad Edge属性使你可以选择网格表面三角化的方向。另外还有一个选项可以在Alembic场景对象启用时缓存所有Alembic样本,而无需在回放中缓存数据。
Oats Studios 使用Alembic的流程
“Alembic流传输对于我们来说,是此项目能够成功一个非常重要的方面。将模拟的东西导入十分困难,而Unity中的Alembic导入器是个大杀器”,Oats Studios的特效总监Chris Harvey说。
在Timeline编辑器中组装多个Alembic资源
基于真实的演出服装,Oats的ADAM影片中所有的服饰,都是通过摄影制图法(photogrammetry)捕捉,然后在Marvelous Designer中进行重建和模拟。数字裁缝师Sean Frandsen在Marvelous Designer中,对不同的织物类型羊毛、棉、皮革等赋予真实的物理属性和动画。同时捕捉的面部表情被转换成一系列静态网格用于Alembic回放。
在ADAM中Alembic被主要用于两种类型的资源:布料和面部
数据随后被导入到Autodesk Maya,进行进一步清理和调整后导出为一个Alembic文件。这是流程的示意图。
导入Unity的Alembic和FBX资源流水线
在空间和时间中组装模拟资源
在Unity中的这个阶段,Oats将Timeline作为一个装配工具,组合Alembic资源,并在场景空间中将它们和其它资产一起进行编排。例如为了完整地组装一套角色表演,使用了两个Alembic轨道,分别用于面部和布料。这两个轨道位于一个包含FBX格式的身体表演的Animation轨道之上,如下图所示。
装配好的角色在Timeline中栩栩如生
有了Timeline中的所有东西,Oats可以同步并根据每个镜头的时间对所有资源进行排序,以进行实时回放。但是在实际的生产过程中,大量的资源会很容易使Timeline编辑器界面杂乱不堪,极难维护。为了解决这个问题,Oats使用可自由展开和折叠的TrackGroup来组织场景中的资源。为了进行更好的组织管理,Oats还使用了另一个Unity特性ControlTrack,它可用于处理多个嵌套的Timeline实例。
展开与折叠的Track Group
ControlTracks处理嵌套时间轴资源
一键自动化
在随后的制作阶段,面部捕捉和布料模拟生成的Alembic数据文件总数接近300个。因此,Oats需要一个自动化过程来将多个Alembic文件导入到Timeline,所以他们编写了自己的导入器,自动将Alembic文件导入,进行预定义设置,在场景中实例化并添加所需的组件,以及在Timeline中排序。在Unity开发团队的帮助下,Oats最终可以仅点击一个按钮就能启动这整个自动化过程。我们从这个项目中还收集了许多很好的反馈和API需求,用于对Timeline进行深入改进。
为不同的角色和道具管理几百个Alembic资源
参考资料
Alembic Vertex Sharing(1.0f1版本)
https://github.com/unity3d-jp/AlembicImporter/releases
小结
在ADAM项目的进行过程中,Alembic导入器变得更加成熟和适于实际生产环境。GitHub库可访问这里。现在你可以将它用于动态拓扑模拟网格和静态拓扑网格,如布料和面部。它针对Unity现有的和即将到来的特性进行了优化,并且集成地更好。越来越多的艺术家和工作室对使用Alembic表现出兴趣,特别是在实时CG电影方面,我们很期待它可以成就许多惊艳的Unity项目。