[3D 图形学基础] 读书笔记(2) Part_I(Getting Started) - Linear 线性
来源:互联网 发布:神策分析数据分析技术 编辑:程序博客网 时间:2024/06/07 02:51
本章是颇为基础的一章,主要有这些内容~
1. 定义了一套符号系统,用于表示三维中各种对象,并定义了这些符号相互间的运算规则,个人感觉在分析问题时非常有用,可以让你摆脱数字的困扰,从更抽象的层面来思考问题。本书其他章节也通篇使用了这一套符号系统。关键内容就是4个:点、向量、坐标系向量和坐标系统。
2. 讨论了矩阵所代表的线性变换。初学线性代数的时候确实困惑了一阵子矩阵的问题,其实从线性变换的角度来理解矩阵是非常清楚的:以三维空间为例,假设我们有一组(3个)向量基,由这组向量基定义出一个三维向量空间,在这个空间内描述一个向量,那么当我们对这个向量进行线性变换时,无非就是对这一组(3个)向量基进行了新的线性组合而已,而这个线性组合的内容,就可以写作矩阵的形式。
3. 解释了向量的点乘与叉乘,这里讲得不是很清楚,只是提到了计算公式,想要知道具体的原理还需要自己翻翻其他的资料。
4. 介绍了利用矩阵进行旋转和缩放操作,其实就是旋转矩阵和缩放矩阵内部各项参数的构成。
文章结束有本章内容的PDF链接~
Chapter_2 Linear 线性
[向量与线性变换]
我们学习3D计算机图形学的第一件任务,是理解怎样用坐标系来表示点,以及怎样对这些点实施有用的几何变换。学习线性代数时你可能已经见过类似的内容,但是,在计算机图形学中,我们常常同时使用许多不同的坐标系统,并且同样地,我们需要特别关注这些不同的坐标系统各自起到的作用。最终,我们处理这些基本内容的方式或许也会和线性代数有些不同。
在本章中,我们从向量和线性变换开始。向量用来表示三维运动,而线性变换用来操作向量,例如旋转和缩放。在随后的几章中,我们会了解到仿射(affine)变换,它增加了平移的功能。在第6章之前我们都不会进入到实际的编程中。我们会先仔细理解相应的原理,这样在随后开始编程时,实现我们想要的功能就会更容易。
2.1 Geometric Data Types 几何体类型
假想一些真实世界中的几何点。这样的点在三维空间中可以用三个实数来表示,
[坐标系统,坐标系向量和几何点]
我们称之为坐标系向量(coordinate vector)。这些数用于表示某点的位置,它与某个默认坐标系统(coordinate system)相关,该坐标系统有默认的原点和方向。如果我们需要改变默认坐标系统,我们就会需要用不同的数字,不同的坐标系向量,来描述同样一个点。所以,为了指明一个点的实际位置,我们同时需要一个坐标系统和一个坐标系向量。这样我们就必须非常小心区分以下概念:坐标系统,坐标系向量和几何点。
[几何点,向量,坐标系向量和坐标系统在本书中的符号]
我们从四种类型的数据开始,每种类型有它自己的表示符号(图2.1)。
- 点:
p~ 用带有波浪线的字母表示,这是一个几何点,而不是数值对象。 - 向量:
v⃗ 用上方带有箭头的字母表示。这也是一个非数值对象。我们在第3章会更详细的解释向量和点的区别。它们最主要的区别是点代表位置,而向量代表点与点之间的位移。 - 坐标系向量:
c 由粗体字母表示,坐标系向量是一个由实数组成的数值对象。 坐标系统:
ft→ 由粗体字母、箭头和上标t表示。(我们用粗体来表示垂直方向上的集合,上标t将它转换为一个水平方向的集合,而箭头告诉我们它是一个向量的集合而非数值的。)实际上有两种坐标系统,向量基(basis)用来描述向量,坐标系(frame)用来描述点。我们使用同一个符号,利用上下文来区分它们。
几何数据类型:点类型用圆点表示,向量用箭头表示。向量表示点与点之间的位移,平移对向量不产生影响。坐标系(frame)表示一个坐标系统,由一个原点和一组向量基表示。坐标系向量是三个一组的实数。
[依赖符号进行对象计算]
在下面以及随后的章节中,我们会定义所有的对象类型,以及可以对它们进行的操作。当思考如何操作几何体时,我们会极大的依靠符号来完成数值的(坐标系向量)和非数值的(向量和坐标系统)对象计算。我们只有预先建立好所有必须的惯例,到了第5章才能够放下非数值对象,而使用其数值部分在计算机代码中完成计算。
2.2 Vectors, Coordinate Vectors, and Bases 向量,坐标系向量和向量基
[向量是抽象的位移概念,坐标系向量是特定坐标系下的一组实数]
首先,我们要清晰的区分向量和坐标系向量。在本书中,向量总是抽象的几何实体用以表示世界中两个点之间的位移。例如“向东一英里”。坐标系向量是在我们有一个默认坐标系统时,用于表示向量的一组实数。
[定义向量空间]
正式来说,一个向量空间V是一系列满足特定规则的
要得到一个有效的向量空间,还需要遵守一些其他的规则,我们不会在此很详细的展开描述。
例如,加法运算需要符合结合律和交换律。
再例如,标量乘法必须符合分配率
…等等。
有很多对象类型都符合向量空间的结构。
但是在本书中,我们将会关注于,在实际的几何体点间,由实际运动所构成的向量空间。特别是,我们不会(从纯数学的角度)将向量看做三个数的集合。
[定义坐标系统]
一个坐标系统,或者向量基,是一小组向量,通过向量运算可以利用它来产生整个向量集合。(更正式一点,我们说一组向量
我们可以使用一组向量基来生成空间中的任意向量。可以用一组唯一的坐标系向量
[用符号表示向量基与坐标系向量]
也可以使用向量代数符号写作如下
上述公式最右侧的表达式使用了线性代数中标准的矩阵乘法。其中,每个
其中
2.3 Linear Transformations and 3 by 3 Matrices 线性变换与3x3矩阵
[线性变换的两个基本属性]
一个线性变换
我们使用符号
其中的线性变换部分可以用矩阵来表示。这是因为线性变换可以通过其对向量基的影响来直接表示。以下为它的工作方式:
[对向量变换等同于对向量基变换]
上面描述的两个线性属性暗示了以下关系
我们可以将公式(2.1)写作线性代数符号的形式
[用矩阵对一组向量基中的每个单独向量进行变换]
[用矩阵变换完整的向量基]
对向量基中所有的向量进行这样的变换,我们就得到了
其中
[用矩阵将一个向量变换为另一个向量]
将这些内容组合起来,我们可以看出对于向量进行线性变换的操作可以表示为:
总的来说,我们可以使用矩阵将一个向量变换为另一个
(图2.2)。
经过线性变换的向量
[用矩阵变换向量基]
如果我们对一组向量基中的每个向量进行变换,我们会得到新的基。这可以表示为
或者,简写为
(图2.3)
经过线性变换的向量基
并且,矩阵也可以和坐标系向量相乘,
2.3.1 Identity and Inverse 单位矩阵和逆矩阵
单位变换(identity map)不改变任何向量。它的对应矩阵是单位矩阵(identity matrix)
矩阵
2.3.2 Matrices for Basis Changes 矩阵用于变换向量基
除了用来描述变换(
这表达了向量基
假设一个向量在一个特定的向量基内用一个特定的坐标系向量表示:
这并非是一个变换(否则会用到
2.3.3 Extra Structure 其他结构
[向量点乘]
3D空间中的向量也可以进行点乘操作
它输入两个向量,返回一个实数值。点乘允许我们来定义向量的平方长度(也叫做squared norm)
点乘结果与两向量间的夹角
当
当一组向量基的向量都为单位长度且两两相互垂直时,我们说它是一组正交向量基。
在一组正交基
其中第二行我们使用了点乘是双线性操作符的性质,而第三行依据了向量基的正交性。
[向量基的手性]
当一组二维向量基的第二个向量基可以通过将第一个向量基逆时针旋转90度得到时,我们说这组二维正交基是右手性 的(在这里向量基的顺序非常重要)。
当三个向量基(有序的)按照图2.4的方式排列时,我们说一组三维向量基是右手性的,与图2.5相反。摊开右手,用手指指向第一个向量基,将手指向第二个向量基方向弯曲,此时你的大拇指将会指向第三个向量基方向。
一个右手正交坐标系统。z轴指向画面外。图中也表示了绕着x轴的旋转方向。
一个左手正交坐标系统。z轴指向画面内。
[向量叉乘]
在三维中,我们还有叉乘操作,输入两个向量,输出一个向量,定义为
其中
在一个右手正交向量基
2.4 Rotations 旋转
[用轴-角的方式理解旋转]
我们最经常遇到的线性变换是旋转。旋转在保持向量间点乘关系不变的同时,将一组右手性向量基映射到另一组右手性向量基上。因此特别的,对一组右手性的正交向量基进行旋转总是会得到另一组正交向量基。在3D中,旋转总是由一个固定的旋转轴,和绕着该轴旋转的角度组成。
[2D中的旋转]
我们从描述2D中的旋转开始。以一个向量入手。
我们假定
这个线性变换可以写作如下矩阵形式:
同样,我们可以旋转整个向量基
[3D中的旋转]
对于3D中的情况,也先假定我们使用一个右手性正交坐标系统。那么,一个向量围绕着z轴旋转
其中为了简便,我们使用符号
一个向量基围绕着x轴的旋转可以计算为
同样,旋转方向也可以通过以下方式视觉化:用右手握住x轴,底部朝向
围绕着y轴的旋转可以用以下矩阵完成
[用欧拉角在三维空间中旋转]
在某种意义上,通过这些轴向就可以完成3D中的任何旋转。首先,这些旋转的组合是另一个旋转。同时,可以看出通过指定x,y和z旋转我们可以达成任意的旋转。三个轴旋转的角度被称作xyz-欧拉角 。欧拉角可以通过一的平衡环来想象,有三个可动轴,可以通过三个参数决定要达成的旋转(图2.6)。
通过设置每个轴向的旋转量,我们可以将金色的圆盘摆放在任意想要的旋转姿态上。
[围绕任意旋转轴的旋转]
一种更直接的表示某一任意旋转的方式,是选取任意单位向量
其中,为了简写,我们引入了标记
[旋转的复杂性]
我们注意到3D旋转表现出某种复杂的形式。两个围绕着不同轴的旋转不满足交换律。此外,将沿着两个不同轴向的旋转组合时,我们得到的是一个沿着第三个轴向的旋转!
[利用四元数进行旋转插值]
在本书的随后章节,我们会引入四元数来表示旋转,用于在不同的旋转方位间产生平滑的过度动画。
2.5 Scales 缩放
[均匀缩放]
为了对几何体进行建模,我们需要对向量和向量基进行缩放。为了将任意向量以系数
[非均匀缩放]
为了沿着三个轴向进行不同的缩放,我们可以使用更通用的形式
这种类型的操作在建模中很有用,例如,当我们知道如何建立球体模型时,即可利用这种不均匀缩放建立椭圆体模型。
Exercises 练习
2.1 在我们的符号体系当中,以下哪些是合法的表达式,如果合法,它的返回值类型是什么?
2.2 对于给定
2.3
2.4
本章的PDF版可以去这里拿~
- [3D 图形学基础] 读书笔记(2) Part_I(Getting Started) - Linear 线性
- [3D 图形学基础] 读书笔记(1) Part_I(Getting Started) - Introduction
- [3D 图形学基础] 读书笔记(3) Part_I(Getting Started) - Affine 仿射
- 初始Unity 3d(Getting.Started.with.Unity 读书笔记一)
- Hive 读书笔记1:Getting Started
- Hive 读书笔记1:Getting Started
- Chapter 2 Getting Started
- /LGC图形渲染/图形学系列 -- 3D 图形学基础
- JAVA 3D原创翻译 Getting Started with the Java 3D API。- 第一章 1.1 1.2
- JAVA 3D原创翻译 Getting Started with the Java 3D API。- 第一章 1.3 (上)
- 图形学基础 - 平移和旋转 2D
- Warcraft Getting Started Guide 3
- Warcraft Getting Started Guide 2
- Chapter 1. Getting Started(2)
- Solr-reference-Getting Started-2
- 《Getting Started with Storm》章节一 基础
- 2天DBA - 3 Getting Started with Oracle Enterprise Manager
- Getting started
- Git解决分支冲突及分支管理策略
- Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存
- Android Annotations配置与使用
- storm DRPC指南
- #pragma once 与#ifndef
- [3D 图形学基础] 读书笔记(2) Part_I(Getting Started) - Linear 线性
- Spring MVC、struts1和struts2区别
- mahout之推荐系统源码笔记(3) ---执行推荐之RecommenderJob
- VS2012环境编译驱动(根据网络教程改编)
- Java 二叉树(一)普通方式的创建
- DomReader工具
- Android,IOS QQ在线客服代码
- 包括继承的类的初始化及类的加载一(附源码)
- mac下ppk 转ssh