程序员数学:用Python学透线性代数和微积分
上QQ阅读APP看书,第一时间看更新

第 4 章 变换向量和图形

本章内容

  • 运用数学函数变换和绘制三维对象
  • 变换向量图形来创建计算机动画
  • 识别不改变直线和多边形形状的线性变换
  • 计算线性变换对向量和三维模型的影响

有了前两章的技术再加上一点儿创造力,你就可以渲染你能想到的任何二维或三维图形。所有物体、角色乃至整个世界都可以通过由向量定义的线段和多边形来构建。但是,要基于此做一部长篇计算机动画电影或生动的动作视频游戏,还需要能够绘制随时间变化的对象。

动画在计算机图形学中的工作方式和在电影中一样:每秒显示几十幅静态渲染的图像。显示移动对象的大量快照会使图像看起来是连续不断地变化的。第2章和第3章涉及的一些数学运算可以接收现有向量,对其进行几何变换,并输出新的向量。将连续的小变换链接在一起,就可以创造出连续运动的假象。

可以将旋转二维向量的示例记在心里,作为一个心智模型。你可以写一个Python函数rotate,它接收一个二维向量并将其逆时针旋转45°。如图4-1所示,rotate函数可被看作一台接收向量并对其变换后输出新向量的机器。

图4-1 把向量函数想象成一台有输入槽和输出槽的机器

如果将这个函数类推至三维,应用到定义了一个三维形状的每个多边形中的每个向量上,就可以得到整个形状旋转后的结果。这个三维形状可以是上一章中的八面体,甚至可以是一个茶壶。在图4-2中,旋转机器将茶壶作为输入,并输出旋转后的副本。

图4-2 可以将同一个变换应用于构成三维模型的每一个向量,从而以相同的几何变换方法变换整个模型

如果不是一次旋转45°,而是旋转45次1°,可以生成显示旋转茶壶的电影帧(见图4-3)。

图4-3 从左上角开始,茶壶每次旋转1°,连续旋转45次

旋转是一个很好的示例,因为将线段上的每一个点都相对于原点旋转相同的角度,仍然会得到相同长度的线段。这使得旋转构成二维或三维对象轮廓的所有向量后,仍可识别该对象。

本书将介绍一类通用的向量变换,称为线性变换。与旋转一样,线性变换将位于直线上的向量转换为同样位于直线上的新向量。线性变换在数学、物理学和数据分析中有众多应用。在这些应用场景中再次遇到它时,知道如何用几何图形来描述是很有帮助的。

为了实现旋转、线性变换以及其他向量变换的可视化,本章将使用更强大的绘图工具。我们将把Matplotlib换成用于高性能图形绘制的行业标准库OpenGL。大多数OpenGL编程使用C或C++完成,但本章将使用更加易用的Python库PyOpenGL。除此之外,我们还将使用Python的PyGame视频游戏开发库。具体地说,是使用PyGame中将连续图像渲染成动画的功能。附录C包含所有新工具的配置方式,这样我们可以快速上手并专注于数学向量变换。如果你想跟着本章的代码一起学习(强烈推荐!),那么应该跳到附录C,让代码能够运行后再返回这里阅读。