剧情片巨蟒奖

2020-10-19 23:21:12

这篇文章最初是我在个人网站上关于Python for Feature Film的系列文章的一部分,但现在只做了一些微小的修改就移植到了这里。日期已经调整,以匹配项目的发布日期。

Python是一种编程语言,在过去几年中已经成为电影制作过程中不可或缺的一部分。几乎没有一部动画长片或视觉特效电影(如果有的话)没有让Python在将其搬上银幕的过程中扮演重要角色。

当人们想到电影时,即使是程序员也经常会想到将这些图像赋予生命所涉及的艺术性。然而,电影业的技术方面往往不被一小撮人注意到。

为此,我写了几篇关于我如何在几部主要电影中使用Python的博客文章,我有幸参与了这些电影的制作。希望这能表明它对一部电影的整个生命有多大的贡献。

我最近还发布了一门关于Udemy的课程,教艺术家如何学习Python for Maya,因为它在行业中正成为一项越来越有价值的技能。这些博客帖子也可以作为课程的配套材料。

Python是一种设计成非常容易读写的编程语言。它在故事片行业以及其他群体中非常受欢迎,比如数学、科学和机器学习。

值得注意的是,今天,电影业在很大程度上仍然与Python2.7捆绑在一起。我们将在2020年齐心协力转向Python3,我们应该会从2021年开始看到更大规模的Python3被采用,并继续向前迈进。

这是一张描述大多数主要工作室的管道的图像。管道是将每个部门连接在一起的箭头。它负责确保每个部门之间的数据流动,每个人都可以很好地合作。它还负责每个部门的工具包,以便艺术家自己能够高效地工作,但现在让我们关注一下部门间的流程。

在这里你可以看到视觉特效电影或动画长片的各个阶段。工作室可能与此略有不同,但这是一般的工作流程。

故事板/素材/素材代表我们获得的数据,而合成/照明是影片的最后阶段。视觉效果影片与动画电影略有不同,因为你必须处理影片素材中额外添加的以图版形式存在的元素。

管道负责获取部门之间的数据。以下是它的工作原理(尽管它比所描述的过程更有机):

我们从客户或故事艺术家那里获得数据,这些数据以图板、预视化(Previis)或故事板的形式告诉我们场景中正在发生的事情。

建模:查看所有这些内容,并生成所有需要的资产的3D模型。

装备采用角色的建模资源,并应用虚拟骨架以使其可设置动画。

MatchMove负责创建与拍摄胶片以及任何独立角色或几何体相匹配的虚拟摄像机。

布局采取钻机,并创建自己的相机或采取火柴移动相机和设置场景。他们相当于一个虚拟的摄影导演。

然后将场景移交给动画公司,后者相当于演员。他们负责角色的移动,并使无生命的骷髅栩栩如生。

CharacterFX负责动画的所有技术部分。肌肉模拟,使布料移动逼真,头发、草等…。所有内容都来自CharacterFX。

然后,FX处理与动画无关的效果。无论是毁灭、火灾、体素化等…。有很多事情是由FX负责的。

在此过程中,纹理处理负责为3D资源赋予颜色,使它们不仅仅是灰色对象。

然后,明暗处理采用这些纹理,并为资源提供一种材质,该材质告诉资源灯光应如何与其交互。

哑光绘画是我们在建造环境不符合逻辑或不可行的情况下使用的部门。我们在现实中只能建造这么多,超过了这一点,让人来画一幅非常高质量的画会更有效率。

这一切都进入了Lighting,他们负责将灯光添加到镜头中,并将图像渲染出来。他们还做了一些合成来使图像更甜美。在一部动画片中,这可能是节目的结尾。

在视觉效果秀上,我们必须通过去除不需要的元素、去除噪音或去除镜头翘曲来准备底片。这是由印版准备(也称为RotoPaint)处理的。

最后,所有的东西都归合成公司了,他们把所有的图像和我们的CG渲染整合到实际的胶片底片上。在视觉效果秀上,这将是最后一个阶段。

我们使用Python将所有这些部分联系在一起。在下一节中,我将先回顾一下发布,然后再描述Python是如何用于各个部门的。

这在很大程度上是传统渠道的核心,以确保资产可以在部门之间共享并被跟踪。

当一个部门认为它的工作准备就绪时,它决定发布它,以便链中的下一个部门可以使用它。例如,建模导出模型,但是动画导出动画吗?嗯,这取决于谁在消费它。这取决于它是否需要在此点之后进行交互。

对于几何体,我们通常只是使用Alembic发布为几何缓存,Alembic是由Imageworks和ILM开发的行业标准,因此我们可以拥有一致的缓存格式。对于点云数据,我们使用Alembic或OpenVDB,对于图像,我们倾向于使用TIFF或OpenEXR。很快,业界可能还会标准化Pixar的通用场景格式OpenUSD。

无论如何,我们的想法通常是以尽可能最有效的格式保存数据,同时允许轻松交换。缓存数据通常是最好的,因为您实际上只接受一次廉价的IO命中,而不是一次可能非常昂贵的变形命中。

不过,这一切都变得非常复杂。艺术家不需要知道他们的数据是从哪里来的或要去哪里,甚至不需要知道它是如何到达那里的。他们只需要能够加载并发布即可。

这就是管道。我们以非常用户友好的方式开发UI和工具来实现这一点。

要发布数据,用户只需打开一个发布UI,该UI将根据一些测试验证他们的资产,然后将其发送到发生到其中一种开放格式转换的机器群。

要接收发布的数据,我们同样只需要一个资源浏览器,让艺术家选择他们想要的资源。他们通常只看到缩略图和描述。细节对大多数艺术家来说都是无关紧要的。

因为这些发布和资产管理系统需要对多个应用程序通用,所以我们使用Python和Qt(PyQt或PySide)开发它们,这使得我们无需为每个应用程序重新编译代码就可以重用我们的代码,并且可以轻松地在需要的地方快速添加功能。

这对几乎每个部门来说都是常见的,所以我认为它应该在这里有自己的部分,而不是每个部分都重复。

建模是负责创建其他部门使用的3D源几何图形的部门,在放置或编辑几何图形,甚至只是管理场景方面,经常涉及到相当多的重复性任务。

这就是Python派上用场的地方。大多数3D软件包都有一个Python API,可以让您执行手动编写的所有操作。

因此,您可以编写脚本,然后在下次需要时只需单击一个按钮,而不是花费10分钟来创建一个简单的资产。节省的10分钟真的很多,在项目过程中,您可能节省了数百个小时,这些时间可以更好地专注于构建需要艺术投入的更复杂的资产。

例如,在我的课程Python for Maya中,我使用Python创建了一个简单的齿轮,并创建了一个简单的UI,以便您可以指定齿轮的齿数和齿长。

不过,使用Python创建自定义变形器或交互工具(如Hans Godard演示的此演示)可能会变得更加复杂。

装备的工作是为角色几何体创建骨架,以便它可以变形,就像真人一样。

当然,这过于简单化了。僵化本质上也是创建动画师用来赋予这些生物生命的界面,但他们也必须确保任何动作都能令人信服地发生。如果动画师移动手臂,装配师必须确保肩膀正确变形。

创建自动构建的钻井平台。可以使用代码组成钻机,而不是手动完成所有工作,这使得钻机易于重用。

在我的课程Python for Maya中,我将介绍如何创建一个控制器库。顾名思义,控制器是动画师用来控制装备的对象。它们不是直接使用几何体,而是使用移动骨架的控件,从而使几何体变形。

我使用Qt开发了一个用户界面,以保存和导入控制器以便于重用。

动画是大多数人都会熟悉的专业。他们拿起静态钻机,让它们动起来,让它们变得情绪化。他们本质上是虚拟演员。

但是正如你可以想象的那样,动画师必须做的很多重复动作也可以用Python编写脚本来消除,或者只是让它们变得更容易。

拾取控制器。复杂的装备可能有数百个控件,这些控件会使视图变得杂乱无章。拾取器界面让动画制作人有一个友好的UI来选择控件,同时将它们隐藏在实际视图中。

创建关键点,特别是中间的关键点。在2D时代,动画制作人会将关键点之间(在姿势之间提供运动的关键点)定义为指向姿势的权重。在3D中,我们可以使用工具来帮助动画师说他们想要将新关键点的权重增加到旧关键点的30%。

设置约束。角色将拾取对象,此时动画制作人必须将对象及其角色约束在一起,以便它们作为一个整体移动。使用处理此常见任务管理的工具可以使这一点变得更容易。

我们使用Python开发大多数工具来完成这类工作,而我们的大多数用户界面使用Qt(通过PyQt或Pyside)进行开发。

在我的课程Python for Maya中,我介绍了如何创建一个补间动画UI,动画制作人可以在其中拖动滑块以在两个姿势之间选择关键点的权重。

现在动画已经完成了角色的动画制作,我们仍然需要弄清楚肌肉、头发和布料,这些更多的是技术上的考虑,但给场景增加了很多深度。

从“纠结”中飘逸的连衣裙到“特兰西瓦尼亚酒店2”中的疯狂头发,再到“自杀小队”中的肌肉模拟,这些都是由角色FX部门处理的。

常常被忽视的是,角色FX是在屏幕上获得真正逼真的图像的非常重要的一步。

这是一个与角色FX完全不同的部门,这个FX部门负责更多的程序效果。

摧毁建筑物、爆炸、魔法粒子甚至整个海洋。这是由特效部门推动的。

他们也使用Python做很多事情,包括设置他们的过程效果、图形和脚本参数,否则手工操作会很耗时。

Python甚至可以用来创建生成有趣效果的整个程序节点。它非常强大。

现在已经创建了所有的3D几何体,我们需要将其转换为可以在屏幕上显示的图像,但如果我们只是这样做,它将是黑色的。

灯光负责给场景增加灯光,使其看起来像电影院一样有趣。他们可以设定拍摄的气氛,即使什么都没有发生,也能让镜头变得黑暗和危险,或者是快乐和充满活力的。

即使在这里,Python也可能非常有用,因为一个场景可能有很多很多灯光和很多很多3D资源。在这里,我们可以制作UI,帮助使这些场景易于管理。

通常包含数十亿甚至数万亿对象的场景可以归结为简单的用户界面。

在我的课程Python for Maya中,我回顾了使用PyMEL和Qt创建照明管理器的过程,以生成一个允许我们控制场景中所有灯光的UI。它还会将它们导入和导出为JSON文件,以便可以在快照和艺术家之间共享。

一旦照明完成,就可以将场景转换为图像了。这是使用Arnold、Renderman或Vray等渲染器来完成的。

在这里,我们获取最终的素材和任何渲染的元素(如果有),并将它们组合在一起。这不仅仅是组合,因为你需要确保所有东西都很好地整合在一起,让人感觉它们都是一个凝聚力很强的形象。

人们通常认为视觉效果是在顶部的爆炸和生物之上,但它甚至可以是微妙的东西,比如背景替换,或者增加人群。

它可以用于在Nuke等应用程序中自动设置合成节点图,但也可以使用OpenColorIO或Pillow等库自行执行整个图像处理操作。

我们甚至可以使用Python for computer Vision来帮助跟踪场景中的对象,这种可能性真的非常令人兴奋。

我希望这篇博客文章能很好地了解编程是如何成为当今生活中如此重要的一部分,更具体地说,是如何让Python本身变得如此有用。

它确保我们可以迅速简化所有这些移动部件之间非常复杂的关系,并使每个部门能够更高效地工作。

它经常被忽视,因为它不是这个过程的艺术部分,你很少在银幕上看到它的直接结果,但尽管如此,它在将这些日益复杂的电影搬上大银幕方面越来越有价值。