浅谈游戏、动画、音乐中的数学

作者:HK-SHAO

PS:此文为选修课程《数学之美》汇报的文稿
顺便发到0xFFFF为软协论坛引点流量


进入正题之前

​ 除了大自然,其实生活中也处处可见数学,我们经常接触到的商业或艺术作品,例如游戏、动画和音乐中也可以见到数学的影子。有时候从数学的角度重新思考和审视这些作品,不仅能够帮助我们洞察现象背后的原因,以帮助我们更好的进行艺术创作,还能使我们从一个全新的角度去重新欣赏艺术作品中的美。

​ 接下来我会从游戏、动画以及音乐三个方面去介绍其中涉及的数学原理。每个方面仅作介绍和发散,而不作深入解读,如果读者想深入了解某内容,可以上网查阅相关资料。

01 动画、音乐以及游戏

​ 广义上来说,动画是“运动起来的画面”,音乐是“运动起来的音符”,而游戏则是“交互式的动画和音乐”。

​ 我们小时候可能手绘过翻页动画,有些人可能曾用过 Adobe Flash 一帧一帧做过动画,而经典的宫崎骏动画电影则是将画面一张一张手绘到赛璐珞塑料卡纸上。当连贯的画面以一定帧率轮番切换时,由于人眼的视觉暂留现象而使人产生了画面运动起来的错觉,这便是动画的原理。

​ 也许弹过钢琴或者弹过吉他的人知道,随着时间的流逝而弹奏出不同响度和和音调的声音便是“运动起来的音符”。我们知道声音有三个属性:响度、音调和音色,当这三个属性随着时间而变化时,音乐便产生了。在编曲软件中,横轴代表时间、纵轴代表音高,而每一个台阶便是一个音符,高高低低起伏的台阶便代表着音乐。

​ 不同于动画和音乐仅仅是在其原子(图像和音符)上多了时间一个维度,游戏在动画和音乐的基础上又多了与玩家交互的一个新的维度,玩家能通过交互来改变游戏中的画面和音乐(音效),这便产生了游戏。游戏是动画、音乐、文学等多种艺术的集中表达,而且根据不同类型往往又会涉及程序设计、物理学、算法、图形学甚至 AI 多个学科,作为集大成者其往往蕴含大量数学原理。

02 碰撞而产生的 \Large\pi

​ 现代 3D 动画和游戏经常涉及物理的模拟,而如今的计算机图形学便专攻这一领域的难题(例如刚体物理模拟,流体模拟等)。为了引出动画以及游戏物理中的数学问题,接下来的故事将会将我们梦回高中物理,以一个简单的问题开始。

​ 在一个完全光滑的地面和墙壁内侧放置着质量分别为 m,M 的两个方块,当大方块以某个速度撞击小方块后,小方块会以某个速度撞击墙壁(整个过程中发生的一切碰撞均为完全弹性碰撞)。

请思考:如果 m=M ,整个过程将会发生几次碰撞?

​ 为了探究这个问题,我尝试分别用一个 C 语言程序和 3D 建模软件 Blender 进行了物理模拟,而模拟结果让人非常震惊!

​ C 语言程序进行了 6000000FPS 200 秒的模拟:

#include <stdio.h>

struct Ball {
    double m;
    double x;
    double v;
};
const double dt = 1e-6;
const double r = 1e-1;
Ball b1 = { 1., 1., 0. };
Ball b2 = { 1e10, 2., -1. };

int main(void)
{
    int cnt = 0;
    double d;
    double tv;
    double em = (b1.m - b2.m) / (b1.m + b2.m);
    double sv;
    double t = 0.;
    for (; t < 200.; t += dt) {
        if (b1.x < r) {
            b1.v = -b1.v;
            cnt++;
        }
        d = b1.x - b2.x;
        if (d > -r && d < r) {
            sv = em * (b1.v - b2.v);
            tv = b1.v;
            b1.v = sv + b2.v;
            b2.v = sv + tv;
            cnt++;
        }
        if (b1.v > 0 && b2.v > 0 && b2.v > b1.v) {
            break;
        }
        b1.x += b1.v * dt;
        b2.x += b2.v * dt;
    }
    printf("%d", cnt);
    return 0;
}

​ 最终得到结果 314159

image-20210303195426460

​ 看上去似乎没什么意思,但是精彩的部分来了,碰撞次数 N 和两个滑块的质量比 M/m 有着如下微妙的关系:

\begin{align} M/m&=100^0,N=3\\ M/m&=100^1,N=31\\ M/m&=100^2,N=314\\ M/m&=100^3,N=3141\\ M/m&=100^4,N=31415\\ M/m&=100^5,N=314159\\ &\cdots\\ \end{align}

请思考:你发现了什么规律吗?

​ 是的,没错!当 100 的幂以整数逐渐增大时,整个过程的碰撞次数产生圆周率 \pi

​ 为什么简单的物理碰撞能够产生圆周率 \pi 呢?实际上答案能够从碰撞过程中的能量守恒和动量守恒得到。

​ 能量守恒:

\frac{\mathrm{d}}{\mathrm{d} t} \left ( \frac{1}{2}mv_1^2 + \frac{1}{2}Mv_2^2 \right )=0\\

​ 动量守恒:

\frac{\mathrm{d}}{\mathrm{d} t} \left ( mv_1+Mv_2 \right ) = 0

​ 通过几何表示以及寻找一些几何关系

​ 最终可以得到,当 M/m=100^n,n\in \mathbb{N} 时,整个物理过程的碰撞次数为

\begin{aligned} N &= \left\lceil \frac{\pi}{\arctan{\left(10^{-n}\right)}} \right\rceil - 1 \\ &= {\huge \color{darkgreen} { \left\lceil \pi \cdot 10^n \right\rceil - 1 }} \end{aligned}

​ 如此一来我们便得到了此物理现象背后的平凡解。拥有了平凡解,我们便不需要计算机复杂的物理模拟和大量的计算,只要代入公式我们便能一步到位得到答案,这便是数学的魅力,我们发现简单的物理背后竟然蕴含着如此美妙的数学原理。

03 平滑的动画

​ 动画在生活中经常出现,这里的动画指的不是狭义上在 bilibili 看到的新番,也不是电视机上播放的卡通动画,而是时间轴上的图像序列。也许我们在制作 PPT 时会为幻灯片添加切换动画,也许在点击鼠标之后 PPT 中某个元素会出现淡入淡出、平移、旋转、缩放等形式的动画。在手机系统中,当我们点击某个 APP 图标之后会出现图标放大然后逐渐淡入新界面的动画;在 Windows 系统中,当我们按下 Win 按钮后开始菜单会出现弹出的动画。

​ 好的动画通常在视觉上让人感觉连贯、平滑以及符合物理,给人带来流畅和舒适的视觉体验,这在苹果的 Mac OS 上以及一些优秀的 PPT 作品中表现尤为突出。人的感知能直接分辨出一个动画是否平滑、连贯且舒适,而动画可以被分为线性动画和非线性动画两大类,通常合适的非线性动画要比线性动画更为舒适。

​ 在一些 3D 动画软件、Adobe 的 After Effects(简称 AE )、甚至 MikuMikuDance(简称 MMD )中,通常由用户手动设定动画曲线。

查看源图像

​ 而在此,我将介绍一种通常被命名为 smooth 的平滑曲线,它在非线性动画领域被广泛应用,而在笔者团队制作的一个游戏中,节点的动画效果和摄影机的自动平滑缩放效果均采用了这个曲线,达到了非常好的动画效果。

​ 我们观察可以发现,smooth 曲线定义在 \mathbb{R} 上的 S 形曲线,值域为 (0,1) ,并且变化非常缓和。事实上, smooth 曲线是微分方程 y'=y(1-y) 的解,只需一点点高数知识,我们便可以求解这个微分方程。

\begin{align} \frac{\mathrm{d} y}{\mathrm{d} x}&=y(1-y)\\ \frac{\mathrm{d} y}{y(1-y)}&=\mathrm{d} x\\ \int\frac{\mathrm{d} y}{y(1-y)}&=\int\mathrm{d} x\\ \int\left (\frac{1}{y}+\frac{1}{1-y}\right ) \mathrm{d} y&=\int\mathrm{d} x\\ \ln\left ( \frac{y}{1-y}\right )&=x+C \\ \frac{y}{1-y}&=\exp(x+C) \end{align}

​ 如果常数 C0 ,最后可以化成 \color{darkgreen}\Large y=\frac{1}{\exp(-x)+1} 。了解深度学习的同学可能会意识到,这其实就是神经网络模型中的 sigmoid 函数(事实上 sigmoid 是 step smooth 的谐音)。在神经网络模型中,每一个神经元都可以用一个数学模型 y= a(Wx + b) 来表达,其中 y,a,W,x,b 分别是这个神经元的输出、激活函数、权重、输入和偏置,而 sigmoid 作为非线性激活函数在深度学习领域应用非常广泛。

​ 这个函数曲线是 S 形的,所以高中生物将其称作 S 形曲线。而它也被称作 Logistic 函数,传染病动力学(如基于 Logistic 回归的传染病模型)中常见其身影。由于在计算机上进行 \exp 指数运算可能不够稳定,而且运算量较大,所以可以将其麦克劳林展开,然后取前几项进行简化运算。

\text{smooth}(x)=\begin{cases} -1 & \text{ if } x<-2 \\ \large\frac{6}{5}\left ( \frac{1}{2}+\frac{x}{4}-\frac{x^3}{48} \right ) & \text{ if } x\in[-2,2] \\ +1 & \text{ if } x>+2 \end{cases}

04 混沌蝴蝶(Chaos)

​ 上述动画曲线在应用时确实非常优美和自然,但是当其表达式换一个形式之后可能就可能会进入混沌的边缘。

​ 将 y'=y(1-y) 转变为 y\leftarrow \mu\cdot y(1-y) ,这是一个迭代式,其可以改写为一个递推数列 X_{n+1}=\mu X_n(1-X_n) 。如果我们设置 X 的初值 X_0=0.5 ,然后以递推次数 n 为横轴, X_n 的值为纵轴,系数 \mu 为时间轴来可视化这个数列的图像,便能够看到让人奇特的现象,下面通过视频展示以上过程。

​ 如果以 \mu 为横轴, X_n 为纵轴( n 是一个足够大的数),便能够绘制出被称作倍周期分岔图的奇特图像。

​ 在倍周期分岔图中,我们能够直观的看到当 \mu 足够大时,原本的曲线会剧烈震荡以至于产生杂乱无章的混沌(Chaos)现象( x 的微小改变足以导致结果的巨大改变)。1975年,费根鲍姆证明这种周期倍增分岔每次发生时的参数之间的差率是一个常数,同样的常数适用于所有非线性迭代产生的倍周期分岔现象,这个常数被称作费根鲍姆常数,它的定义是:

\delta=\lim_{n→\infty}\frac{X_n-X_{n-1}}{X_{n+1}-X_n}=4.6692016091\cdots

​ 也许你听说过蝴蝶效应,一个蝴蝶扇动一下翅膀,就有可能引起地球另一边产生一次风暴。科幻作家刘慈欣在短篇小说《混沌蝴蝶》中也有相关介绍。西方曾有民谣:

“少了一个铁钉,丢了一只马掌。
 丢了一只马掌,跑了一匹战马。
 跑了一匹战马,败了一场战役。
 败了一场战役,失了一个国家。”

​ 这个民谣非常形象的为我们展示了微小的改变足以产生巨大的后果,这便是混沌。

​ 天气难以准确预报也是因为气象系统是混沌系统的原因,美国气象学家洛伦兹(Lorenz,E. N.)曾提出过一个混沌现象的简化模型——一个常微分方程组——洛伦兹方程。

\large\left\{ \begin{align} \dot{x}&=\sigma(y-x)\\ \dot{y}&=rx-y-xz\\ \dot{z}&=xy-bz \end{align} \right.

​ 在三维空间中设置初始坐标进行迭代计算,便能够绘制出类似下面这样蝴蝶形状的混沌图案,因此他将其称作混沌蝴蝶。

查看源图像

​ 混沌系统仍然是数学乃至物理学上的未解之谜。研究混沌系统在气象学、流体力学、传染病动力学等多个领域非常重要,而基于混沌系统的伪随机数生成算法同样应用广泛。早期众多编程语言所采用的伪随机数函数采用的是线性同余法:

X_{n+1}=(wX_n+b)\ \text{mod}\ m

​ 说不定在你的手机中,或者一些精密仪器中就有通过电路设计的硬件级随机数发生器。

05 分形与自我指涉

​ 前文所提及到的倍周期分岔图实际上是分形结构,因为其每次分岔都是与其它分岔相似的。分形实际上指的是维度是分数,我们也许知道零维是点、一维是线、二维是面、三维是体,那分数维度是什么样子的?

​ 下面通过两个视频让大家直观感受到分数维度的模样:

\large \color{darkblue}Z_{n+1}={Z_n}^2+C,Z\in\mathbb{C}

​ 曼德勃罗特集是人类有史以来做出的最奇特,最瑰丽的几何图形,曾被称为“上帝的指纹”。实际上,分形在众多影视作品中出现(包括科幻电影以及狭义上的动画作品),以实现非常绚丽的效果。

​ 科幻电影《盗梦空间》、《星际穿越》、《星球大战前传3》、《罗拉快跑》以及动画作品《Divers》、《正解的卡多》、《犬屋敷》、《HELLO WORLD》等均有利用分形营造震撼的视觉场面,赢得了观众的喜爱。

​ 荷兰著名画家莫里茨·科内利斯·埃舍尔(Maurits Cornelis Escher)以其画作的哲学和数学性而闻名。从其作品《画廊》中能看到分形的影子:

​ 事实上其画作还充斥着自我指涉、莫比乌斯环等奇特图案,著名游戏《纪念碑谷》其灵感便来源于埃舍尔的作品。分形是一种自我指涉(在逻辑学上被称作悖论),而巴赫的音乐作品引人入胜,常常利用了“卡农”以及“赋格”这种谱曲技巧,从某种方面上来说也是一种“分形”,或者说是一种自我指涉。

​ 人工智能学家侯世达(Douglas Richard Hofstadter)的《哥德尔、艾舍尔、巴赫书:集异璧之大成》由商务印书馆出版,是英语世界中有极高评价的科普著作,书中便探讨了数学家哥德尔、版画家埃舍尔和音乐家巴赫其成果在分形、自我指涉等方面的数理逻辑学、可计算理论、人工智能学、语言学、遗传学、音乐、绘画,其构思精巧、含义深刻、视野广阔、富于哲学韵味。

06 平均律与黎曼 ζ 函数

​ 学过音乐的人可能知道,现代音乐用十二平均律将一个八度音程按波长比例平均分成十二等份,每一个等份被称作一个半音。现代音乐虽然以十二平均律为主流律制,然而实际上律制有无数种,但它们之间并不平等。十二平均律作为现在的主流律制,是什么使得它这么突出?也许有人会回答 \large 2^{\frac{7}{12}}\large\frac{3}{2} 很接近,同时 \large2^{\frac{4}{12}}\large\frac{5}{12} 也比较接近。乍一看会有一个数字满足这些性质似乎有点偶然,但是这些其实只是表面现象,它们的背后埋藏着一个深刻的数学规律,而这个规律与黎曼 ζ 函数密切相关。

\begin{align} \zeta(s)&=\sum_{n=1}^\infty{1\over n^s}\\ &=\frac{1}{\Gamma(s)}\int_0^\infty\frac{x^{s-1}}{e^x-1}\text{d}x\\ &=\prod_p\left ( 1-\frac{1}{p^s} \right )^{-1} \end{align}

​ 黎曼 ζ 函数是著名数学家黎曼在黎曼猜想中提及的一个函数,这个猜想与当今数学未解之谜素数的规律密切相关,而现代密码学又是建立在关于大整数的质因数分解上,可以说当黎曼猜想被解决,那么素数的规律便找到了,那么当今网络密钥、信息安全便不复存在。

​ 虽然平均律有无数种,但是并不是每一个平均律中的音都是“和谐的”,一个音听起来自然、悦耳、好听,就称这个音是“和谐的”,那么究竟哪种平均律下的音更为和谐呢?我国有学者研究发现,在乐理中一个平均律中的音是否和谐,这个平均律究竟“好不好”,与现代数学的前沿黎曼 ζ 函数有密切关系。

img

\large Z\left(t\right)=\pi^{-\frac{it}{2}}\frac{\Gamma\left(\frac{1}{4}+\frac{it}{2}\right)}{\left|\Gamma\left(\frac{1}{4}+\frac{it}{2}\right)\right|}\zeta\left(\frac{1}{2}+it\right)

结尾终会到来

​ 通过以上例子,我们能够发现:游戏、音乐以及动画等众多艺术领域,其背后仍然有数学的本质值得令人挖掘,事实上在数学上的许多未解之谜仍然与生活、艺术息息相关,甚至非常有力的影响着我们生活中的方方面面。了解现象后的数学本质确实能够让人耳目一新!

参考资料

\small \begin{align} &\text{[1] Solara570. 方块碰撞问题中隐藏的圆. https://zhuanlan.zhihu.com/p/55121772}\\ &\text{[2] 切我. 平均律制与黎曼 ζ 函数. https://zhuanlan.zhihu.com/p/57552517}\\ &\text{[3] 豆子, 徐建德. 分形在影视作品中的应用. 广电视角, 1671-0029(2013)11(下)-0089-02}\\ &\text{[4] 刘慈欣. 蝴蝶. 中国工人出版社, ISBN: 9787500863120}\\ &\text{[5] COCOS. Cocos Creator JavaScript engine API reference. https://docs.cocos.com/creator/api/zh/} \end{align}
4赞
粤 ICP 备 2020080455 号