ADAM揭秘 | Unity Alembic导入工具的开发历程

发表于2017-12-15
评论0 4.4k浏览

今天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项目。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引