- Computer Graphics:下面简称CG,本节有一些不是很懂,直接没摘抄了。如齐次坐标的定义要搞懂。后面要加深学习的话参见CG的专业书籍把
教授推荐书目:
<Computer Graphics: Principles and Practices>
by Foley,Van Dam, Feiner, and Hughes (Addison-Wesley, 1995).一些参考是notes by Ronald Goldman and by Tony DeRose.
在CG当中,图片被移动、大小改变、3维的被投影为2维等等。这些操作都是通过矩阵完成的,但是这些矩阵的形状是很令人惊讶的。
三维空间当中的变换是由4-4矩阵完成的。你可能会以为是3-3的矩阵才对。需要4-4,是因为,4个关键操作的其中1个,不能由3-3的矩阵乘法来完成,下面是4个关键操作
- 平移:把原点变换到其他一个点
$P_0= (x_0,y_0,z_0)$ (Translation :shift the origin to another point$P_o = (x_o, Y_o, z_o)$ - 缩放:所有方向都伸缩因子c,或者不同方向的伸缩因子是$c_1,c_2,c_3$ (Rescaling:by c in all directions or by different factors
$c_1, c_2, c_3$ ) - 旋转:绕着经过原点的轴或者经过某个$P_0$ 点的轴旋转(Rotation:around an axis through the origin or an axis through
$P_o$ ) - 投影:投影到经过原点或$P_0$ 点的平面(Projection:onto a plane through the origin or a plane through Po).
首先注意2点:
- CG当中使用的是齐次坐标(homogeneous coordinates) ,如点 (x,y,z)的的齐次坐标是
(x,y,z,1)
,也就是在第4维添加1。 - 重要:CG当中是使用行向量。所以是
行*矩阵
,而不是矩阵*列
1 平移(Translation)
平移是最简单的,只需要把$v_0=(x_0,y_0,z_0)$ 加到每1个向量上,这时沿着向量 <01-07>
) 。没有任何3-3的矩阵可以移动原点。所以我们把原点的坐标设为 (0,0,0,1)
,这就是为什么矩阵是4-4的。
原点会被移动到
为了把三维点 (0,0,0) 和 (x,y,z) 移动
2 缩放(Scaling)
如果要把图片缩放为90%大小,在线代的标准做法是用 0.9 乘以单位矩阵 I
得到的矩阵
\[4ex]
\text { Rescale a solid to c: } \quad S = \left[ \begin{array} { l l l l } c & 0 & 0 & 0 \ 0 & c & 0 & 0 \ 0 & 0 & c & 0 \ 0 & 0 & 0 & 1 \end{array} \right]
$$
所以要注意,线代的 CI
,但在CG,$S$ 不是 cI
,$S$ 右下角一定是1。如 [x,y,1]
乘以S,才能得到齐次坐标下的正确答案。原点保持不变,因为 [0,0,1]S = [0,0,1]
。
如果不同方向伸缩因子不一样,如果需要把x,y,z方向变为
总结:缩放矩阵 S 和平移矩阵 T 大小是一样的,它们可以乘起来! 对于向量v
- 先平移,后缩放,是
vTS
- 先缩放,后皮影,是
vST
注意1,2是不等价的!
CG使用的是仿射变换(affine transformation),也就是:线性变换+平移(shitf)。$P^3$下的仿射变换T,是由1个多了额外1列的4-4的矩阵执行的: $$ A = \left[ \begin{array} { l l l l } a _ { 11 } & a _ { 12 } & a _ { 13 } & 0 \ a _ { 21 } & a _ { 22 } & a _ { 23 } & 0 \ a _ { 31 } & a _ { 32 } & a _ { 33 } & 0 \ a _ { 41 } & a _ { 42 } & a _ { 43 } & 1 \end{array} \right] = \left[ \begin{array} { c c } T ( 1,0,0 ) & 0 \ T ( 0,1,0 ) & 0 \ T ( 0,0,1 ) & 0 \ T ( 0,0,0 ) & 1 \end{array} \right] $$ 如果是3-3矩阵,那么只有3个输出,也就是输入 (1,0,0),(0,1,0),(0,0,1)的输出。如果只有线性变换,3个输出就可以了。但当变换是仿射的,如上的4-4矩阵会包含(0,0,0)的输出,从而我们可以知道有平移的存在
3 旋转(Rotation)
- 把(4,5)平移到(0,0):$vT_-$
- 旋转
$\theta$ :$vT_{-} * R$ - 把(0,0)平移回去(4,5):
$vT_{-}R * T_{+}$
注意,因为 v 是行向量,所以
三维下,旋转矩阵Q都是绕着一个轴旋转的,这个轴是不会移动的--它是$\lambda = 1$ 的特征向量所在的直线。现在假设这个轴是 Z 轴,Q当中的1表示不处理Z轴,R当中的1表示不处理原点(The 1 in Q is to leave the z axis alone, the extra 1 in R is to leave the origin alone ): $$ Q = \left[ \begin{array} { c c c } \cos \theta & - \sin \theta & 0 \ \sin \theta & \cos \theta & 0 \ 0 & 0 & 1 \end{array} \right] \quad \text { and } \quad
R = \left[ \begin{array} { r r r} & & & 0 \ & Q & &0 \ &&&0 \ 0&0&0&1 \end{array} \right]
$$
现在假设是绕着单位向量
$$
Q = ( \cos \theta ) I + ( 1 - \cos \theta ) \left[ \begin{array} { c c c } a _ { 1 } ^ { 2 } & a _ { 1 } a _ { 2 } & a _ { 1 } a _ { 3 } \ a _ { 1 } a _ { 2 } & a _ { 2 } ^ { 2 } & a _ { 2 } a _ { 3 } \ a _ { 1 } a _ { 3 } & a _ { 2 } a _ { 3 } & a _ { 3 } ^ { 2 } \end{array} \right] - \sin \theta \left[ \begin{array} { r r r } 0 & a _ { 3 } & - a _ { 2 } \ - a _ { 3 } & 0 & a _ { 1 } \ a _ { 2 } & - a _ { 1 } & 0 \end{array} \right]
\tag{1}
$$
这个轴不会转动,因为
线性变换的Q总是在R的左上角,Q的下面都是0,这时因为旋转不会移动原点。如果最小面不是0,那么变换就是仿射,原点会被移动
4 投影(Projection)
在线代课程,大多数平面会经过原点,但现实当中,大多数平面不经过原点。
- 经过原点的平面是向量空间
- 不经过原点的是仿射空间,它是将向量空间平移形成的
我们想要将三维向量投影到平面。设这个平面经过原点,并且其单位法向量是
P = \left[ \begin{array} { c c c c}& & & 0 \ I - n n ^ { T } & & & 0 \&&&0\ 0 & 0 & 0 & 1 \end{array} \right] $$
现在投影到不经过原点的平面
投影到放射空间,需要3步骤:
- 用
$T_-$ 把$v_0$ 平移到原点 - 沿着n的方向投影
- 沿着行向量$v_0$ 平移回去
注意$T_-,T_+$是逆矩阵
习题还出现反射(reflection)矩阵,也称为镜像(mirror)矩阵,这个CG需要第五种变换。反射移动的距离是投影的2倍:反射会穿过平面,把图像放倒平面的另一边。所以只要阿静投影矩阵的