一、齐次坐标的理解
“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。
-
向量
对于一个向量 v ⃗ \vec{v} v以及基 o a b c oabc oabc,可以找到一组坐标 ( v 1 , v 2 , v 3 ) (v_1,v_2,v_3) (v1,v2,v3),使得
(1) v ⃗ = v 1 a ⃗ + v 2 b ⃗ + v 3 c ⃗ \vec{v} = v_1\vec{a}+v_2\vec{b}+v_3\vec{c}\tag{1} v=v1a+v2b+v3c(1) -
点
而对于一个点 p p p,则可以找到一组坐标 ( p 1 , p 2 , p 3 ) (p_1,p_2,p_3) (p1,p2,p3),使得
(2) p − o = p 1 a ⃗ + p 2 b ⃗ + p 3 c ⃗ p-o = p_1\vec{a}+p_2\vec{b}+p_3\vec{c}\tag{2} p−o=p1a+p2b+p3c(2)
从上面对向量和点的描述,可以看出为了在坐标系中表示一个点,可把点的位置看作是对这个基的原点 o o o所进行的一个位移,即一个向量 p – o p – o p–o(有的书中把这样的向量叫做位置向量,起始于坐标原点的特殊向量)。
参考向量的描述形式,修改点的描述方程:
(3)
p
=
o
+
p
1
a
⃗
+
p
2
b
⃗
+
p
3
c
⃗
p =o + p_1\vec{a}+p_2\vec{b}+p_3\vec{c}\tag{3}
p=o+p1a+p2b+p3c(3)
(1)(3)是坐标系下向量和点的描述方式,这里可以看出,虽然都是用代数分量的形式表达向量和点,但描述一个点比一个向量需要额外的信息。如果写出一个代数分量(1, 4, 7),我们无法分辨其是向量或者点。
我们现在把(1)(3)写成矩阵的形式:
v
⃗
=
[
v
1
v
2
v
3
0
]
×
[
a
b
c
o
]
p
=
[
v
1
v
2
v
3
1
]
×
[
a
b
c
o
]
\vec{v} =\begin{bmatrix} v_1&v_2&v_3&0 \end{bmatrix}\times \begin{bmatrix} a\\b\\c\\o \end{bmatrix}\\ p = \begin{bmatrix} v_1&v_2&v_3&1 \end{bmatrix}\times \begin{bmatrix} a\\b\\c\\o \end{bmatrix}
v=[v1v2v30]×⎣⎢⎢⎡abco⎦⎥⎥⎤p=[v1v2v31]×⎣⎢⎢⎡abco⎦⎥⎥⎤
这里
(
a
,
b
,
c
,
o
)
T
(a,b,c,o)^T
(a,b,c,o)T是坐标基矩阵,右边的列向量分别是向量
v
⃗
\vec{v}
v和点
p
p
p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:
- 三维坐标下向量的第4个代数分量是0
- 三维坐标下点的第4个代数分量是1
像这种这种用4个代数分量表示三维几何概念的方式即为一种齐次坐标表示。
下面为在普通坐标(Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:
- 普通坐标转换到齐次坐标
- 点: ( x , y , z ) → ( x , y , z , 1 ) (x,y,z)\rightarrow (x,y,z,1) (x,y,z)→(x,y,z,1)
- 向量: ( x , y , z ) → ( x , y , z , 0 ) (x,y,z)\rightarrow (x,y,z,0) (x,y,z)→(x,y,z,0)
- 齐次坐标转换到普通坐标
- 点: ( x , y , z , 1 ) → ( x , y , z ) (x,y,z,1)\rightarrow (x,y,z) (x,y,z,1)→(x,y,z)
- 向量: ( x , y , z , 0 ) → ( x , y , z ) (x,y,z,0)\rightarrow (x,y,z) (x,y,z,0)→(x,y,z)
二、齐次坐标在变换中的应用
在欧氏变换中一般有两种操作:旋转和平移。如果我们想要将向量
a
⃗
\vec{a}
a进行一个标准的欧氏变换,一般是先用旋转矩阵
R
R
R进行旋转,然后再用向量
t
t
t进行平移,结果为:
a
′
=
R
∗
a
+
t
{a}'= R*a + t
a′=R∗a+t
在单次变换下这种操作没有问题,但在连续的欧氏变换下,会有多次连续的旋转和平移,假设我们对向量
a
⃗
\vec{a}
a进行了两次欧氏变换,分别为
R
1
,
t
1
R_1, t_1
R1,t1和
R
2
,
t
2
R_2,t_2
R2,t2,分别得到:
b
=
R
1
∗
a
+
t
1
c
=
R
2
∗
b
+
t
2
b = R_1*a + t_1\\ c = R_2*b + t_2
b=R1∗a+t1c=R2∗b+t2
最终变换结果为
c
=
R
2
∗
(
R
1
∗
a
+
t
1
)
+
t
2
c=R_2*(R_1*a+t_1)+t_2
c=R2∗(R1∗a+t1)+t2
显然,这样的变换在经过多次后会变的越来越复杂,造成这一问题的原因为上述表达方式并不是一个线性的变换关系,平移
t
t
t为加法。
此时使用齐次坐标,可以将加法转化为乘法,方便地表达平移:
-
非齐次下的平移变换:
[ u ′ v ′ ] = [ u + t u v + t v ] \begin{bmatrix} u'\\v' \end{bmatrix} = \begin{bmatrix} u+t_u\\v+t_v \end{bmatrix} [u′v′]=[u+tuv+tv] -
齐次下的平移变换:
[ u ′ v ′ 1 ] = [ 1 0 t u 0 1 t v 0 0 1 ] [ u v 1 ] \begin{bmatrix} u'\\v'\\1 \end{bmatrix} = \begin{bmatrix} 1&0&t_u\\0&1&t_v\\0&0&1 \end{bmatrix} \begin{bmatrix} u\\v\\1 \end{bmatrix} ⎣⎡u′v′1⎦⎤=⎣⎡100010tutv1⎦⎤⎣⎡uv1⎦⎤
采用齐次后的坐标变换为:
[
a
′
1
]
=
[
R
t
0
1
]
[
a
1
]
=
T
[
a
1
]
\begin{bmatrix} a'\\1 \end{bmatrix} = \begin{bmatrix} R&t\\0&1 \end{bmatrix} \begin{bmatrix} a\\1 \end{bmatrix}= T\begin{bmatrix} a\\1 \end{bmatrix}
[a′1]=[R0t1][a1]=T[a1]
采用齐次后旋转和平移可以用一个矩阵
T
T
T来表示,该矩阵称为变换矩阵(transform matrix),这样欧氏变换就变成了线性关系,进行多次欧氏变换只需要连乘变换矩阵即可。

1014

被折叠的 条评论
为什么被折叠?



