2016年9月21日

Illusion Ray Studio 漫谈 UE4 中的 3D 电影和 VR 制作

作者 Lucas Smaga and Dominik Sojka

大家好,我叫 Lucas Smaga,是波兰工作室 Illusion Ray 的创始人。我以前工作过的公司有 Platige Image 和 Fuero Games 等。我要高兴地和我们的美术主任 Dominik Sojka 一起分享我们关于如何基于虚幻引擎 4 创作 3D 电影和虚拟现实的知识。

Dominik 和我都在游戏业和电影业里工作了许多年。我们的 VR 历程始于《Dino Safari》这个项目,它是使用 UDK 为 Oculus Rift DK1 设计的。随着虚幻引擎 4 发布,我们想到了用新的引擎扩展这个影片,就此开始了我们的 VR 电影历程。到目前为止我们已经制作了五部 VR 影片(《Dino Safari》、《Motoride》、《Afterlife》、《The Colossus》和《SolarSystem》),以及一部名为《Pirates 3D》的立体电影。目前我们还在使用摄影制图法制作一个新的游戏,它的灵感来自《寂静岭 PT》的氛围。

IllusionRay_Pipeline-770x433-73f0f1783ffa9bf1526f0bbe74a9e9af7d064983

通道

每个项目都有一点不同,但是大多数情况下通道或多或少和下面显示的一样。注:这个时间轴不仅能用于整部影片,也可用于每个场景。我们就是用这种方式完成《Solar System》项目的,它已经于今年夏天在波兰的各大 7Dmax 电影院上映。在《Solar System》项目中,各个场景/行星是分开处理的。

脚本和工作流程

我们做的第一件事是选择要制作的作品类型和希望营造的氛围。然后是完成具体内容设想和完整脚本,其中包括各场景的详情和每个场景的时间。因为我们的影片长度都不超过 10 分钟,所以每个场景都要惜时如金。我们为每个项目建了一个 Pinterest 留言板,用来收集灵感和创意。但是在工作组织方面,每部影片在 Trello 上都有单独的留言板,我们在其中定义行动计划和相关的截止期限。设定截止期限是个明智的做法,哪怕它们并不是强制性的。否则就会出现时间不断流逝、工作却没有进展的现象。严格遵守日程表的节点才能使项目有可能完成,并且可以不断监控其实施进度。显而易见的道理,对吧?事实上,不论我们做的是电影还是游戏,截止期限都是必不可少的。

草样

场景草样是用 3D 软件制作的,然后我们把它整个导入虚幻引擎中。对于网格碰撞,我们选取了选项“使用复杂碰撞作为简单碰撞(use complex collision as simple)”。然后,我们检验尺寸和比例的感觉在虚拟现实中是否正确。提示:通常需要把走廊和过道做得比实际尺寸大一点。

动画分镜

现在该谈谈通道最重要的元素了,那就是电影的动画分镜。在这个阶段,我们创建摄像机和基本角色的原始运动和物体动画。我们还会调整草样。大多数情况下,摄像机运动是在虚幻引擎外部完成的,因为我们使用摄像机动画跟随样条(“摄像机导轨”最早是在 Sequencer 中推出的,但我们一直用的是 Matinee)。不过,在这个阶段,对我们来说最重要的是摄像机的时间设置。

完成准备后,我们将动画分镜连同摄像机一起转移到 UE4,并在 VR 中测试。这里有个非常重要的元素,就是“摄像机的感觉”,它包括合适的移动速度,观看者是否会感到头晕眼花,等等。在这一阶段,要进行许多反复的调整。我们检查各种设置,然后进行改进,然后再来一次,重新检查并改进……如此反复。

有必要记住,动画分镜应该包括下列信息:在场景的哪些地方要有更多细节,摄像机应该在哪里停留比较长的时间,在哪里又应该以比较近的距离拍摄。这最终会对模型产生影响。动画分镜使我们能够知道哪些模型可以做得更精细,哪些模型的细节应该少一点。

IllusionRay_MainModelsAndBasicLights-770x415-53e2dc656165e7393afa8c0a46d3a8967d66c889

主要模型和基本光照

从这里开始就是真正有趣的工作了。在这个阶段,我们开始为基本 3D 物体建模。简单说来,就是把整个草样转化为墙壁、内饰、建筑、物品和其他模块化的 3D 模型。

IllusionRay_Pic3-770x722-e73202f547455ccc8fb07321766d529f29981c0e

接下来,在虚幻引擎中将整套模型组合起来,配上基本的光照和父着色器。根据动画分镜和关于脚本及指导原则的讨论,平行创建角色和动画。

IllusionRay_Lighting-770x722-dd4193217cdaae505d9da0ba02685507ffea24ac

光照:

为了优化,我们主要使用烘焙的光源。就我们的用途而言,我们认为最好使用静止光源,并且禁用“动态阴影(Dynamic Shadows)”(当然只在我们不需要的时候禁用)。与静态光照相比,这可以得到更好的反光。注:在一个区域内“静止”光源不能超过四个(因为材质上只有 4 个 RGBA 通道),所以必须谨慎选择。我们还经常以非常微妙的强度使用附加的静态光源 – 这对于粗糙度选项设置为 1 的 GI 模拟来说是完美的(在这种设置下它们不会使物体弹开)。此外,基本上每一个光源都应该使用光源概要,这样会有更好更逼真的消退效果。到目前为止,我们还偶尔使用过 Koola 使用的一种了不起的方法(就是用一个聚光灯照亮一个白色平面并烘焙)。我们先前的所有影片都是在 4.11 版引擎推出之前做的,那时还没有门户光源。

氛围和完善:

准备好基本环境后,我们就添加道具。我们根据摄像机的移动来创建它们,使得每一个视频帧都有合适的构图和权重。然后进行一般的后处理,包括添加基本效果和 LUT。对于个别场景/房间,我们还要进行更多后处理,小心地更改和改进氛围。在这一阶段,我们还要创建用于各个场景的粒子。

IllusionRay_MatineeSoundsandCamera-770x415-952c77750a15b16dd536abaa1f84060f687c23fd

Matinee、声音、摄像机:

这是电影制作过程中非常重要的最后部分。在这一阶段,我们制作所有物体(门、窗、粒子、启动骨骼网格动画、改变光照、动画后处理,等等)的动画。在这里,导入的主要摄像机有一个作为插件的次要摄像机,它携带关于其他细微运动(例如摇晃)的信息。也是在这一阶段,我们对摄像机进行最终的微调——对于连续场景和序列的时间设置不做任何大的更改。

声音是在这个阶段的结尾添加的。有些声音是由触发器启动(通过蓝图)或通过 Matinee 启动的(通常用于环境声音),还有些声音则与动画中的骨骼网格关联(通知)。

IllusionRay_Optimization-770x415-1089027b3e4623c00d3644729868aa4f138cc443

这些年来,我们一直都是在 Matinee 中合成这些互动的,当然你们也可以使用新的 Sequencer 电影编辑器完成所有这些任务。

优化:

我们的目标是 GTX 970。我们不能容许影片哪怕有一秒钟的帧率掉到 90 FPS 以下,因为这会造成幻影效果和延迟,会让观看者非常不快(这种效果即使在 89 FPS 时也是能觉察到的)。

减少每个模型上不必要的材质对于减少绘图调用很重要。应该尽可能在不影响图像质量的前提下完成这一工作。除了所有这些优化外,我们还添加“剔除距离体积(Cull Distance Volumes)”。但是,最根本的还是对 GPU 和 CPU 概要分析器的使用。它们对于寻找瓶颈帮助很大。

我们把每个项目都划分为尽可能多的关卡。这些关卡都是在一开始加载的,然后分别显示和隐藏。我们还对近距离的透明物体使用可视性限制(应用“摄像机距离消退(Camera Distance Fade)”)。最最重要的是减少骨骼网格上的动态阴影,因为它们对 FPS 的下降影响最大。

当然,明智的做法是不仅将 LOD 选项用于模型,还将其用于粒子。

如果到最后还有一定的 FPS 余量,我们可以尝试将“屏幕百分比(Screen Percentage)”设置为高于 100。这可以给整个图像带来出色的锐化效果,因为它将临时 AA 限制为图像分辨率。


提示和技巧

我们已经基本上说完了,下面介绍一些基于实践的诀窍。

APEX 服装

建议使用 Apex,不仅用于服装上,还可以用于头发、飞舞的垃圾、窗帘等等。

将模拟传输到虚幻引擎

要将模拟从一种 3D 软件传输到另一种,我们我们需要先烘焙转换,将所有动画物体的父代设定为骨骼/null/dummy,然后将它们作为骨骼网格导出。这样一来,我们就可以通过创建一些特定的粒子,用平面替换它们,然后以同样方式导出整个动画来制作非常有趣的效果。

有一点需要记住,可以通过虚幻引擎导入动画混合形状(变形)。

材质动画
同样需要注意的是,虚幻引擎允许用户通过 Matinee 或 Sequencer 设置材质参数动画。因此,可以通过使用“全局位置偏移(World Position Offset)” 或创建原创消融来制作有趣的效果。

IllusionRay_AnimatingMaterials-770x415-3f08aa1bd49e4b23d24843b78e6dcd00db48fc03

肌肉系统
要将肌肉系统导出到虚幻引擎中,可以使用肌肉顶点的约束,将多个带有皮肤的骨骼添加到先前创建的肌肉系统。然后,可以烘焙这些骨骼在每帧中的转换,再将它们导出到 UE4 中。

最好避免纹理平铺
我们经常看到别人在较大的区域上使用平铺。除了添加“细节纹理”和用不同材质绘制局部等显而易见的方法之外,有一种好办法是添加一个根据距离(像素深度)稍微改变平铺的方法。比较明智的做法是克隆一个纹理,减少其平铺并旋转。然后应该将这个纹理与主纹理关联起来,并使用 Perlin 噪声作为蒙版。除了以上各种做法,还有一种好办法是对坡度大的位置的地形添加另一种材质,例如通过向上矢量和顶点矢量的点乘积。(VertexNormalWS dot 0.0.1)


纹理的变化

在游戏里,我们往往会看到基本物体的重复,例如青草、灌木乃至某些道具。因此,给纹理添加一点颜色上的细微变化是个好主意,例如可以使用 UV 中的“噪声(noise)”选项作为“绝对全局位置(Absolute World Position)”(排除材质偏移),从而改变饱和度/颜色/亮度或提供尘土等附加效果。

结语

我们要感谢 Epic Games 提供了这个机会,让我们来分享自己的知识。我们要回去工作了。目前我们正在为即将推出的恐怖游戏《The Beast Inside》准备演示版,它的情节是 Adam 探究黑暗的记忆闪回,了解另一个人过去的痛苦经历。当然,我们欢迎业内人士(也包括业外人士)的任何评论和批评,因此我们鼓励你们在脸书上了解《The Beast Inside》。你们也可以访问我们的官方网站脸书页面来联系我们。