从SIGGRAPH’11看《Rango》

一年前,我们曾介绍并讨论了展示在siggraph’10 Talks上、作为Disney’s 50th Feature Animation的《Tangled》。在今年8月7日至11日的温哥华siggraph’11大会上,工业光魔携首部动画长篇《Rango》成为了“Let there be light”(加点儿灯光?)单元当之无愧的主角(尽管去年的Tangled和今年的Cars 2同时均有入选)。

《Rango》中文译名“兰戈”,由执导了前三部加勒比海盗系列的Gore Verbinski担任导演,该片作为工业光魔在Feature Animation(FA)领域的处女之作,使得后者在首次试水FA后即登上了巅峰。影片主要讲述了一只不慎被遗失在西部荒漠中的蜥蜴,历经艰难、最终找回自我的故事。影片无论在情节构思、画面、配乐上的精细程度都堪称前所未有。本文依旧从Siggraph’11上的三篇文章出发,试图探索堪称计算机图形学史上迄今最先进的工业级CG技术。

使用面向FX工具制作动画角色和光照特效

在拍摄初期,工作人员在虚拟转台上测试了整个ILM的材质库,其意在测试材质的环境光遮蔽和阴影效果。然而在影片中,除了60名主要角色以外,还需要大约1000个道具。为了简化这部分工作,这里还使用了部分置换贴图以丰富材质信息。同时,再将这些材质用于不同环境的转台程序下,以便迅速发现问题并制作新的Shader;

过去通常使用光板或参考集设置光线,然而《Rango》则例外,这部分影片中引入了新的方法。每一组镜头中的光照设置非常简单,即包括关键光、环境光、反射光三部分,该方法被用于全部的室外光和一些室内光。技术人员使用Digital Matte部门开发的虚拟集渲染器创建环境光和反射光映射,而非直接进行360度捕获。上述映射被用于非静止的、处于快速移动物体中的反射/折射光精确表示。设置灯光时,关键光通过一个受可切变天空顶约束的远程光Shader定义,并通过复制角色的远程关键光,达到较好的交互和阴影效果。同时,用户还可以通过旋转整个装置以达到尽可能广泛的变化,或只旋转关键光以改变复制光,或通过特定的扭曲修改角色局部的复制光。

除个别场景外,影片几乎所有的室外场景都使用了前文所述的格式化远程关键光、环境光和反射光装置。该装置包含两个开关:一是激活阳光反射卡片(模拟光晕效果),另一个用于开启基于距离的阴影模糊。

假设你在一个阳光明媚的室外场所,挥动手臂并在一张白纸上映上阴影效果,你会发现当你升起手臂时,阴影边界的模糊度随之逐级递增,这种边界阴影模糊在物理学中被称为“半影”现象。物理学中已经证明,半影宽度除以障碍物至阴影面的距离值约为常数1/112,它同时也是太阳以弧度为单位角直径值。工作人员实现了基于距离的关键光阴影边界模糊并对其进行严格控制,力求在符合真实世界效果的基础上尽可能满足导演对夸张手法的要求。

简易的关键光/环境光设置方法是设置全局光照参数,并将其作为一组镜头的初始光照。整部影片也可以通过该方法初始化并检测通用关键光的特效和镜头效果。每当TD(Technical Directors)布置新任务时,他们就可以通过添加特定的光照效果以丰富镜头。出于对主角显著区别于背景的绘制需要,工作人员对其进行了逐帧细化和调整。

角色合成方面起初的构想十分简单,然而随后愈加复杂,这种复杂程度甚至超过了真实的角色电影。导演对每一个场景均有特定的灯光、编排和镜头要求,还包括变化的气候、照片级真实感绘制(光畸变,正确的燃烧扭曲,热涟波和相机抖动等)。额外还包括了沙漠、指纹、水、尘土等各种细节效果。为此制作团队特组织了一批强大的计算机开发团队,通过创建自定义通用脚本制作了多个工具辅助影片拍摄。

动物皮毛的穿透避免和动力学

在《Tango》中需要对多个鸟类角色建立羽毛模型,而这种羽毛模型通常需要手动放置主要的羽毛茎秆曲线,再在不允许插值的条件下实例化整个皮毛几何体。此外,影片对动物角色的要求还包括了日常姿态、呼吸动作、受风、动量、惯性影响的效果等。这里制作团队开发了一种尽可能保持原设计形态的皮毛动力学模拟和自由碰撞技术。

鸟类的羽毛是通过分层有序叠加的,开发人员应允许设计师能够任意设计皮毛的基本外形、层次结构,且不必处心积虑地避免皮毛穿透问题。设计师通过在角色皮肤上放置引导曲线,以构建基本的皮毛外观,同时在其径向上实例化一个矩形几何框,用户可据此设置宽度、扭曲度、与起始点法线相似度等参数。该四边形面片同时还被用于在绘制阶段实现多种纹理效果。

制作团队共使用了两个实例化的皮毛集合,一是目标集,包括了许多皮毛间的相互穿透效果。二是特征皮毛根集,这部分使用狭长的面片实现,由于其更接近法线方向,故存在较少的互穿透。后者用于对某些动物的皮毛进行初始化和带穿透避免的布料模拟。与[Weber and Gornowicz 2009]提出的复杂方法不同,下一步是使用非身体力设置布料模拟的皮毛。每一个布片的基被限制在一个曲面片上,据此检测面片间的相互碰撞。目标集则是通过布料解析器限制下点接点的受力建立。在模拟过程中,布料面片将面向目标集方向生长、然后由碰撞检测部分避免穿透。碰撞避免的方法可以使用基于三角形或是基于边的排斥方法。在第一步完成后,仍需要进一步对角色动作过程中的皮毛穿透现象进行检测, 同时还要保证对原设计形态的维持。

插值毛发的碰撞精度

毛发的动力学常常是通过引导毛发和成员插值构成的,因此这部分也被称为插值毛发。碰撞精度是毛发模拟技术中最费时的阶段之一,因此通过限制毛发的碰撞精度从而提升动力学性能是非常重要的。在许多情况下,只需要视觉感官上可被接受即可不需增加碰撞精度,遗憾的是,我们的运气往往没有这么好:)

影片中许多动物都穿有衣服,那么即使是一根发丝从衣服布料中伸出来都是不可接受的。然而对整个已生成的毛发集合进行穿透检测和避免也是不现实的:首先,这种技术非常耗时,插值后的毛发往往是引导毛发的成百上千倍;其次,这种方法并不能用于目前的管线设置,因为在模拟阶段插值头发尚不存在;最后,基于物理的碰撞检测方法通常是使用多边形面片,而非Catmull-Clark细分曲面表示,即使是极小的曲面差异也很难保证碰撞检测的正确性。

这里制作团队提出了一个新的穿透修正方法,该方法主要解决的问题包括精度、效率和时间相关性,其主要贡献是对平滑曲面表示进行碰撞检测,沿着毛发生长方向进行连续碰撞检测,并在每一帧进行碰撞检测。该方法最终在影片多处被用到,它既保证了高效率,同时精度也达到了无需进行后期修正的程度。

文中工作人员使用了[Verma et al. 2009]将CC曲面转换为Bezier表示,这种显式曲面允许通过精确交叉查询解决碰撞检测的问题。其次,使用层次数据结构对毛发和Bezier面片进行候选碰撞检测。由于当前配对可能发生了穿透,将毛发的生长方向再移动至其参数空间中的上层部分。通过沿参数化的曲线空间搜索连续毛发-曲面交叉,其中使用Newton法计算毛发和曲面交叉部分。

在穿透避免时很容易造成无法保持原始形态的问题,这里使用了一种简便方法以保持形态,即在穿透避免后使用[Goldenthal et al. 2007]提出的快速投影法修正其差异长度,然后在碰撞精度和应用不可延展间进行迭代,直到满足两方面需求即停止。实际应用中只需要很少的迭代次数即可完成计算。

插值头发绘制时逐步生成的,同时还要同步进行穿透避免计算。因此需要在每一帧进行独立的穿透避免计算(并行处理),这条限制有一定隐患,即可能导致发生时间无干性:毛发可能在连续帧中发生不平滑。这里通过尽量使其朝向生长方向以降低不平滑的程度,尽管尚不完美,但已经足够达到目的了。

总结

《Rango》无疑是siggraph’11大会上一颗耀眼的明珠。与去年的《Tangled》相比,该片的制作成本要少一亿三千万美元(估计成本一亿三千五百万),前者更是花费了Disney Animation Studio长达六年时间。不过,这次ILM的口碑和舆评显然超过了Disney,正如片尾Rango骑着白鸡,发表了如下慷慨激昂的讲话:

My fellow comrades.

There will be times when you doubt yourself.

When you feel pummeled by the cataclysms of life,

Remember this moment. Remember me.

Know that I will be there watching you,

Sometimes at inappropriate moments.

That’s part of the deal.

And remember, within all of us resides

The true spirit of the…