前提:一个图在直角坐标系上的所有点,都是从原点(0, 0, 0)开始。
以二维为例,所有的矩阵变换,都可以表示成 x` = ax + by, y` = cx + dy. 这种表示方法的原理和背后的意义,见
《图形学中的矩阵是什么,为什么长得这么奇怪?》
缩放矩阵 的推导
如图所示,所谓缩放,即一个图上的所有点的x和y值,都乘以缩放系数S。缩放0.5,其实就是x值变成0.5x,y变成0.5y,写成
对比 x` = ax + by, y` = cx + dy. 可知 a = s,b = 0, c = s,d = 0. 可推出缩放矩阵的变换为
旋转矩阵 的推导
如图所示,点P绕着原点(0, 0)旋转θ
x` = c - d
y` = a + b
a = sinθ·x
b = cosθ·y
c = cosθ·x
d = -sinθ·y
x` = cosθ·x - sinθ·y
y` = sinθ·x + cosθ·y
对比 x` = ax + by, y` = cx + dy. 可得旋转矩阵为
平移矩阵 的推导
如图所示,所谓平移矩阵,即在x方向上移动了tx,在y方向上移动了ty
可是,由于平移矩阵并不能表示成 x` = ax + by, y` = cx + dy.的形式
于是我们在原来的维度上“强行”加多一维,用三维来表示二维
这样,原来的表示方法依然成立:
x` = ax + by + ez
y` = cx + dy + fy
z` = gx + hy + iz
那么在二维空间中,z值 是多少?
我们认为,对于一个点而言,z值是1;对于向量而言,z值是0,表示一个点没有产生相对位移。
好了,现在拿平移矩阵代入这个形式中,
x` = x + tx = ax + by + ez(z=1),可知 a = 1, b = 0, e = tx
y` = y + ty = y` = cx + dy + fz(z=1),可知 c = 0, d = 1, f = ty
z` = 1 = gx + hy + iz(z=1),可知 g = 0,h = 0, i = 1
从而得到平移矩阵的变换为
切变矩阵 的推导
如图所示,所谓切变矩阵,即一个图形上的某些点在x方向上发生了偏移,偏移的大小跟y有关,y越大偏移越大,即
x` = x + ?y
y` = y
再仔细分析,发现偏移值跟y的百分比有关,y为0时没有偏移也就是,在中间y=0.5c时偏移0.5b,在最高点y=1c时偏移1b,可知 x的偏移量等于y/b*c,即
x` = x + (b/c)y
这里有2个变量b和c,我们可以减少其中一个变量的影响,即把c归一化(b和c同时除以c),比如c是100,除以100等于1,那么b也除以100,把b/c看成a/1
注意:这里的a是红线等于1时的值,如果红线等于其他值n,要除以n才能得到a
在齐次坐标中,点的齐次值w = 1,向量的齐次值w = 2,并且点和向量的关系为:
向量 + 向量,向量 - 向量 = 向量 (表示合并向量)齐次值w:0 + 0 = 0
点 - 点 = 向量 (表示两点间的距离和方向)齐次值w:1 - 1 = 0
点 + 向量 = 点 (表示一个点经过一个距离和方向后的新点)齐次值w:1 + 0 = 1
点 + 点 = 点 (表示取两个点的中心点)齐次值w:1 + 1 = 2,x、y、z、w同时除以2, = 1