电影中的数学


我们都曾经对电影里呈现出来的一些电脑制作的精美画面惊叹不已,可很多人不知道的是,如果没有数学,我们就无法看到诸如《侏罗纪公园》里的恐龙和《指环王》里的奇景,尤其是Gollum超炫的旋转。

这些令人啧啧称奇的画面是怎么做出来的呢?答案是计算机图形学和计算机视觉学。本文将简单讨论一下一部电影是如何在数学的帮助下制作完成的。我们首先讨论如何描述我们所看到的电影画面,然后我们将讨论如何鲜活地呈现这些电影画面。

场景设置

首先,目标都用诸如三角形等简单多胞形组成的网格来表示

使用电脑制作一部电影的第一步是创造电影故事的人物以及这些人物所处的环境。这些目标都是用一些相连的多边形(通常是三角形)组成的曲面来表示。电脑要将每一个三角形的顶点记录下来。而且非常重要的一点是,电脑需要知道用于表示一个人物或目标的三角形的外部。注意一个三角形的外部是可以由右手旋转法则唯一确定的。这里右手旋转法则的意思是指我们的右手只有唯一的一个方式可以顺着一个三角形的给定的顶点顺序握紧拳头。这时候大拇指将指向三角形的一面,而这一面我们就定义为三角形的外部。读者可以试一下下面这个简单的例子。你可以发现三角形(A,B,C)的外部(或者叫外部法向量)正好与三角形(A,C,B)的外部方向相反。

根据右手旋转法则,(A,B,C)的外法向与(A,C,B)的外法向方向相反

我们用三角形组成的网格来表示一个目标的表面。接下来我们就应该对每个三角形着色了。其中很重要的一点是我们需要准确地描述我们所关心的场景的光照。这一任务通常是由一种叫光线追踪的过程完成。从我们的视点出发,我们反向追踪那些一个目标发出的通过反射后会进入我们眼睛的光线。如果一个光源发出的光线经过一个小平面(也就是组成目标的表面的一个三角形)的反射后会进入我们的眼睛,那这个小平面就应该是亮色。这样看上去就像是这个小平面被该光源照亮。反之,这个小平面就着上更暗的颜色。

从我们的视角出发,反向光线追踪一个小平面。这个小平面会反射一个光源的光线吗?

为了通过光线反向追踪到一个特定的小平面,我们需要用数学知识来表示一个目标的表面,并且需要求解一些涉及到光线和这个小平面所确定的二维平面的几何方程。这时候向量的概念就很重要了。对我们关心的场景,我们可以建立一个以视点为原点(即(0,0,0)这一点)的三维坐标系统。一个向量v=(a,b,c)表示的是一个从原点出发的矢量,其中在各个坐标轴上的坐标值分别是a,b和c。我们可以将向量v乘以一个常数。比如说,v乘以2,我们得到的新向量定义为

$2v=2(a,b,c)=(2a,2b,2c)$

因此,2v是一个与v同方向的,但长度是v两倍的向量。

现在我们看一下v这个表达式,其中$\lambda$是一个变量。也就是说,$\lambda$可以是任意实数。由于此时长度是个变量了,这个表达式也就仅仅能表示一个确定的方向,而无法表示一个有确定长度的矢量。换句话说,这个表达式表示了包含向量v的整条线。它表示了一条与v同样方向的从原点出发的直线,或者说从我们视点出发的光线。

由三角形小平面确定的二维平面可以由三条信息来描述:一个顶点(记为a1)的位置,以及表示从a1到a2和a3这两条直线的向量。

下面的方框里,我们列出两类表达式:即从视点出发的光线方程以及三角形小平面确定的二维平面方程。为了确定一条光线是否通过一个三角形小平面和他们相交的位置,以及计算反射光线方程,这两类表达式在我们需要求解的方程里都会出现。

光线方程:r=$\lambda$v,其中$\lambda$是一个实数,v是一个向量。

定点是$a_1$,$a_2$和$a_3$的三角形确定的平面方程:

$\lambda= a_1+\mu_1(a_1- a_1) +\mu_2(a_3- a_1)$.
Doom 3和Neverwinter nights等电脑游戏需要动态光照

通过光线追踪技术,我们可以制作出很逼真的场景。但这个过程非常耗时。如果用电脑来制作电影,这或许不是什么大问题。但是对于电脑游戏制作等,我们需要不停地快速改变场景的光照。这时使用光线追踪技术的话,速度就显得不够了。对于诸如阴影、散焦、多重反射等更复杂的现象,动态地建立数学模型来刻画这些情节是不容易的。这时候,我们需要更复杂的数学模型,比如预计算辐射传输光能传输。

我们需要的只是一点想象力

场景的设置和光照都准备好了,等导演一喊“开拍”,我们的人物就要动起来了。现在我们看一下如何呈现鲜活的电影画面。

一个目标需要完成的最基本的动作就是顺着一个给定的轴旋转一个角度。坐标几何学为我们提供了工具,使得我们可以准确地计算目标旋转后的每一个点的位置,而且,这一工具十分的快速有效。

为了理解这一工具,我们还是先补充一点数学知识。我们知道25这个数有两个平方根,即+5和-5,因为$(+5)^2=(-5)^2=25$。但是-25的平方根又是多少呢?为了求解负数的平方根,数学家定义了一个新的数。这个数用i来表示,并且$i^2=-1$。这样,因为$(\pm5i)^2=25i^2=-25$,所以我们可以得到$\sqrt{-25}=\pm5i$。

由于i的引入,类似于$x^2=-1$这样的方程也可以求解了。事实上,形式上写成z=x+iy这样的复数是数学中非常重要的一个工具,尽管历史上曾经有很多人不喜欢这个想象出来的数。

业余数学家Jean-Robert Argand在1806年最先给出了复数和i这个数的几何解释。Argand将复数与二维平面中的点联系起来了:即复数的实数部分与虚数部分分别由两个坐标轴来表示。比如,1+i这个复数对应到(1,1)这个点。一般的情形是,a+bi这个复数对应(a,b)这个点。

复数的乘法有几何解释---旋转

Argand还意识到复数的乘法也有一个几何描述:旋转。我们可以看一下(1,1)这个点表示的复数1+i如果乘以i会得到什么结果:

$i(1+i)=i-1=-1+i$,

即得到了(-1,1)这个点,也就是说由原来的点旋转90度得到的点。再次乘以i,我们得到:

$i(-1+i)=i-1=-1+i$

即得到(-1,-1)这个点,也就是说又旋转了90度。用数i去做乘法得到的效果是旋转90度!事实上,不仅仅是90这个角度,任何的旋转角度都可以通过乘以某一个复数来实现。

3D画面

数学家汉密尔顿(Sir William Rowan Hamilton)可能是都柏林三一学院(Trinity College Dublin)最有名的校友。他在人生的最后二十年一直致力于找到一个类似二维空间里的复数那样的数来表示三维空间的旋转。

Hamilton产生四元数灵感时经过的Broome桥上的纪念牌匾

在他人生的最后时刻,汉密尔顿找到了答案。他把这些数命名为四元数,其表达式是

$q=a_0+a_1i+a_2j+a_3k$,

其中$i^2=j^2=k^2=-1$,而$a_0,a_1,a_2和a_3$都是实数。

正如我们对复数的讨论一样,我们可以用几何来解释四元数并用他们来描述旋转。但这时我们考虑的是三维空间里的旋转。

具体来说,我们用i,j,k来表示三维空间的基本平面:即i表示yz平面,j表示xz平面,k表示xy平面,它们各自的外部法向分别是x,y,z。

几何上,i,j,k用来分别表示三维空间的三个基本平面

如果我们想将点$a=(a_1,a_2,a_3)$沿着一个旋转轴(方向由$b=(b_1,b_2,b_3)$给出)绕原点旋转β度。我们先用旋转轴向量b和旋转角度β构造两个四元数$q_1$和$q_2$:

$\begin{array}{} q_1=\cos(\beta/2)+\sin(\beta/2)(b_1i+b_2j+b_3k), \\ q_2=\cos(\beta/2)-\sin(\beta/2)(b_1i+b_2j+b_3k). \end{array}$

然后,我们用这两个四元数去乘一个数a。注意a表示为x,y,z三个坐标轴的单位向量的组合,而乘法遵从适用于平面i,j,k以及单位向量的特殊准则。这样我们得到

$a’=q_1aq_2。$

可以验证,$a'$这个点就是将a这个点绕着给点转轴旋转β角度而得到的点。因此,正如二维空间里的旋转可以用复数来表示一样,我们可以用四元数来表示三维空间里的旋转。

汉密尔顿这一在都柏林的一座桥下散步时产生的灵感,成为刻画三维空间里旋转的最有效的工具。但是也有人不喜欢他定义的这个新乘法。物理学家Lord Kelvin就曾经这样评价四元数“虽然十分巧妙,但对任何接触过它的人而言都绝对是一个祸患!”

从实用角度看,有人觉得四元数的一个不方便之处是两个四元数相乘,其结果取决于二者相乘的次序,也即四元数乘法的不可交换性。举例来说,根据Hamilton的准则,我们可以得到ij=k以及ji=-k。可是,如果我们将i,j,k看成是基本平面,那些令开尔文(Lord Kelvin)和他同时代的人所担心的四元数的性质是显而易见成立的。

逼真画面的制作

汉密尔顿的发明现在在图形应用领域里被广泛的使用,用以描述目标的移动和动作。在计算机图形学里,两个最重要的工具是变形和插值。插值和一种叫关键帧的技术用来确定一个目标的初始和终止形状和位置,并使用计算机将中间状态描述出来。下图是一个例子。

茶壶的形状在一系列时间点上的变化

读者可以在网上下载一些程序,来看看Richard Wareham是如何通过动画来制作一条发育不完全的小蛇。给点几个指定的点,这些程序便可以使用插值技术逐渐呈现出一条蛇的形状。

变形则可以帮助我们由一些简单的目标制作成复杂的目标。如下图所示,通过一些数学的处理,一块搭在变形曲面上的布可以由一个很规则的曲面来生成。变形与插值都需要快速稳定的数学技术以及与四元数相关的方法。

首先可以用物理知识来建立模型刻画一块搭在圆形曲面上的布 然后再想办法生成一块搭在变形曲面上的布

如何制作逼真的Gollum

上述技术都是制作经典动画的核心技术。事实上这些技术制作出来的卡通人物是十分逼真的。但是,这些技术如果用来制作真人的话,我们马上能看出来效果并不好。为了制作逼真的人物画面,动作抓取这个技术就很有必要了。

很多人物,例如电影版的《指环王》里的Gollum是由动作抓取技术来完成的。通常我们需要安置一些反射器来表示一个人身体的关键部分,例如头、肩膀、肘关节、膝盖等。每一个人都由好几套摄影器来拍摄,并且要用电脑记录这些反射器的位置变换。我们再用三维的数据来填充一个人的骨架。最后,前面所述的所有技术都会用来给骨骼部位添上肌肉,从而制作出鲜活的、有呼吸的、和会运动的人物。

我们根据分散在身体各个部位的反射器的运动来收集数据 骨骼的模型在数学上与这些数据匹配

如果你试过看完一部电影的完整的职员表,你会发现一部成功的电影需要融合各种人才的聪明才智,比如编剧、导演、演员、服装设计、布景等等等等。但是还有一个名字常常被电影的职员表所忽略,那就是数学家。假如没有摄像追踪技术或空间四元数旋转物体,今天很多火爆的电影根本不可能与观众见面。所以,下次当你再次走进电影院享受这些数字技术带来的精美场面时,不妨举起你的爆米花向我们的幕后英雄----数学家致敬吧!

原文链接: http://plus.maths.org/content/maths-goes-movies?src=aop
作  者: Joan Lasenby
翻  译: 袁晓明博士,香港浸会大学
校  对: 汤涛,香港浸会大学数学讲座教授