《 线性代数及其应用 (原书第4版)》—— 2.7 计算机图形学中的应用

简介:

本节书摘来自华章出版社《 线性代数及其应用 (原书第4版)》一书中的第2章,第2.7节,作者:(美)戴维C. 雷(David C. Lay)马里兰大学帕克学院 著刘深泉 张万芹 陈玉珍 包乐娥 陆 博 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.7 计算机图形学中的应用

计算机图形是在计算机屏幕上显示或活动的图像. 计算机图形学的应用广泛,发展迅速. 例如,计算机辅助设计(CAD)是许多工程技术的组成部分之一,比如本章介绍中提到的飞机设计过程. 娱乐行业对计算图形学做了最引人入胜的应用——从黑客帝国的特技效果到PlayStation 2电脑娱乐系统和Xbox游乐器游戏.
绝大多数工业或商业的交互计算机软件在屏幕上应用计算机图形显示以及其他功能,如数据的图形显示、桌面编辑以及商业或教育用的幻灯片等,因此,任何学习计算机语言的学生至少要学会如何应用二维(2D)图形.
本节考虑用来操纵和显示图形图像的一些基本的数学方法,例如飞机的线形轮廓模型. 这样的一个图像(图片)是由一系列的点和曲线组成,以及如何填充由直线和曲线所围成的封闭区域. 通常,曲线用短的直线段逼近,而图形用一系列的点来定义.
在最简单的二维图形符号中,字母用于在屏幕上做标记. 某些字母作为线框对象存储,其他有弯曲部分的字母还要将曲线的数学公式也存储进去.
例1 图2-15中的大写字母N由8个点或顶点确定. 这些点的坐标可存储在一个数据矩阵D中.
screenshot

除D以外,还要说明哪些顶点用线相连,但我们省略这些细节.
图形对象使用一组直线线段描述的主要原因是,计算机图形学中标准变换把线段映射成为线段.(例如,见1.8节习题26.)当描述这些对象的顶点被变换以后,它们的像可以用适当的直线连接起来得到原来对象的完整图像.
例2 给定 screenshot描述剪切变换 对例1中字母N的作用.
解 由矩阵乘法的定义,乘积AD的各列给出字母N各顶点的像.
screenshot
变换过的顶点画在图2-16,同时还画上相应于原来图形中连线的线段.

图2-16中斜体的 看来有些太宽,为此,我们可以用倍乘变换使它变窄.
screenshot

例3 先作如例2的剪切变换,然后再把 坐标乘以一个因子0.75,求此复合变换的矩阵.
解 把每个点的x坐标乘以0.75的矩阵为
screenshot
所以复合变换的矩阵是
screenshot
复合变换的结果如图2-17所示.
screenshot

计算机图形学中的数学是与矩阵乘法紧密联系的. 但是,屏幕上的物体的平移并不直接对应于矩阵乘法,因为平移并非线性变换. 避免这一困难的标准办法是引入所谓齐次坐标.
齐次坐标
screenshot中每个点 (x,y)可以对应于 screenshot中的 (x,y,1). 它们位于xy 平面上方1单位的平面上. 我们称 (x,y)有齐次坐标(x,y,1) ,例如,点 的齐次坐标为 . 点的齐次坐标不能相加,也不能乘以数,但它们可以乘以screenshot矩阵来做变换.
screenshot
例4 形如screenshot 的平移可以用齐次坐标写成 screenshot,这个变换可用矩阵乘法来实现:
screenshot

例5 screenshot 中任意线性变换也可用通过齐次坐标乘以分块矩阵screenshot 实现,其中 A是screenshot矩阵,典型的例子是:
screenshot
复合变换
图形在计算机屏幕上的移动通常需要两个或多个基本变换. 这些变换的复合相应于在使用齐次坐标时进行矩阵相乘.
例6 求出screenshot矩阵,对应于先乘以0.3的倍乘变换,然后旋转90°,最后对图形的每个点的坐标加上 (-0.5),2做平移. 见图2-18.
screenshot
解 当 screenshot时,screenshot ,由例4和5,我们有
screenshot
所以复合变换的矩阵为
screenshot
三维计算机图形学
计算机图形学的最新和最激动人心的应用是分子模型. 对三维图形学,生物学家可观察到模拟的蛋白质分子,并用以研究药物分子. 生物学家可以旋转和平移一种实验药物的分子使它们附着于蛋白质分子. 研究潜在的化学反应的能力对现代药物和癌症研究是很重要的. 事实上,药物设计的进展依赖于计算机图形学构造有真实感的分子和它们的交互作用的仿真. 1c
现在的分子模型的研究集中于虚拟现实,即一种环境,研究者在其中可以看到并且感觉药物分子渗入蛋白质分子,在图2-19中,这样的有实体感的反馈是由能够将力量可视化的远程控制器提供的. 另一种虚拟现实的设计包括用一个头盔和手套来感觉头、手和手指的运动. 头盔包含两个细小的计算机屏幕,每个眼睛一个,将此可视环境变得更为真实,这是对工程师,科学家与数学家更大的挑战. 我们这里考虑的数学打开了这方面的研究的大门.
screenshot
齐次三维坐标
类似于二维情形,我们称 screenshotscreenshot中点(x,y,z) 的齐次坐标. 一般地,若 screenshot,则(X,Y,Z,H) 是 (x,y,z)的齐次坐标,且
screenshot (1)
(x,y,z,1) 的每一个非零的标量乘法得到一组(x,y,z) 的齐次坐标. 例如(10,-6,14,2) 和(-15,9,-21,-3) 都是(5,-3,7) 的齐次坐标.
下列说明分子模型中,把一个药物分子移入蛋白质分子的变换.
例7 给出下列变换的screenshot矩阵.

  1. 绕y 轴旋转30°(习惯上,正角是从旋转轴(本例中是 y轴)的正半轴向原点看过去的逆时针方向的角).
  2. 沿向量p=(-6,4,5) 的方向平移.
    解 a. 首先构造screenshot矩阵表示旋转. 向量screenshot 向负z 轴旋转到 screenshot,向量 screenshot不变, screenshot向正x 轴旋转到screenshot . 见图2-20. 由1.9节,这个旋转变换的标准矩阵为

screenshot
所以齐次坐标的旋转矩阵为
screenshot

  1. 我们希望 (x,y,z,1)映射到(x-6,y+4,z+5,1) ,所求矩阵为
    screenshot

screenshot
透视投影
三维物体在二维计算机屏幕上的表示方法是把它投影在一个可视平面上.(我们忽略其他重要步骤,例如选择可视平面上显示在屏幕上的部分.)为简单起见,设xy 平面表示计算机屏幕,假设某一观察者的眼睛向正z轴看去,眼睛的位置是 (0,0,d),透视投影把每个点(x,y,z) 映射为点screenshot ,使这两点与观察者的眼睛位置(称为透视中心)在一条直线上,见图2-21(a).
平面上的三角形(在图2-21a中)画在b中,由相似三角形知
screenshot
screenshot
类似地,
screenshot
使用齐次坐标,可用矩阵表示透视投影,记此矩阵为 P,(x,y,z,1) 映射为
screenshot
把这个向量乘以 1-z/d,可用 (x,y,0,1-z/d)作为齐次坐标的像,现在容易求出P . 事实上
screenshot
例8 设 S是顶点为(3, 1, 5),(5, 1, 5),(5, 0, 5),(3, 0, 5),(3, 1, 4),(5, 1, 4)及(3, 0, 4)的长方体,如图2-22所示,求S 在透视中心为(0, 0, 10)的透视投影下的像.
screenshot
解 设P 为投影矩阵, D为用齐次坐标的 S的数据矩阵,则 S的像的数据矩阵为
screenshot
为得到 screenshot坐标,使用例7前面的(1)式,把每一列的前3个元素除以第4行的对应元素,得到
顶点
screenshot
本教材的网页上有计算机图形学的有趣应用,包括对透视投影的进一步讨论. 网上的一个计算机项目与简单的动画有关.
数值计算的注解 三维物体的连续移动需要计算大量的screenshot矩阵,特别地,当曲面光滑时,用来使它更有实体感,并有适当的光线,图形工作站有screenshot矩阵运算及图形算法嵌入于芯片和电路中,这样的工作站可以每秒做数十亿次矩阵乘法以实现三维游戏程序中有真实感的颜色的变化.

练习题
图形绕 中一点 P的旋转是这样实现的:首先把图形平移-P ,然后绕原点旋转,最后平移回去P . 见图2-23,使用齐次坐标构造绕点(-2, 6)旋转screenshotscreenshot矩阵.
screenshot
习题2.7
screenshot
screenshot
screenshot
screenshot

相关文章
|
存储 数据安全/隐私保护 Windows
Windows 命令提示符(CMD)操作(五):磁盘和磁盘操作
Windows 命令提示符(CMD)操作(五):磁盘和磁盘操作
|
数据可视化 搜索推荐 Shell
Python与Plotly:B站每周必看榜单的可视化解决方案
Python与Plotly:B站每周必看榜单的可视化解决方案
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
384 1
|
存储 监控 NoSQL
TDengine 3.3.3.0 版本上线:优化监控、增强 MongoDB 支持
今天我们非常高兴地宣布,TDengine 3.3.3.0 版本正式发布。本次更新引入了多项重要功能和性能优化,旨在为用户提供更高效、更灵活的数据解决方案。
342 0
|
存储 Java 编译器
字符串常量和字符串字面值:区别与联系
字符串常量和字符串字面值:区别与联系
|
消息中间件 存储 Ubuntu
Linux安装kafka3.5.1
Linux安装kafka3.5.1
467 2
|
关系型数据库 MySQL 数据库
Windows 安装 MySQL 5.7 x64 位
Windows 安装 MySQL 5.7 x64 位
1487 0
|
存储 图形学
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
1291 0
|
传感器 消息中间件 芯片
RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)
应用篇-在STM32L051上使用RT-Thread 第三篇,学习RT-Thread Studio如何添加自定义的.c .h文件, 同时开始我们的程序移植和设计。
850 1
RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)
|
存储 程序员 C#
C#的注释、快捷键、字符和运算
C#的注释、快捷键、字符和运算
821 0