齐次坐标
对于向量而言, 平移操作是没有意义的, 因为向量只描述方向与大小, 与位置无关. 但是很明显, 在计算机图形学中, 我们不只关注方向, 同样需要考虑物体(顶点)的位置信息. 齐次坐标的重要作用就是使我们可以方便的将位置和向量进行统一表示.
我们将三维坐标扩展为四维坐标, 第四维 w 则可以用来表示当前对象是点还是向量. 具体来讲
- (x, y, z, 0) 表示向量
- (x, y, z, 1) 表示点
齐次坐标表示法的思路:
- 两点之差 q − p = ( q x , q y , q z , 1 ) − ( p x , p y , p z , 1 ) = ( q x − p x , q y − p y , q z − p z , 0 ) {\mathbf q - \mathbf p = (q_x, q_y, q_z, 1) - (p_x, p_y, p_z, 1) = (q_x-p_x, q_y-p_y, q_z-p_z, 0)} q−p=(qx,qy,qz,1)−(px,py,pz,1)=(qx−px,qy−py,qz−pz,0) 得到一个向量.
- 点与向量的和 p + v = ( p x , p y , p z , 1 ) + ( v x , v y , v z , 0 ) = ( p x + v x , p y + v y , p z + v z , 1 ) {\mathbf p + \mathbf v = (p_x, p_y, p_z, 1) + (v_x, v_y, v_z, 0) = (p_x+v_x, p_y+v_y, p_z+v_z, 1)} p+v=(px,py,pz,1)+(vx,vy,vz,0)=(px+vx,py+vy,pz+vz,1)得到一个点.
接下来会说明: w = 1 可以使点内正确的平移, w = 0 则可以防止向量坐标受到平移的影响.
仿射变换的定义及其矩阵表示
仿射变换是一个线性变换和一个平移向量的组合. 用矩阵表示如下:
α
(
u
)
=
u
A
+
b
=
[
x
,
y
,
z
]
[
A
00
A
01
A
02
A
10
A
11
A
12
A
20
A
21
A
22
]
+
[
b
x
,
b
y
,
b
z
]
=
[
x
′
,
y
′
,
z
′
]
{\alpha(u) = uA+b=[x,y,z] \begin{bmatrix} A_{00} & A_{01} & A_{02} \\ A_{10} & A_{11} & A_{12} \\ A_{20} & A_{21} & A_{22} \\ \end{bmatrix} + [b_x, b_y, b_z] = [x', y',z'] }
α(u)=uA+b=[x,y,z]⎣⎡A00A10A20A01A11A21A02A12A22⎦⎤+[bx,by,bz]=[x′,y′,z′]
如果把他扩展为齐次坐标, 则可以更简洁的写作:
[
x
,
y
,
z
,
1
]
[
A
00
A
01
A
02
0
A
10
A
11
A
12
0
A
20
A
21
A
22
0
b
x
b
y
b
z
1
]
=
[
x
′
,
y
′
,
z
′
,
1
]
{ [x, y, z, 1] \begin{bmatrix} A_{00} & A_{01} & A_{02} & 0 \\ A_{10} & A_{11} & A_{12} & 0 \\ A_{20} & A_{21} & A_{22} & 0 \\ b_x & b_y & b_z & 1\\ \end{bmatrix} = [x', y',z',1] }
[x,y,z,1]⎣⎢⎢⎡A00A10A20bxA01A11A21byA02A12A22bz0001⎦⎥⎥⎤=[x′,y′,z′,1]
可以看出, 加上向量 b 的这步运算, 从本质上来讲是一个平移变换. 我们既不希望平移操作应用到向量上, 又希望向量受到仿射变换中线性部分的影响(旋转和缩放). 这时, 根据仿射变换的矩阵表示和矩阵乘法的计算规则, 我们可以轻松的得出, 将第四分量 w 设置为 0 便可以清除仿射变换中的平移部分并保留线性部分. 这一特征便可以用来表示向量.