|
简介
2020年笔者刚入职追光动画时,正逢影片《新神榜:哪吒重生》上映前夕。为宣发此片及探索游戏引擎实时渲染在动画制作领域的实用性,我们将上一部《白蛇:缘起》动画电影中具有鲜明人物形象和个性的人狐双面妖宝青坊主立为虚拟偶像,并运用动作捕捉技术和游戏引擎制作了时长约3分钟,内容为坊主脱口秀吐槽和舞蹈的动画短片,视频链接如下:
《新神榜:哪吒重生》与《白蛇:缘起》联动!宝青坊主官宣solo出道!_腾讯视频
出于对游戏引擎技术的了解,笔者在此项目中承担了测试虚幻引擎(Unreal Engine) 4.25-4.26版本虚拟摄像机运镜、剪辑编辑器、角色毛发特效等与影视制作相关的模块其功能支持情况,并尝试加入程序性动画和音乐以实验性地结合UE作为游戏引擎而不同于传统数字内容创作(Digital Content Creation)软件的特性于非交互式动画中。本文记录了当时引擎各相关模块在该项目中的使用情况及由此总结出的制作限制与流程规范。
第一节 Unreal Engine 4 – Sequencer多轨迹编辑器与摄像机控制
引擎内多轨迹编辑器
虚幻引擎内置一个有着类似于Adobe Premiere Pro或其他剪辑软件的模块,被称作Sequencer。该模块被用于创建游戏内过场动画(In-game Cinematics),实质是可以调度虚拟摄像机和(通过触发事件来调度)角色表演、剪切摄像机渲染的序列、同步音频等。其快速建立摄像机关键帧动画和输出视频的特点尤其适用于制作动画番剧和游戏宣传视频。
在该动画短片项目里,Sequencer模块的虚幻-Maya摄像机互导及输出渲染视频的功能被用于该模块的测试和实际制作中的灯光环节的效果迭代。在测试Sequencer模块环节,笔者也运用到虚幻内置的摄像机导轨(Camera Rig Rail)和摄像机绑定摇臂(Camera Rig Crane)组件来试验引擎内摄像机运动控制,并在事件轨道(Event Track)中触发蓝图事件以控制角色动画的播放。
UE4 SEQUENCER面板
Maya-UE摄像机互导、镜头与副镜头
Maya的摄像机,在将其运动轨迹烘焙成逐帧动画(Bake Animation)后,可以直接在虚幻引擎Sequencer面板里导入并自动生成为引擎内置摄像机;摄像机虚焦通过Maya摄像机参数Focus Distance和引擎摄像机参数Manual Focus Distance相互关联,可key帧制作变焦效果。
Maya中的虚拟摄像机运动
UE中同步的虚拟摄像机运动
此外,Sequencer的镜头(Shots)轨道可嵌套Sequence镜头序列,嵌套在内层的Sequence中的摄像机轨道被称为镜头切换(Camera Cuts)轨道;某段被剪切出来的镜头(Shot)可以被替换成不同的副镜头(Take),来快速测试不同的镜头调度。
第二节 关于引擎内实时毛发渲染表现的研究
XGen曲线导入与引擎内毛发绑定
虚幻引擎有着商业游戏引擎中较为先进(但不成熟)的毛发模拟和渲染系统。其资产流程为使用XGen Maya毛发插件制作毛发资产,而后在Maya中转换成适量的NURBS样条曲线后,导出Alembic Cache(.abc)到引擎中生成相应的Groom资产。引擎内集成专门用于毛发渲染的材质着色模型(Hair Shading Model)以及针对于毛发抖动、碰撞的物理仿真模块,并且有将毛发绑定在模型网格上、使其能跟随骨骼动画和变形动画(Blend-shapes or Morph-targets)的试验性功能。
由于短片主角-宝青坊主-有着特殊的双面头,其狐狸面部被动物毛发覆盖,在狐狸说话的镜头中有毛发跟随面部肌肉(网格)运动的需求,在测试环节笔者花了大量的时间研究虚幻引擎的毛发绑定功能。但目前的测试结果表明,即便使用最新的引擎4.26版本,要成功运用此功能也需要遵守苛刻的资产流程规范。
在Maya中用XGen插件制作的狐狸毛发资产
早期测试中,毛发曲线导入引擎后作为Groom资产并没有跟随面部网格
虚幻引擎的毛发绑定功能由其绑定资产(Binding Asset)组件实现。根据引擎的官方文档,其所记录的生成绑定资产流程并不复杂。仅需要右击Groom资产后点击生成绑定,然后在弹出的面板中选择需要将其绑定至的骨骼网格(Source Skeletal Mesh)。之后可以将该毛发资产与模型骨骼上的某个关节进行关联,或者在关节上建立一个骨架网格体插槽(Socket)来把毛发资产挂在插槽上,使毛发整体能随着骨骼动画的一个部分运动。不幸的是,倘若不遵守引擎的毛发绑定规范(官方文档中并未讲明),要么生成相应的绑定资产时会报错,要么绑定资产无法被赋予给Groom资产完成毛发绑定,抑或是即便生成了绑定资产,毛发也不跟随(或不完全跟随、跟随效果出错)模型网格体。
通过调查虚幻引擎毛发绑定功能目前唯一有效的演示工程,Weta Digital工作室的Meerkat Demo工程(引擎商店里可以免费下载),笔者得出的结论是:要成功生成正确的绑定资产(Binding Asset),至少需要具备两个条件:
- 毛发必须包裹将其绑定至的全部骨骼网格体(Weta工程的猫鼬和鹰的毛发资产满足此条件,都是单一的Groom资产对应整个动物模型)。
- 毛发Groom资产在世界坐标中的初始位置(包括位移、旋转和缩放)需要与将其绑定至的骨骼网格体Skeletal Mesh的初始位置完全对应。
此外,如果角色模型组件繁多,其复杂的组装过程都会降低毛发资产成功跟随网格体的骨骼、变形动画的概率。总的来说,虚幻引擎的毛发绑定功能尚不成熟,不能应用于实际生产。
将宝青坊主的狐狸头分割出来后,毛发资产绑定至骨骼网格体的一次成功测试
另一方面,虚幻引擎的Groom资产可以携带用于毛发上色的贴图采样UV信息。UV信息需要在从Maya导出毛发NURBS曲线时,使用Python脚本计算出来并写入至曲线组属性(Extra Attributes)里。包含UV写入流程和对应Python脚本的官方文档链接如下:
https://docs.unrealengine.com/en-US/WorkingWithContent/Hair/XgenGuidelines/index.html
宝青坊主狐狸毛发资产写入UV测试
引擎内毛发材质
由于虚幻引擎原生毛发系统绑定功能的不确定性,在短片项目的测试阶段,笔者尝试过两种方式去在引擎内模拟生物毛发:写着色器C++插件和在UE4材质编辑器内建立毛发材质。前者笔者在经过大约两周的试验后,基于虚幻引擎API的复杂性和其文档的匮缺的事实,决定放弃。但通过研究其他游戏引擎毛发插件代码,笔者知晓了相关的材质构成(Mask Map, Length Map, Groom Map等)和实时渲染算法(Fur Shell, Tri-planar Projection),对在虚幻引擎材质编辑器内模拟毛发渲染产生了极大的帮助。后者,由于在编辑器内无法实现Fur-shell型毛发材质多次渲染表面网格产生立体层次感的效果,在实际项目制作过程中也没有采用此方案。
UE4 材质编辑器内创建毛发材质
UE4里创建的毛发材质赋予宝青坊主狐狸头的试验
第三节 Cache导入与离线渲染流程
Cache 还是 BlendShapes?
布料模拟对于角色动画来说是尤为重要的一部分。在短片项目测试阶段,笔者尝试过三种方式将布料资产导入引擎:其一为用骨骼链模拟布料抖动,导入引擎后生成相应的带有骨骼动画的骨骼网格体Skeletal Mesh;其二为将布料模拟动画渲染成逐帧Blend-shapes,导入引擎后生成带有变形动画(Morph Targets)的骨骼网格体;其三即是将布料动画导出成Alembic Cache缓存,导入引擎后生成相应的几何缓存(Geometry Cache)资产。第一种方式需要动画来key帧调试效果,不容易产生自然的衣服飘动,但应该可以同引擎的刚体物理组件结合实现可控的实时物理抖动模拟;第二种是笔者认为的最为合适的方式:布料模型以fbx的格式导入引擎生成Skeletal Mesh后只需要赋予其材质一回,而后以单纯导入动画序列(Animation Sequence)的方式导入多个镜头的布料解算动画;相比而言,以第三种的导入Alembic Cache的方式使用布料,则需要每次生成几何缓存后都赋予该缓存资产以材质。由于布料模型上可能带有多个材质,重复性的添加材质的工作会消耗制作人员大量的时间和精力。
左为以UE4几何缓存形式生成的布料资产 ;右为赋予几何缓存材质后的布料
角色组装
将布料模型和动画导入引擎生成相应的资产后,需要在引擎内将其同其他的角色配件一起组装到身体模型上。在项目测试阶段,笔者采用的方案是:建立一个蓝图Actor,将外套和短裙两块布料Cache缓存以组件(Components)的形式添加至蓝图层级结构(该例为胶囊体组件)下。该例还添加了狐狸Groom毛发资产和产生角色吐烟特效的粒子系统。通过建立角色蓝图的方式,可以方便艺术家在场景中挪动和摆放角色的位置,并建立蓝图事件来控制角色的表演(即控制引擎实时播放角色动画片段)。
宝青坊主角色蓝图视口面板(VIEWPORT)
Unreal Engine 4骨骼绑定规范
要将带有骨骼和变形(BlendShapes)动画的模型导入虚幻引擎,所需满足的最基本的要求是骨骼层次结构只有一个根节点。此外,Maya的除用绑定骨骼(Joints)蒙皮和混合形状(BlendShapes)的方式之外制作的所有变形动画,包括用Maya变形器(Lattice, Wrap, etc.)所制作的动画,都应该使用Bake Animation将动画数据逐帧烘焙到骨骼上。导入引擎后,带绑定骨骼的模型会生成相应的骨骼网格(Skeletal Mesh),以及对应的骨架资产(Skeleton)。点击骨架资产进入相应的UI面板,其左为角色的骨架树(Skeleton Tree),鼠标右击某个骨骼可以创建用于挂件的插槽(Socket)。点击视口上方按钮角色(Character)-> 骨骼(Bones) -> 全部层级(All Hierarchy),视口会显示角色的整个绑定骨架,方便绑定制作人员查看。
角色骨架树(SKELETON TREE)和视口中显示的骨骼全部层级(ALL HIERARCHY)
第四节 程序性动画与特效
引擎内音频可视化组件
虚幻引擎提供给程序员在工程内创建C++类的功能,和相应的编程接口API。该功能不同于编写引擎插件,或者给引擎写着色器,更类似于编写游戏逻辑或者写脚本添加项目临时所需的功能。编写UE4 C++类小程序的工作不需要理解虚幻引擎架构或者理解源代码,游戏逻辑程序和工具向的技术美术(TA)足以胜任。
在此短片项目中,笔者根据导演要求编写了一个UE4 C++代码所生成的引擎内音频可视化组件。该组件外观为桶状,以多条围成一圈的由亮度可变的粉色几何方块构成的、显示某频率音量的“音条”组成。组件用于将宝青坊主跳舞时的伴奏以视觉化的方式呈现出来,同步和增强音乐的节奏感。
UE4 C++ 音频可视化组件
Blueprint Procedural Animation
除了编写C++代码,虚幻引擎提供可视化编程,即蓝图(Blueprint)的功能使引擎使用者能快速创建一些常见的交互和动画。在短片项目里,笔者运用蓝图来程序化生成宝青坊蓝色灯笼上下浮动的动画,并结合引擎的游戏人工智能中的行为树(Behavior Tree)模块使灯笼能自动跟随坊主移动。
灯笼跟随行为AI
第五节 杂项
光照烘焙Tip
在游戏引擎中,经常需要通过将光照信息烘焙成光照贴图(Lightmap)来减轻实时渲染场景的压力。由于静态模型的光照信息被存储在了一张或多张贴图上,每个模型网格UV展开后在光照贴图上所占的面积是有限的。倘若该面积过小,烘焙光照后模型上的光影就会出现像素化(Pixelated)等渲染错误(Artifacts)。可以通过调整单个模型静态网格组件上的Lighting组中的Overridden Light Map Res来调整该模型网格展开后能占取的光照贴图面积的比例,还可以通过调整World Settings面板Lightmass组下的Packed Light and Shadow Map Texture Size来调整单张光照贴图的大小。
毛发模拟与渲染Tip
用于毛发Groom资产渲染的材质,其着色模型(Shading Model)只能被设置成Hair,且需要在材质参数的Usage组下勾选Used With Hair Strands。倘若试图将着色模型不是Hair的材质赋予Groom资产,引擎会拒绝此操作,并将该Groom资产的材质自动设为DefaultHairMaterial。
在短片制作的灯光后期合成环节,有一个将宝青坊主头发渲染成全黑来制作狐狸毛发蒙版(Mask)的需求。由于Groom材质的着色模型只能是Hair,头发总是会带着高光,不可能通过调整材质参数来实现蒙版。可以通过将头发Groom资产设置在与场景灯光不同的光照通道(Lighting Channels)中,并删除场景中的所有ReflectionCapture,来让头发完全不受光,以此实现蒙版效果。
UE4材质HAIR着色模型总是带高光信息
总结
笔者在此文对将Unreal Engine 4应用于动画短片项目的记录中,通过对可应用于影视动画制作的模块的深入探索和测试结果的阐述,展示了把商用游戏引擎作用于三维动画制作的前景和局限,以期帮助更多的从业者更加客观地认识这一游戏制作主力软件于影视制作领域可发挥的功效。
2021年1月 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|