齐次坐标的分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Kalenee/article/details/89304652

一、齐次坐标的理解

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。

  • 向量

    对于一个向量 v \vec{v} 以及基 o a b c oabc ,可以找到一组坐标 ( v 1 , v 2 , v 3 ) (v_1,v_2,v_3) ,使得
    (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}

  • 而对于一个点 p p ,则可以找到一组坐标 ( p 1 , p 2 , p 3 ) (p_1,p_2,p_3) ,使得
    (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}

从上面对向量和点的描述,可以看出为了在坐标系中表示一个点,可把点的位置看作是对这个基的原点 o 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}
(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}
这里 ( a , b , c , o ) T (a,b,c,o)^T 是坐标基矩阵,右边的列向量分别是向量 v \vec{v} 和点 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 , 0 ) (x,y,z)\rightarrow (x,y,z,0)
  • 齐次坐标转换到普通坐标
    • 点: ( x , y , z , 1 ) ( x , y , z ) (x,y,z,1)\rightarrow (x,y,z)
    • 向量: ( x , y , z , 0 ) ( x , y , z ) (x,y,z,0)\rightarrow (x,y,z)

二、齐次坐标在变换中的应用

在欧氏变换中一般有两种操作:旋转和平移。如果我们想要将向量 a \vec{a} 进行一个标准的欧氏变换,一般是先用旋转矩阵 R R 进行旋转,然后再用向量 t t 进行平移,结果为:
a = R a + t {a}'= R*a + t
在单次变换下这种操作没有问题,但在连续的欧氏变换下,会有多次连续的旋转和平移,假设我们对向量 a \vec{a} 进行了两次欧氏变换,分别为 R 1 , t 1 R_1, t_1 R 2 t 2 R_2,t_2 ,分别得到:
b = R 1 a + t 1 c = R 2 b + t 2 b = R_1*a + t_1\\ c = R_2*b + t_2
最终变换结果为
c = R 2 ( R 1 a + t 1 ) + t 2 c=R_2*(R_1*a+t_1)+t_2
显然,这样的变换在经过多次后会变的越来越复杂,造成这一问题的原因为上述表达方式并不是一个线性的变换关系,平移 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 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}

采用齐次后的坐标变换为:
[ 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}
采用齐次后旋转和平移可以用一个矩阵 T T 来表示,该矩阵称为变换矩阵(transform matrix),这样欧氏变换就变成了线性关系,进行多次欧氏变换只需要连乘变换矩阵即可。

参考

关于齐次坐标的理解

齐次坐标的理解

从零开始一起学习SLAM | 为什么要用齐次坐标?

猜你喜欢

转载自blog.csdn.net/Kalenee/article/details/89304652