电影背后的数学魔法

翻译小组成员介绍: 毛线团君

[遇见数学] 翻译组视频 PM. 双鸭山数学学院某肥宅,梦想是无戒口地吃,无限时地睡,无止境地学。_(:3」∠)_

文章: plus.maths.org/content/maths-goes-movies

译者: 毛线团君

电影中的数学

爆米花拿稳啊? 座位选好了? 舒服坐下了吗?让我们拉开序幕...

华丽的出场

我们都对电影中那些由电脑生成的逼真图像感到惊叹不已,然而, 我们中大多数人都没有意识到, 如果没有数学的话, 侏罗纪公园中的恐龙和指环王中的奇迹(尤其是咕噜的人格分裂那部分)都将是空中楼阁。

但是,这些惊人的图像是如何产生的呢?计算机图形和计算机视觉都是很深奥的学科。在这篇文章中,我们将走马观花地看一看最终产品中所体现的数学。首先,我们会创造出电影中的世界,然后,慢慢把梦想照进现实。


情景设置

第一个模型被做成了线型骨架,它由以三角形为主的简单多边形构成

做一部电脑生成的电影,第一步就是对电影中的角色和角色生活的环境进行建模。我们用多边形(绝大多数是三角形)拼成每个物体的表面。其中,每个三角形的三个顶点都被储存在计算机的数据库中。其中很重要的一点就是要知道三角形哪一面是朝外的。(如果是另一面朝外的话就相当于跟上一面呈镜面对称,虽然两个三角形是全等的,但是在计算机建模中二者并不等价。可以通过镜面对称或者高中化学课本上的分子手性来理解。)这个信息的编码可以理解为一个三维的数据,这个三维数据的每一个分量都是按右手螺旋定则排列的三角形顶点坐标。我们如何理解右手螺旋定则呢?就是拿出你的右手,拇指朝向三角形朝外的一面,以右手四指朝向的方向来决定三个顶点排列的顺序。这样我们通过三个顶点排列的顺序可以判断出三角形哪一面朝外。如果我们已知朝外的是哪一面的话可以通过这个定则来判断顶点的排列顺序。如图所示,我们来看一个例子。你可以通过顶点的排列顺序判断出三角形朝外的方向(我们称之为外向法线)。三角形(A,B,C)的是与三角形(A,C,B)相反的。

根据右手螺旋定则,三角形(A,B,C)的外向法线与三角形(A,C,B)是相反的

既然我们的物体表面在计算机建模中被呈现为像剖分网格一样的多边形图像,我们就可以很容易地为每个多边形上色。在这里,如果要让你电脑中的物体变得逼真,就必须要仔细观察,捕捉场景中的光线。这要经过一个叫做"光线追踪"的计算过程。从你的视角出发,我们回溯光线来的方向,经过物体,然后让物体把光线反射回去。如果我们回溯射进我们眼睛的光线,这条光线曾被一个模型上的小平面(小三角形)反射,并最后穿过某个光源,我们就用比较亮的颜色来给这个小平面上色,这看起来就像是它被光源照亮了一样。如果这条光线没有经过光源,我们就用暗一点的颜色给它上色。

从你的眼睛开始,追溯一条光线,它会被物体表面反射吗?最终穿过光源吗?追溯一条光线经过的平面,我们需要用数据来描述这个平面,再解出有关光线和平面几何关系的方程。我们用向量来解决这个问题。在建模的场景中,我们以的眼睛为原点建立一个三维直角坐标系。一个向量 a,b,c 
现在表示一个从原点开始的箭头。这个箭头指向坐标为(a,b,c)的点。向量可以数乘,就是用一个实数去乘以它。例如说乘 2,方法是:2v=2(a,b,c)=(2a,2b,2c)2v=2(a,b,c)=(2a,2b,3c)所以,向量 2v
 表示的是一个方向不变,长度是原来的两倍的新向量。

现在看 λv 这个表达式,λ 
是一个可变的参数,它可以是任意实数。它代表的不再是一个长度固定的箭头,因为长度是可变的。向量只有两个维度的参数,一个是方向,一个是长度。这样的表达方式从长度中抽象出来,成了一个只有方向没有长度的箭头(射线)。换句话说,这样的表达式更适合只有方向,没有固定长度的光线。它描述了一条从我们的眼睛传出的,与向量 同一方向的直线(光线)。

这个三角形的小平面所在的二维平面可以用三角形的三个元素表示(类比两个不重合的点确定一条直线的定理,这里由任意三个不共线的点可以确定一个平面),这三个元素分别是点 a1
的坐标,点 a1
到点 a2 
的向量和点 a1 
到 a3 
的向量。

下面的等式描述了来自我们眼睛的光线和小三角形所在平面的几何关系。我们的目的是弄清楚这条光线是否与小三角形相交并找出交点的位置,然后计算反射光线的方程。我们需要解出有关这两个表达式的方程。

光线的方程是 r=λv ,其中 λ 
是实数,v 是向量。

小三角形所在平面的方程是 r=a1+μ1(a2−a1)+μ2(a3−a1)

(这里只提供一个大概的算法,具体的光线回溯算法细节你可以参考杂志Communications of the ACM(CACM)第23卷第6期上Turner Whitted所作的突破性论文《一种改进的阴影显示光照模型》)

光线跟踪可以还原最真实的场景,但是这个算法太慢了。在我们用电脑生成电影的时候,这个算法的速度是可以接受的。但是当你在真实场景中需要变换光线的时候,算法的速度就成了一个问题。比如说在电脑游戏中。像阴影、焦散、多次反射这样的复杂光学现象,就很难被活灵活现地还原出来。我们需要用更加复杂精妙的算法来处理这些现象,例如预计算辐射度传递(PRT)算法或者辐射度算法。

一些电脑游戏,比如说毁灭战士3和无冬之夜,就需要动态光线


万事俱备, 只需要更多一点想象力

一旦我们的场景调试完毕并投入使用,在等待导演的一声"Action!"后,我们的角色就开始了他们的行动。现在就让我们调试算法,让我们的图像动起来。

最基本的运动之一就是让一个东西绕着给定的轴旋转特定的角度。坐标几何赋予了我们计算旋转后每个点坐标的工具,但怎么加快这个工具的计算速度是个问题。

为了找到这个工具,让我们回到数学课堂中。我们知道25有两个平方根,5 
和 −5
,因为52=(-5)2=25
. 但是的平方根是什么呢?为了找出负数的平方根,数学家们发明出了一个新的数,叫做 i
,使 i2=-1 。那么我们发现√−25=±5i


的引入意味着像 x2=-1 
的方程可以被解出来了。形如这样 z=x+iy 
的数叫做复数。复数成为了数学中一个重要的工具。但是很多人仍旧不喜欢这个新的、想象出来的数字i。(你可以阅读关于复数的简短介绍《不可能的数字:复数》或今日发布复数的相关视频)

最后在1806年,业余数学家Jean-Robert Argand给了复数一个几何解释。Argand将复数与平面上的一个点联系起来。以一条轴的单位长度为1,另一条轴的单位长度为 i 
。比如说就对应平面上点(1,1)。更平常地,一个复数就对应点(a,b).

复数的乘法具有几何描述-旋转

Argand注意到复数的乘法有一个几何描述: 旋转。如果我们将 1+i 
(用坐标点(1,1)表示)乘以 i
,会发生什么呢?i(1+i)=i−1=−1+ii(1+i)=i−1=−1+i这个结果可以用坐标点(-1,1)表示,相当于点(1,1)逆时针旋转了90°。再用它乘以i,我们得到:i(−1+i)=−i−1=−1−ii(−1+i)=−i−1=−1−i这个结果可以用坐标点(-1,-1)表示,又一个90°的旋转!事实上,任何旋转,不止是90度的旋转,都可以被看作是乘以一个复数的结果。

这块纪念碑现在在布鲁姆桥上,哈密尔顿发现四元数时就从这座桥下走过


步入 3D 世界

数学家William Rowan Hamilton也许是都柏林圣三一学院最有名的学生了。他将他生命中最后二十年全部献给了三元数的寻找。他想要定义出一个三元数,使这个三元数的乘法与复数在二维平面上的行为有相似之处。到他生命即将燃尽的时候,他终于发现了答案,也就是四元数。四元数的形式是q=a0+a1i+a2j+a3kq=a0+a1i+a2j+a3k其中 i2=j2=k2=ijk=−1
,且 a0,a1, a2,a3
 是实数。

就像我们使用复数一样,我们可以在几何上描述四元数并且用他们来表示旋转。但是这一回,旋转就不是在二维平面上,而是在三维空间中了。

这么做的话,i,j 
和 k 
就代表了三维空间坐标系中的几个平面。也就是说,i 代表了yz 
平面,j 代表了xz 
平面, 而 k 代表了xy 
平面。而这几个平面的外向法线分别是 x,−y,z
轴的方向。

i
代表了三维坐标系中的yOz平面,j
代表了xOz
 平面, 而k
代表了xOy
平面

假设我们想要让点a=(a1,a2,a3)
绕着向量b=(b1,b2,b3)
的方向旋转 β 
度。我们构造出两个四元数 q1
和 q2
.q1=cos(β/2)+sin(β/2)+(b1i+b2j+b3k)q1=cos(β/2)+sin(β/2)+(b1i+b2j+b3k)q2=cos(β/2)−sin(β/2)+(b1i+b2j+b3k)q2=cos(β/2)−sin(β/2)+(b1i+b2j+b3k)
然后我们把点 a 用 x,y,z 
方向的单位向量表示为一个四元数,再分别乘以两个四元数(遵循某些特定的法则)你会发现算出来的结果 a' 
点正是你按照给定坐标轴出的角度旋转度的坐标!所以就像是复数可以用来描述平面上的旋转一样,四元数可以被用来描述三维空间的旋转。

哈密尔顿走过都柏林那座桥下时的灵光一闪,成为了描述三维旋转的效率最高的方法。但是也不是所有人对他的这个算法表示喜闻乐见。物理学家开尔文男爵对四元数发表言论"...就算这个算法是美妙且天才的,但它对于那些接触过它的人来说就是一个纯粹的恶魔。"

这让人们尤其担心的是,当你乘两个四元数得到答案的时候,这个答案跟四元数的顺序有关。也就是说,四元数的乘法不满足交换律。比如说,从哈密尔顿的乘法规则来看,我们可以发现 ij=k 
但是 ji=−k 
。然而我们同样可以发现,如果你把 i,j,k 
看作是基础平面的话,在开尔文男爵和他的那一辈人的时代,确实是令人担忧的。(译者注:这里的令人担忧可以理解为打破了人们的常识并打破了一些传统的数学体系。环球科学杂志中的一篇科普文章中提到,当代我们已经证明了八元数是最高维度的数,也只存在实数,复数,四元数以及八元数四种维度的数。在已经发现了八元数的当代,我们了解到,每升一次维,这些数字都会丢失一些原有的性质。比如说复数与实数相比,不可比较大小,四元数与复数相比,没有交换律,八元数与四元数相比,没有结合律。)

让图像活过来

哈密尔顿的发明现在被应用在物体的移动中。计算机图像中两个最重要的工具是形变和插补。插补和关键帧的技巧与确定图像的初始和结束的位置和形状有关,我们要让电脑按照给定的中间步骤来得到图像初始和结束的位置和形状,如下图所述。

茶壶的形状按照一系列命令逐渐改变

我们只要知道几个点的运动,就可以使用计算机插值构造出整条蛇,并可以看到像素蛇的动画(Richard Wareham制作)。

变形是用简单的图形得到复杂图形的一种方法。一块布从正常的球面上掉下来,就像下图一样,可以衍生出布从一个变形的球上掉下来的图像,这种衍生需要一些数学的算法。变形和插值都需要迅速而稳定的数学技巧和一些有关四元数的算法。

一块布从一个圆球上掉下来可以通过一些物理定律得出

然后通过某些操作我们可以得到一块布从变形的球上掉下来的画面

让咕噜变得更活灵活现

这些技巧描述了经典动画中的一个基本工具。我们非常乐意相信这些结果可以用于卡通人物的建模。但是当他们被用在动画人物身上,我们立即发现这是错的。为了创造一个逼真的动作,一般来说我们都需要"动作捕捉"。

很多角色,像《指环王》中的咕噜一样,是用"动作捕捉"来建模的。这个算法需要把传感器装在真人的一些重要身体部位上——头、肩膀、肘部,膝盖等。这个个体的运动就会被记录下来并传递到电脑上。一个由这些数据构成的3D骨架就这么被构建出来。最后,上面描述的所有技巧都是用来把这个骨架填充成一个有血有肉,能够自如呼吸和移动的角色的。

运动的数据会从附着在人类身体上的传感器传回电脑并被记录

一个关于那些数据的骨架完成了

如果你在等着看电影最末彩蛋之前,还会看到一大波创造性的天才前呼后拥地加入电影的制作:编剧、导演、演员、造型师、道具师...以及很多很多无名之人。这个光荣的名单上,有一个名字经常会被遗漏——数学家。现在的电影很多都离不开光线追踪的几何学或者四元数的空间旋转。所以下一次,你拿着爆米花在电影院里坐下来享受精彩的CG动画的时候,请记得向荧幕后的无名英雄——数学家稍稍致意。(完)

(0)

相关推荐