本文主要是介绍[3D 图形学基础] 读书笔记(3) Part_I(Getting Started) - Affine 仿射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本章内容主要是一些概念的理解~
1. 将坐标系从原先的三维拓展到了四维,从线性变换拓展到了仿射变换,简单理解就是从旋转/缩放变换增加了位移变换的功能。
2. 注意一下 刚体变换 这个概念,指的是只有 [旋转+位移] 的变换, 因为在这两种变换中,对象点与点之间的点乘关系不变,也就是说保持了刚体状态。
3. 最后讨论了仿射变换中,如何计算法线向量的问题
文章结束有本章内容的PDF链接~
Chapter_3 Affine 仿射
3.1 Points and Frames 点与坐标系
[点与向量]
将点与向量作为两种不同的类型来思考很有帮助。点是在几何体世界中的某个固定的位置,而向量则描述两点间的运动。我们会使用两种不同符号来区分点和向量。向量 v⃗ 顶部有一个箭头,而点 p~ 顶部则有波浪线。
如果我们将向量看作两点间的运动,那么向量运算(加以及与标量的乘法)就有了明显的意义。如果我们将两向量相加,我们表示的是两个运动的连接。如果我们将向量与标量相乘,我们是将该运动以一定系数增大或减小。零向量是一个特殊的表示没有运动的向量。
这些运算对点来说并没有太多意义。将两个点相加应该得到什么结果(例如,将哈佛广场与肯德尔广场相加)?将点与标量乘应该意味着什么?用法7乘以南极点应该意味着什么?存在着一个与其他点不同的零点吗?
有一种两点间的运算确实具有某些层面的意义:减法。当我们将一个点与另一个点相减时,我们应该得到从第二个点到第一个点的向量。
p~−q~=v⃗
相反,如果我们从一个点开始,沿着某一向量运动,我们应该得到另一个点
p~+v⃗ =p~
[仿射变换]
对点进行线性变换是有意义的。例如我们可以将一点绕着某一固定原点旋转。对于点,位移也是有意义的操作(位移的概念对向量没有意义)。为了表示位移,我们需要使用仿射变换(affine transform)这一概念。为了实现它,我们需要4x4的矩阵。4x4矩阵不仅仅有助于在这里处理仿射变换,随后我们描述摄影机投影运算时也很有用(见第10章)。
3.1.1 Frames 坐标系
[在仿射空间中用 [原点+向量] 来描述点]
在仿射空间中,我们这样描述一个点,从某一原点 o~ 开始,再将它与向量的线性组合相加。该向量由一组向量基和坐标系向量 ci→ 表示
p~=o~+∑icib⃗ i=[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥=f⃗ tc.
其中 1o~ 定义为 o~ 。
横向的行
[b⃗ 1b⃗ 2b⃗ 3o~]=f⃗ t
称为一个仿射坐标系(affine frame),它与向量基相似,但由三个向量和一个点组成。
[仿射坐标系的第四个分量: 1表示点, 0表示向量]
用坐标系来指定一个点,我们使用一组4项的坐标系向量,其中最后一项总是为1。用坐标系来表示一个向量时,我们使用最后一项为0的坐标系向量(也就是说,它是向量基的组合)。使用4项的坐标系向量来表示几何体(以及4x4矩阵)也会在第10章我们研究针孔相机模型的时候派上用场。
3.2 Affine Transformations and 4 by 4 Matrices 仿射变换与4乘4矩阵
与线性变换的情况相同,我们会在坐标系向量与坐标系之间放置一个合适的矩阵,以此来定义作用于点的仿射变换的概念。
我们来定义一个4乘4矩阵形式的仿射矩阵(affine matrix)
⎡⎣⎢⎢⎢aei0bfj0cgk0dhl1⎤⎦⎥⎥⎥
[对点进行仿射变换量]
用以下方式对点 p~=f⃗ tc 进行仿射变换:
[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥⇒[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢aei0bfj0cgk0dhl1⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥
或者简写为
f⃗ tc⇒f⃗ tAc.
我们可以验证上面公式的第二行描述了一个合法的点,根据乘法
⎡⎣⎢⎢⎢x′y′z′1⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢aei0bfj0cgk0dhl1⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢xyz1⎤⎦⎥⎥⎥
我们得到了一个4项的向量,其中第4项为1。此外,我们可以看到
[b⃗ ′1b⃗ ′2b⃗ ′3o~′]=[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢aei0bfj0cgk0dhl1⎤⎦⎥⎥⎥
其中 0o~ 定义为 0⃗ ,我们得到了一个由3个向量和一个点组成的坐标系。
需要注意如果矩阵的最后一行不是 [0,0,0,1] ,那它通常会给我们一个非法的结果。
[对坐标系进行仿射变换]
与线性变换相似,我们可以对坐标系进行仿射变换
[b⃗ 1b⃗ 2b⃗ 3o~]⇒[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢aei0bfj0cgk0dhl1⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥
或者简写为
f⃗ t⇒f⃗ tA.
3.3 Applying Linear Transformations to Points 对点进行线性变换
[将3x3线性矩阵嵌入到4x4仿射矩阵]
假设我们有一个表示一个线性变换的3乘3矩阵。我们可以将它嵌入到4乘4矩阵的左上角,并使用这个更大的矩阵来对点(或坐标系)进行变换:
[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥⇒[b⃗ 1b⃗ 2b⃗ 3o~]⎡⎣⎢⎢⎢aei0bfj0cgk00001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥
这一变换与线性变换对 ci 有同样的效果。如果我们将点 p~ 看作从原点 o~ 偏移了向量 v⃗ ,我们可以看出这一变换与对该向量进行线性变换具有同样的效果。所以,例如,如果该3乘3矩阵是一个旋转矩阵,则这一线性变换会将该点绕着原点旋转(图3.1)。我们将会在第4章中看到,当对点进行线性变换时坐标系原点的位置会起到很重要的作用。
对一个点进行线性变换。由对从原点出发到该点的向量进行线性变换来完成。
[4x4矩阵的简写形式]
我们使用以下简写方式来描述只进行线性变换的4乘4矩阵:
L=[l001]⎡⎣⎢⎢⎢c1c2c31⎤⎦⎥⎥⎥
其中 L 是一个4乘4矩阵,
3.4 Translations 位移
[对点进行位移操作]
对点的位移操作非常有用。这一变换不是线性的(见练习2.4)。仿射变换主要的新功能就在于,它能够表示位移。特别是,如果我们进行以下变换
我们可以看出它对坐标系向量造成的影响为
对于位移,我们使用以下方式简写
其中 T 是一个4乘4矩阵,
注意,如果
3.5 Putting Them Together 综合这些要素
[综合线性与位移]
任意仿射矩阵都可以被分解为一个线性部分和一个位移部分:
⎡⎣⎢⎢⎢aei0bfj0cgk0dhl1⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢100001000010dhl1⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢aei0bfj0cgk00001⎤⎦⎥⎥⎥
或者简写为
注意矩阵相乘是不满足互易性的, TL 相乘的顺序有意义,一个仿射矩阵也可以用一个不同的位移矩阵 T′ 被分解为 A=LT′ ,但我们不会使用这个形式。
[刚体变换]
A=TR(3.3)
在这个情况中,我们将矩阵 A 称作一个刚体矩阵(rigid body matrix),它所进行的变换称为刚体变换(rigid body transformation),或RBT。一个刚体变换保持了向量间的点乘关系,向量基的手性信息,以及点与点之间的距离关系。
3.6 Normals 法线
[在仿射变换中处理法线信息]
在计算机图形学中,我们常常使用表面的法线信息来决定表面上的一个点应当如何被着色。因此,我们需要了解当表面上的点发生由矩阵
有人会猜测我们可以将法线坐标系简单的与 A 相乘。例如,当我们旋转几何体时,法线会以同样的方式旋转。但是使用矩阵
[定义法线为垂直于无穷接近的两个点相减的向量]
让我们定义一个光滑表面上某一点的法线(normal)为一个向量,垂直于表面在该点处的切线平面。切线平面是由在该表面上接近(无穷小)的点相减得到的向量来定义的,由此,我们得到了
n⃗ ⋅(p1~−p0~)=0
对于法线 n⃗ 和两个在表面上非常近的点 p1~ 和 p0~ 。在某些固定的正交坐标系统当中,它可以被表示为
[nxnynz∗]⎛⎝⎜⎜⎜⎡⎣⎢⎢⎢x1y1z11⎤⎦⎥⎥⎥−⎡⎣⎢⎢⎢x0y0z01⎤⎦⎥⎥⎥⎞⎠⎟⎟⎟=0(3.4)
我们在第4项使用”*”,因为它会与0相乘因而无关紧要。
[推导变换后的法线向量]
假设我们使用一个仿射矩阵 A 来对我们所有的点进行仿射变换。那么什么向量对于所有切线向量都保持垂直呢?我们将等式(3.4)重写为
如果我们定义 [x′,y′,z′,1]t=A[x,y,z,1]t 为一个变换后点的坐标系向量,并且让 [nx′,ny′,nz′,∗]=[nx,ny,nz,1]A−1 ,那么我们有
[nx′ny′nz′∗]⎛⎝⎜⎜⎜⎡⎣⎢⎢⎢x1′y1′z1′1⎤⎦⎥⎥⎥−⎡⎣⎢⎢⎢x0′y0′z0′1⎤⎦⎥⎥⎥⎞⎠⎟⎟⎟=0(3.6)
由此我们可以看出 [nx′,ny′,nz′] 是形状变换后法线的坐标系向量(由缩放决定)。
注意,我们不关心”*”处的取值,因此我们也不关心 A−1 的第4列。同时, A 是一个仿射矩阵,因此
A=[l0t1](3.7)
我们可以看出
[nx′ny′nz′]=[nxnynz]l−1(3.8)
[最终的法线向量]
并将整个表达式转置,我们就得到了
⎡⎣⎢nx′ny′nz′⎤⎦⎥=l−1⎡⎣⎢nxnynz⎤⎦⎥(3.9)
其中 l−1 是3乘3矩阵的逆转置(与转置的逆相等)。注意如果 l 是一个旋转矩阵,该矩阵是正交的,因此它的逆转置实际上与
左:有色形状和黑色的法线。中:形状在
Exercises 练习
3.1 如果给出以下定义的对于点的运算:对于实数
本章的PDF版可以去这里拿~
这篇关于[3D 图形学基础] 读书笔记(3) Part_I(Getting Started) - Affine 仿射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!