精华内容
下载资源
问答
  • 缩放 矩阵缩放 该对角阵称为缩放矩阵 对称 切变 选择 齐次坐标 平移变换 向量平移不变性 两个点的中点

    何为变换

    首先是两个参考视频:

    视频1:现代计算机图形学入门-闫令琪(第三章:变换的介绍)

    视频2:线性代数的本质 - 03 - 矩阵与线性变换

    在生活中,或者说在我们开发游戏的时候,会碰见很多很多的变换。在图形学中,主要有如下两种变换,模型变换(例如模型的缩放,IK)和视图变换(例如相机的移动旋转)。还有例如三维空间到二维空间(投影)也是非常重要的变换。

    上面提到的移动,缩放,旋转这些变换,其实都是将一个输入的值,进过一些操作,变成一个新的输出值。例如输入一个点的位置0,最后输出其位置10,即发生了移动变换。由这一个特性也可得出,所谓的变换其实就是函数

    输入值x -> 变换( 函数f(x) ) -> 输出值x

    而使用变换是为了让我们以运动的方式去思考,例如前面提到位置0变为10,我们要想成是从0慢慢移动到10,并不是一下子变为10。

     

    线性代数中,变换考虑的是一个向量的输入以及输出,向量的起点都为原点,例如将向量(2,4)缩放0.5倍,即得到向量(1,2)。对于一个整个空间(称之为线性空间向量空间),我们可以看作空间内有无数个点,而原点到每一个点的连线即为一个向量。空间的变换即空间中每一个向量都移动到对应输出向量的位置,也可以看作是空间中的每个点移动到变换后的目标位置。

    例如下图,便是一个简单的空间旋转变换,向量(0,1)旋转后变为(1,0)。

    接下来我们来看一个比较复杂的变换,如下图,为复平面f(v)=v^{2} / 2 的变换:

    看着很高级,那么它是怎么变换成这样的呢?首先我们要了解何为复平面,简单来说复平面是用来表示复数的,即a+bi,其中a和b为实数,i为虚数(i^{2}=-1)。复平面中x轴的值代表着复数中实部a的值,y轴的值代表着虚部b的值,因此点(1,1)代表着1+i,点(7,-8)代表着7-8i。清楚这一点后,我们就可以通过一些特殊的点,来计算出其变化后的值了,例如:

    变化前的点对应的复数进行 f(v)=v^{2} / 2 变化变化后的点
    (1,0)11^{2}/2=0.5(0.5,0)
    (1,1)1+i(1+i)^2/2=(1+i^2+2i)/2=(1-1+2i)/2=i(0,1)
    (1,2)1+2i(1+2i)^2/2=(1+4i^2+4i)/2=(1-4+4i)/2=-1.5+2i(-1.5,2)

    上面其实也就解释了下图中两根黄线的变化前后的缘由。至于为什么要在复平面上,应该是因为如果单纯的只是向量的平方那是没有意义的,因为向量是一个2*1的矩阵,向量的平方即为2*1的矩阵乘以2*1的矩阵,根据矩阵的乘法定义,我们知道它们无法相乘。

     

    线性变换

    线性代数限制在一种特殊类型的变换上,即线性变换。如果一个变换拥有以下两个性质,我们就称它为线性的变化:

    • 直线在变换后仍保持直线,不能有所弯曲。
    • 原点保持固定

    我们知道变换即为一个函数,我们假设这个函数为 f(x) ,那么站在数学的角度上,如果同一个空间中的任意两个向量 \vec{a} 和 \vec{b},以及数域中的一个数k(可以简单的理解为k为一个实数),满足以下条件的话,函数 f(x) 即为线性变换:

    • f(\vec{a} + \vec{b}) = f(\vec{a}) + f(\vec{b})
    • kf(\vec{a}) = f(k\vec{a})

    例如 f(x) = 2x,代表着一个放大两倍的变换,设 \vec{a} = (2, 0), \vec{b} = (0, 3),那么 \vec{a} + \vec{b} = (2, 3)。可得到 f(\vec{a}) = (4, 0)f(\vec{b}) = (0, 6)f(\vec{a}) + f(\vec{b}) = f(\vec{a} + \vec{b}) = (4, 6) ,满足第一条定则。设k=3,那么k\vec{a} = (6, 0)kf(\vec{a}) = f(k\vec{a}) = (12, 0),满足第二条定则。因此该变换为线性变换。

     

    推导

    设两个基向量 \vec{x}=(1,0)\vec{y}=(0,1) 那么任意一个向量\vec{a} 都有 \vec{a} = (i,j) = i\vec{x}+j\vec{y},当空间发生线性变换后,所有向量都会发生变换,包括我们的基向量。假设变换后\vec{x}=(x_{a},y_{a})\vec{y}=(x_{b},y_{b}),那么变换后的\vec{a}即等于\vec{a} = i(x_{a},y_{a})+j(x_{b},y_{b}),能推导出这步也是因为线性变换的那两个性质。

    我们把它写成矩阵的形式:

    \vec{a} = i(x_{a},y_{a})+j(x_{b},y_{b})=i\begin{bmatrix}x_{a}\\ y_{a}\end{bmatrix}+j\begin{bmatrix}x_{b}\\ y_{b}\end{bmatrix} =\begin{bmatrix}ix_{a}\\ iy_{a}\end{bmatrix}+\begin{bmatrix}jx_{b}\\ jy_{b}\end{bmatrix}=\begin{bmatrix}ix_{a}+jx_{b}\\ iy_{a}+jy_{b}\end{bmatrix}

    到这一步我们发现,我们输入的向量为 \begin{bmatrix}i\\ j\end{bmatrix},输出的向量为 \begin{bmatrix}ix_{a}+jx_{b}\\ iy_{a}+jy_{b}\end{bmatrix},学习了矩阵的乘法后会发现,这个结果不就是矩阵 \begin{bmatrix}x_{a}& x_{b}\\ y_{a}& y_{b}\end{bmatrix} 乘以 \begin{bmatrix}i\\ j\end{bmatrix} 的值。

    因此线性变换的本质即是一个矩阵与向量的相乘,所有的线性变换都可以通过下面表达式来表达:

    \begin{bmatrix}x_{out}\\ y_{out}\end{bmatrix} = \begin{bmatrix}x_{a}& x_{b}\\ y_{a}& y_{b}\end{bmatrix} * \begin{bmatrix}x_{in}\\ y_{in}\end{bmatrix}

    并且矩阵 \begin{bmatrix}x_{a}& x_{b}\\ y_{a}& y_{b}\end{bmatrix} 的 x_{a} 和 y_{a} 即为 \vec{x}=(1,0) 变化后的值, x_{b} 和 y_{b} 即为 \vec{y}=(0,1) 变化后的值

     

    当然了,我们也可以通过其他两个任意向量的初始值和变换后的值来求出矩阵 \begin{bmatrix}a& b\\ c& d\end{bmatrix} 的值,这类似于解二元一次方程式

    设 (x1_{in},y1_{in}) 变换后为 (x1_{out},y1_{out}), (x2_{in},y2_{in}) 变换后为 (x2_{out},y2_{out}),可得

    • ax1_{in}+by1_{in}=x1_{out}
    • cx1_{in}+dy1_{in}=y1_{out}
    • ax2_{in}+by2_{in}=x2_{out}
    • cx2_{in}+dy2_{in}=y2_{out}

    即可解得a,b,c,d四个的值。

    同时也可验证原点不变性,因为无论a,b,c,d值为多少, \begin{bmatrix}a& b\\ c& d\end{bmatrix} * \begin{bmatrix}0\\ 0\end{bmatrix} 都等于\begin{bmatrix}0\\ 0\end{bmatrix} 。

     

    二维变换

    接下来我们来看看常见的变换及其对应的矩阵。

    缩放

           

    设缩放比例为s,那么(1,0)缩放后为(s,0),(0,1)缩放后为(0,s),所有我们的矩阵为 \begin{bmatrix} s & 0\\ 0 & s \end{bmatrix},该对角阵也称为缩放矩阵

    \begin{bmatrix} s & 0\\ 0 & s \end{bmatrix} * \begin{bmatrix} x\\ y \end{bmatrix} =\begin{bmatrix} s * x\\ s * y \end{bmatrix}

    我们也可通过上面提到的解二元一次方程式的方法来求值,例如 (1,1) 缩放后为 (s,s),(-0.5,1) 缩放后为 (-0.5s,s),可得:

    • a*1+b*1=s
    • a*-0.5+b*1=-0.5s

    可知a=s,b=0

    • c*1+d*1=s
    • c*-0.5+d*1=s

    可知c=0,d=s

    即矩阵 \begin{bmatrix}a& b\\ c& d\end{bmatrix} 为 \begin{bmatrix} s & 0\\ 0 & s \end{bmatrix} 。

     

    思考

    如下图,缩放后的应该是情况1还是情况2呢?

                 

    从图中我们可以看出,情况1是以坐标点(2,2)为原点进行缩放,而情况2是以坐标点(0,0)为原点进行缩放,那么哪种是对的呢?

    我们可以想象一下,图中的坐标系是一部手机,坐标系中的小方块是手机中的后置摄像头,有如下几种情况。

    1. 假如我们以手机的中心(即坐标系原点)缩放,那么情况2是对的。也可以用向量来验证,\vec{OA} 从 (1,3) 变为了 (2,6),属于线性变换。
    2. 假如我们以摄像头的中心(即坐标系的(2,2))缩放,那么情况1是对的。但是这种情况手机的中心点坐标也发生了移动(会变到了(-2,-2)),不符合线性变换原点不动的性质,因此他不是一个线性变换。(属于一个复合变换,平移-》缩放-》平移,后续会介绍到)
    3. 假如我们只以摄像头的中心缩放摄像头,手机机身不变,那么也是情况1,但是手机的中心点依旧不会改变(还在(0,0)上),这种情况我们应该无视手机(原坐标系),以摄像头的中心为(0,0)点重构坐标系,就和最开始的两张缩放示意图一样了,因此还是线性变换。

    注意:后续介绍到的几种变换也都会有一样的情况,例如对称可以以y轴对称,也可以以x=1的轴对称,旋转可以以原点旋转,也可以以其他任意点旋转。但是我们后面介绍的几个变换的前提都是线性变换,因此都是以原点或者原点相关的轴进行变换。

     

    对称

    若是沿y轴对称,那么(1,0)变为(-1,0),(0,1)不变,那么矩阵为 \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix}

    \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} * \begin{bmatrix} x \\ y \end{bmatrix} =\begin{bmatrix} -x \\ y \end{bmatrix}

    同理若为沿着x轴对称,矩阵则为 \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}

     

    切变

    如下图,即为一种切变(空间中所有的竖线以与x轴的交点为中点进行倾斜)

       

    可以发现(1,0)在切变后保持不变,(0,1)在切变后变为(a,1),a即为切变的偏移量,上图中a=1。

    因此切变的矩阵为 \begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix}

     

    \begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix} * \begin{bmatrix} x \\ y \end{bmatrix} =\begin{bmatrix} x+ay \\ y \end{bmatrix}

     

    旋转

    设我们的线性空间逆时针旋转 \theta 度,通过三角函数我们可以知道,(1,0)变为(\cos \theta ,\sin \theta ),(0,1)变为(-\sin \theta,\cos \theta )

    因此逆时针旋转 \theta 度的矩阵为 \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix}

     

    平移

    平移是一个非常特殊的变换,我们知道若一个点 (x,y) 在坐标系上平移 (i,j) 后的位置为 (x+i,y+j),但是对于向量而言,(x,y)无论怎么移动始终都是(x,y),例如两个初始向量(0,1)和(1,0)平移后依旧不变(转换为矩阵就是单位矩阵),因为向量拥有平移不变性。因此平移变换的表达式应为一个向量加上一个偏移向量,而不是矩阵与向量的相乘了,如下:

    \begin{bmatrix} x_{out} \\ y_{out} \end{bmatrix} = \begin{bmatrix} x_{in} \\ y_{in} \end{bmatrix}+\begin{bmatrix} i \\ j \end{bmatrix}

    该表达式也无法用矩阵的方式来表示,因为 \begin{bmatrix}a& b\\ c& d\end{bmatrix} * \begin{bmatrix}x\\ y\end{bmatrix} 的两个方程式为 ax+by 和 cx+dy,无论如何都不可能等价于 x+i 和 y+i。因此平移变换不是线性变换

     

    仿射变换

    理解线性变换和平移之后,仿射变换理解起来就非常的简单了。仿射变换即先做一次线性变换,然后再做一次平移变换,其表达式如下:

    \begin{bmatrix} x_{out} \\ y_{out} \end{bmatrix} = \begin{bmatrix}a& b\\ c& d\end{bmatrix}\begin{bmatrix} x_{in} \\ y_{in} \end{bmatrix}+\begin{bmatrix} x_{offset} \\ y_{offset} \end{bmatrix} = \begin{bmatrix} ax_{in}+by_{in}+x_{offset} \\ cx_{in}+dy_{in}+y_{offset} \end{bmatrix}

    若 \begin{bmatrix}a& b\\ c& d\end{bmatrix} 为单位矩阵 \begin{bmatrix}1& 0\\ 0& 1\end{bmatrix} 那么就等价于平移变换。

     

    齐次坐标

    那么有没有什么方法,可以通过一个表达式就表达好线性变换以及反射变换呢?聪明的数学家们就此引入了齐次坐标的概念来解决这个问题。直接来看结果(站在巨人的肩膀上的我们通过结果来反推,理解起来会更加的容易),新的表达式如下:

    \begin{bmatrix} x_{out} \\ y_{out}\\ 1 \end{bmatrix} = \begin{bmatrix}a& b & x_{offset}\\ c& d & y_{offset}\\0&0&1\end{bmatrix}\begin{bmatrix} x_{in} \\ y_{in}\\ 1 \end{bmatrix}=\begin{bmatrix} ax_{in}+by_{in}+x_{offset} \\ cx_{in}+dy_{in}+y_{offset}\\ 1 \end{bmatrix}

    可以发现当 x_{offset} 和 y_{offset} 为0时,得到的值即为 \begin{bmatrix} ax_{in}+by_{in} \\ cx_{in}+dy_{in}\\ 1 \end{bmatrix} 去掉1后就是线性变换的结果。当 \begin{bmatrix}a& b\\ c& d\end{bmatrix} 为 \begin{bmatrix}1& 0\\ 0& 1\end{bmatrix} 时,得到的值即为 \begin{bmatrix} x_{in}+x_{offset} \\ y_{in}+y_{offset}\\ 1 \end{bmatrix} 去掉1后就是平移变换的结果。这样我们就可以通过一个矩阵 \begin{bmatrix}a& b & x_{offset}\\ c& d & y_{offset}\\0&0&1\end{bmatrix} 来表示这些所有的变换了。例如:

    • 缩放矩阵:\begin{bmatrix} s & 0 & 0\\ 0 & s &0 \\0&0&1 \end{bmatrix}
    • 旋转矩阵:\begin{bmatrix} \cos \theta & -\sin \theta &0 \\ \sin \theta & \cos \theta &0 \\ 0&0&1\end{bmatrix}
    • 切变+平移矩阵:\begin{bmatrix} 1 & a & i \\ 0 & 1&j \\0&0&1 \end{bmatrix}

     

    我们会发现原本的向量 \begin{bmatrix} x \\ y \end{bmatrix} 被变为了 \begin{bmatrix} x \\ y\\ 1 \end{bmatrix},这就是齐次坐标的意义。齐次坐标会将一个原本是n维的向量用一个n+1维向量来表示,在笛卡尔坐标系上的点 \begin{bmatrix} x \\ y \end{bmatrix} 引入齐次坐标后写作了 \begin{bmatrix} wx \\ wy\\ w \end{bmatrix} ,例如笛卡尔坐标系上的点 \begin{bmatrix} 1 \\ 2 \end{bmatrix} 可以用齐次坐标 \begin{bmatrix} 1 \\ 2\\ 1 \end{bmatrix} 或者 \begin{bmatrix} 2 \\ 4\\ 2 \end{bmatrix} 来表示,因此,与笛卡儿坐标不同,一个点可以有无限多个齐次坐标表示法。 

     

    从上面所述,也可得知,若我们有个齐次坐标 \begin{bmatrix} x \\ y\\ w \end{bmatrix} 那么它对应的笛卡尔坐标即为 \begin{bmatrix} x/w \\ y/w \end{bmatrix} ,我们会发现当 w 无限接近于 0 时,x/w 和 y/w 会无限接近正无穷,因此当w=0时,该齐次坐标代表一个无限远的点

     

    对于w的值,我们还可以进行另一种理解(OpenGL中也使用了这样的想法),如下:

    • 当w=0时,代表一个二维向量
    • 当w=1时,代表一个二维的点

    前面我们用到的是w=1的情况,若我们用w=0会出现什么结果呢?

    \begin{bmatrix} x_{out} \\ y_{out}\\ 0 \end{bmatrix} = \begin{bmatrix}a& b & x_{offset}\\ c& d & y_{offset}\\0&0&1\end{bmatrix}\begin{bmatrix} x_{in} \\ y_{in}\\ 0 \end{bmatrix}=\begin{bmatrix} ax_{in}+by_{in} \\ cx_{in}+dy_{in}\\0 \end{bmatrix}

    会发现平移的操作没有了,这也表达了向量的平移不变性。这样当矩阵和点相乘后表示的还是一个点,和向量相乘后表示的依旧还是一个向量

    此外在加减法中也具有一定的意义(为了方便就不写成矩阵的形式了,这里简单的写成(x,y,w)):

    • 向量+向量=向量:(x1,y1,0) + (x2,y2,0) = (x1+x2,y1+y2,0) 结果中w=0,依旧为一个向量。
    • 点-点=向量:(x1,y1,1) - (x2,y2,1) = (x1-x2,y1-y2,0) 结果中w=0,变为一个向量。
    • 点+向量=点:(x1,y1,1) + (x2,y2,0) = (x1-x2,y1-y2,1) 结果中w=1,依旧为一个点。
    • 点+点=无意义:(x1,y1,1) + (x2,y2,1) = (x1+x2,y1+y2,2) 结果中w=2,无意义(实际上等于两点的中点,即 ((x1+x2)/2,(y1+y2)/2) )。

     

    齐次坐标与光照

    前面提到齐次坐标中允许有一个无限远的点(w=0),而在3D坐标中这个是不允许的,该属性可以应用在光照的判断上。

    我们知道一个点光源的无限远处是平行光,类似于太阳光,太阳是一个点光源,光线到地球后变成了平行光。因此平行光可以通过改变点光源位置向量对应的齐次坐标中的 w 的值来表示,当 w=1 时,即还在点光源的原来位置,依旧是一个点光源;当 w=0 时,即在点光源的无限远处,变为一个平行光。

     

    复合变换

    复合变换即进行多次的仿射变换,例如先旋转后缩放再平移最后切变。

    假设向量 \vec{a} 进过变换A(对应矩阵 \mathbf{A})变换B(对应矩阵 \mathbf{B})变换C(对应矩阵 \mathbf{C})后,我们的公式应该写为:

    \mathbf{C}(\mathbf{B}(\mathbf{A}\vec{a})) = \mathbf{C}\mathbf{B}\mathbf{A}\vec{a}

    由于矩阵的乘法不满足交换律(\mathbf{B}\mathbf{A}\neq \mathbf{A}\mathbf{B}),因此不能写作\mathbf{A}\mathbf{B}\mathbf{C}\vec{a},因此例如先旋转后平移的变换不等价于先平移后旋转。

    所有若一个向量进过 \mathbf{A}_{1}\mathbf{A}_{2}\mathbf{A}_{3}...\mathbf{A}_{n} 次变换后,其公式为 \mathbf{A}_{n}...\mathbf{A}_{3}\mathbf{A}_{2}\mathbf{A}_{1}\vec{a}。其中由于\mathbf{A}_{1}\mathbf{A}_{2}\mathbf{A}_{3}...\mathbf{A}_{n} 都是3*3的矩阵,所以相乘后的结果依旧是个 3*3 的矩阵。设\mathbf{A}_{n}...\mathbf{A}_{3}\mathbf{A}_{2}\mathbf{A}_{1}相乘后的结果为\mathbf{B},那么矩阵\mathbf{B}就可以代表上面所有的变换,这个思路可以应用于矩阵变换的压缩上,使用一个矩阵代表多个变换。

     

    举例

    前面我们的旋转是以原点进行旋转,那么如果我们想以坐标系中的其他点进行旋转,变换的表达式应该是怎么样的?

    如下图,便是以点(2,3)进行逆时针旋转45度的前后变换:

          

    前面我们学习了以原点旋转以及平移的操作,那么我们可以将上面的操作进行分解,如下:

             

    三个步骤对应的矩阵分别为:

    1. 首先平移到原点:\begin{bmatrix}1&0 & -i\\ 0& 1 & -j\\0&0&1\end{bmatrix} 
    2. 其次逆时针旋转:\begin{bmatrix} \cos \theta & -\sin \theta &0 \\ \sin \theta & \cos \theta &0 \\ 0&0&1\end{bmatrix} 
    3. 最后平移回原处:\begin{bmatrix}1&0 & i\\ 0& 1 & j\\0&0&1\end{bmatrix}

     

    结合起来即为:\begin{bmatrix}1&0 &i\\ 0& 1 & j\\0&0&1\end{bmatrix}\begin{bmatrix}\cos\theta &-\sin\theta & 0\\ \sin\theta & \cos\theta & 0\\0&0&1\end{bmatrix}\begin{bmatrix}1&0 & -i\\ 0& 1 & -j\\0&0&1\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}

    等于:\begin{bmatrix}\cos\theta &-\sin\theta & i\\ \sin\theta & \cos\theta & j\\0&0&1\end{bmatrix}\begin{bmatrix}1&0 & -i\\ 0& 1 & -j\\0&0&1\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}\cos\theta &-\sin\theta & -i\cos\theta+j\sin\theta+i\\ \sin\theta & \cos\theta & -i\sin\theta-j\cos\theta+j\\0&0&1\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}

     

    因此以点 (i,j) 逆时针旋转 \theta 角度的矩阵为:\begin{bmatrix}\cos\theta &-\sin\theta & -i\cos\theta+j\sin\theta+i\\ \sin\theta & \cos\theta & -i\sin\theta-j\cos\theta+j\\0&0&1\end{bmatrix}

    若i=0,j=0,即为 \begin{bmatrix} \cos \theta & -\sin \theta &0 \\ \sin \theta & \cos \theta &0 \\ 0&0&1\end{bmatrix},若i=2,j=3,\theta=45,即为 \begin{bmatrix}\1/\sqrt{2} &-1/\sqrt{2} & 1/\sqrt{2}+2\\ 1/\sqrt{2} & 1/\sqrt{2} & -5/\sqrt{2}+3\\0&0&1\end{bmatrix}\approx \begin{bmatrix}\0.707&-0.707 & 2.707\\ 0.707 & 0.707 & -0.536\\0&0&1\end{bmatrix}

    我们把 \vec{OB} = (1,2) 带入可得 \begin{bmatrix}\0.707&-0.707 & 2.707\\ 0.707 & 0.707 & -0.536\\0&0&1\end{bmatrix}\begin{bmatrix} 1\\2\\1 \end{bmatrix} = \begin{bmatrix} 2\\1.585\\1 \end{bmatrix} 可得旋转后的值为:\vec{OB} = (2,1.585)

     

    同理在最前面缩放变换中,我们提到的缩放的情况1,即可以使用这种情况来解。

     

    逆变换

    和一个变换相反的变换,我们称之为逆变换,例如逆时针旋转的变换,那它的逆变换即为顺时针旋转。

    假设向量 \vec{a} 进过一次矩阵为 \mathbf{A} 变换后变为 \mathbf{A}\vec{a},然后我们可以通过矩阵为 \mathbf{B} 逆变换使 \mathbf{A}\vec{a} 变回 \vec{a},即 \mathbf{B}(\mathbf{A}\vec{a}) = (\mathbf{B}\mathbf{A})\vec{a} = \vec{a}。由此可得 \mathbf{B}\mathbf{A}=\mathbf{I} (\mathbf{I}为单位矩阵),因此 \mathbf{B} 为 \mathbf{A} 的逆矩阵

    因此一个矩阵为 \mathbf{A} 的变换的逆变换,对应的矩阵即为 \mathbf{A} 的逆矩阵:\mathbf{A}^{-1}

     

    举例

    例如我们逆时针旋转 \theta 度的矩阵 \mathbf{A} 为:\begin{bmatrix} \cos \theta & -\sin \theta &0 \\ \sin \theta & \cos \theta &0 \\ 0&0&1\end{bmatrix},那么他的逆变换即为顺时针旋转 \theta 度,或者说是逆时针旋转 -\theta 度,矩阵 \mathbf{B} 即为 \begin{bmatrix} cos(-\theta) & -sin(-\theta) &0 \\ sin(-\theta)& cos(-\theta) &0 \\ 0 & 0 &1 \end{bmatrix}等价于\begin{bmatrix} cos\theta & sin\theta &0 \\ -sin\theta& cos\theta &0 \\ 0 & 0 &1 \end{bmatrix}

    将他们相乘可得 \begin{bmatrix} cos\theta & -sin\theta &0 \\ sin\theta& cos\theta &0 \\ 0 & 0 &1 \end{bmatrix} \begin{bmatrix} cos\theta & sin\theta &0 \\ -sin\theta& cos\theta &0 \\ 0 & 0 &1 \end{bmatrix}= \begin{bmatrix} cos^{2}\theta+sin^{2}\theta & cos\theta sin\theta- sin\theta cos\theta&0 \\sin\theta cos\theta-cos\theta sin\theta& sin^{2}\theta+cos^{2}\theta &0 \\ 0 & 0 &1 \end{bmatrix}

    由三角函数可知,sin^{2}\theta+cos^{2} = 1,所有上面得到的值正是单位矩阵,\mathbf{B} 为 \mathbf{A} 的逆矩阵。

    此外我们还可以发现在旋转变换中,\mathbf{B} 正好为 \mathbf{A} 的转置矩阵 \mathbf{B}=\mathbf{A}^{T},因此通过矩阵的定义,他俩都为正交矩阵

    展开全文
  • 齐次坐标变换

    千次阅读 2018-03-03 10:43:51
    一直对齐次坐标这个概念的理解不够彻底,博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明。 由于作者对齐次坐标真的解释的不错,我就原封不动的摘抄过来: 对于一个向量v以及基...

     一直对齐次坐标这个概念的理解不够彻底,博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明。

         由于作者对齐次坐标真的解释的不错,我就原封不动的摘抄过来:

         对于一个向量v以及基oabc可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c          1

     而对于一个p,则可以找到一组坐标(p1,p2,p3),使得 p – o = p1 a + p2 b + p3 c            2),

    从上面对向量的表达,我们可以看出为了在坐标系中表示一个(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:o + p1 a + p2 b + p3 c (3)

    (1)(3)是坐标系下表达一个向量的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点!

        我们现在把(1)(3)写成矩阵的形式:v = (v1 v2 v3 0) X (a b c o)

    p = (p1 p2 p3 1) X (a b c o),这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

    这样,上面的(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。下面是如何在普通坐标(Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:

    (1)从普通坐标转换成齐次坐标时

       如果(x,y,z)是个点,则变为(x,y,z,1);

       如果(x,y,z)是个向量,则变为(x,y,z,0)

    (2)从齐次坐标转换成普通坐标时   

       如果是(x,y,z,1),则知道它是个点,变成(x,y,z);

       如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

    以上是通过齐次坐标来区分向量和点的方式。从中可以思考得知,对于平移T、旋转R、缩放S3个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向.

    而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中可以看出,齐次坐标用于仿射变换非常方便。

    此外,对于一个普通坐标的P=(Px, Py, Pz),有对应的一族齐次坐标(wPx, wPy, wPz, w),其中w不等于零。比如,P(1, 4, 7)的齐次坐标有(1, 4, 7, 1)、(2, 8, 14, 2)、(-0.1, -0.4, -0.7, -0.1)等等。因此,如果把一个点从普通坐标变成齐次坐标,给x,y,z乘上同一个非零数w,然后增加第4个分量w;如果把一个齐次坐标转换成普通坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个分量。

    由于齐次坐标使用了4个分量来表达3D概念,使得平移变换可以使用矩阵进行,从而如F.S. Hill, JR所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

       以上很好的阐释了齐次坐标的作用及运用齐次坐标的好处。其实在图形学的理论中,很多已经被封装的好的API也是很有研究的,要想成为一名专业的计算机图形学的学习者,除了知其然必须还得知其所以然。这样在遇到问题的时候才能迅速定位问题的根源,从而解决问题。

    展开全文
  • 本节从基础的欧式空间、投影空间、笛卡尔坐标、向量、矩阵、线性空间着手介绍,从向量空间的点和向量的表示法着手说明齐次坐标概念引入的过程,并介绍了齐次坐标的作用。
    展开全文
  • 机器人——齐次坐标变换

    千次阅读 2018-03-17 08:37:16
    机器人齐次坐标变换   变换定义为在空间中产生运动,目标坐标系的状态发生变化。 坐标变换一般有:   平移 绕轴旋转 平移旋转的复合运动 1平移 平移过程中,目标坐标系的空间状态没有发生改变,即目标坐标...

    机器人齐次坐标变换

     

    变换定义为在空间中产生运动,目标坐标系的状态发生变化。

    坐标变换一般有:

     

    • 平移
    • 绕轴旋转
    • 平移旋转的复合运动

    1平移

    平移过程中,目标坐标系的空间状态没有发生改变,即目标坐标轴的单位方向向量没有发生改变,

    但是目标坐标的相对于参考坐标系原点的向量OP会发生变换,新的目标坐标系会通过坐标系左乘

    变换矩阵得到。

    F为目标坐标系4X4齐次矩阵:

    F=[nx    ox    ax    px]

        [ny    oy    ay    py]

        [nz    oz    az    pz]

        [ 0      0     0      1 ]

     

    T为4X4变换矩阵:

     

    T = [1 0 0 0  dx]

           [0 1 0 0 dx]

           [0 0 1 0 dx]

           [0 0 0 0 1  ]

    目标坐标系更新(左乘):

    Fnew = F X T

    符号描述为:

    Fnew  = Trans (dx,dy,dz) X Fold;

     

    2绕轴旋转

    OP向量坐标为:

    P = [px py p]'

     

     

    rx为绕X轴旋转3X3旋转矩阵

    rx=[1      0         0  ]

          [0   Cosθ  -Sinθ]

          [0   Sinθ   Cosθ]

     

     


    ry为绕Y轴旋转3X3旋转矩阵

    ry=[Cosθ   0   Sinθ ]

          [0         1     0    ]

          [-Sinθ    0   Cosθ]

     

     

    rz为绕Z轴旋转3X3旋转矩阵

    rz=[Cosθ   -Sinθ   0 ]

          [Sinθ     Cosθ   0 ]

          [   0          0      1 ]

    绕X轴旋转θ

    Pnew = P x rx

    符号表示为:

    Pnew = Rot(x,θ)

     

    绕Y轴旋转θ

    Pnew = P x ry

     

    符号表示为:

    Pnew = Rot(x,θ)

     

    绕Z轴旋转θ

     

    Pnew = P x rx

     

    符号表示为:

    Pnew = Rot(x,θ)

     

     

    3.平移旋转的复合运动

    依次左乘相应的平移和旋转量

    Pnew = Rot(x,θ) X Trans (dx,dy,dz) X Fold

    MATLAB中直观表示:

     

     

     

     

    需要的基础知识:


    1线性代数


    2matlab绘图操作


    绘图代码:

    https://download.csdn.net/download/yangming2466/10291956

    点击打开链接

     

    展开全文
  • 仿射变换齐次坐标

    2019-06-25 15:52:07
    仿射变换齐次坐标October 12, 2011gcchengLeave a commentGo to comments仿射变换(Affine Transformation)和齐次坐标系(Homogeneous Coordinate)是计算机图形学中经常碰到...
  • 一、2D变换 ...对称变换就是变换前的图片和变换后的图片按坐标轴对称,例如按Y轴的对称变换结果如下 图形上每一点的Y轴坐标不变,但是横坐标都加了个负号 写成矩阵的形式就是这样的 3、剪
  • 齐次坐标就是在欧氏空间表示的基础上增加一个额外的变量w来表示原本的坐标(X,Y),并同时需要令x = Xw , y = Yw ,最终得到齐次坐标(x, y, w),w为非0变量,只有点在无穷远处时才等于0 而当该点在二维空间的
  • 齐次坐标齐次坐标系是为了区分空间点和向量的。三维空间中,(x,y,z)(x,y,z)(x,y,z)可以表示一个点ppp的位置,但是也可以表示一个向量v\bf{v}v。对于点的移动是有实际意义的,但是移动向量没有任何意义!点和向量...
  • 图形变换齐次坐标

    千次阅读 2019-02-16 21:37:15
    1、图形变换是计算机图形学基础内容之一 几何变换,投影变换,视窗变换 线性变换,属性不变,拓扑关系不变。 作用: 把用户坐标系与设备坐标系联系起来; 可由简单图形生成复杂图形; 可用二维图形表示三维形体; ...
  • 第3讲 变换矩阵与齐次坐标

    千次阅读 2018-09-17 21:13:56
    从上一讲的内容中可以知道一完整的欧式变换(旋转+平移)可以用式子:来表示。...引入变换矩阵和齐次坐标就是为了解决这个问题。 变换矩阵和齐次坐标 我们可以将上面从到变换的式子改写成用矩阵表...
  • 平移齐次坐标变换: 空间某点由矢量描述。其中,为轴上的单位矢量。此点可用平移齐次变换表示为: 旋转齐次坐标变换: 表,表,非齐次去掉第四行第四列就行了。 绕x轴作转角为的旋转变换: 绕y轴作转角为...
  • 为什么要引入齐次坐标齐次坐标的意义(二)

    万次阅读 多人点赞 2019-07-09 20:10:05
    前面我们提到了图像的缩放变换和旋转变换,可以用矩阵乘法的形式来表达变换后的像素位置映射关系。 那么,对于平移变换呢?平移变换表示的是位置变化的概念。如下图所示,一个图像矩形从中心点[x1,y1]平移到了中心...
  • 关于齐次坐标的理解

    千次阅读 多人点赞 2018-10-12 14:19:46
    (https://blog.csdn.net/janestar/article/details/44244849)[第二篇:齐次坐标的理解](http://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html)[第三篇:如何通俗的解释仿射变换?]...
  • 为什么要引入齐次坐标齐次坐标的意义(一)

    万次阅读 多人点赞 2019-07-09 19:43:30
    问题:两条平行线可以相交于一点 在欧氏几何空间,同一平面的两条平行线不能相交,这是我们都熟悉的一种场景。 然而,在透视空间里面,两条平行线可以相交,例如:...几何的一个子集合),2维笛卡尔坐标可以表示为...
  • 机器人技术视频讲座(64讲)-机器人技术06-坐标变换齐次坐标变换zip,机器人技术视频讲座(64讲)-机器人技术06-坐标变换齐次坐标变换
  • 齐次坐标与平移仿射变换(MATLAB)

    千次阅读 2020-06-09 11:23:17
    第三章,图像的基本变换学习笔记
  • 摘要本文首先说明了齐次坐标及齐次坐标下的坐标变换,然后叙述了将模型坐标空间经过 MVP 矩阵变换转变为标准视体空间(Canonical View Volume)的过程。具体地说,MVP 矩阵包括模型(Model)矩阵、视图(View)矩阵...
  • 齐次坐标

    千次阅读 2020-05-14 10:02:09
    先看看矩阵乘法在三维坐标变换的缺点:将三维坐标视为一个列向量,那么矩阵*列向量得到的新向量的每一个分量,都是旧的列向量的线性函数,因而三维笛卡尔坐标与矩阵的乘法只能实现三维坐标的缩放和旋转,而无法实现...
  • 齐次坐标与几何变换 齐次坐标与几何变换 齐次坐标与几何变换 齐次坐标与几何变换
  • 二维点坐标齐次变换 二维点坐标齐次变换 二维点坐标齐次变换 二维点坐标齐次变换
  • 齐次坐标 1. 向量 1.1 点乘 两个n维向量点乘: 二维向量的点乘:向量的模长相乘再乘以夹角余弦值。 点乘的结果是一个数值(标量)。 几何意义:b向量再a向量上的投影长度。 1.2 叉乘 结果:是...
  • Matlab实验齐次坐标与二维几何变换

    千次阅读 2018-12-08 02:48:51
    在Matlab中,构造一简单二维图形(房屋、飞机、家具等)的顶点表齐次矩阵,使用齐次矩阵变换方法对分别该图形做以下二维变换: 宽度缩小为1/2,高度放大为2倍,设为T1 顺时针旋转30度,设为T2 沿x轴做错切,错切...
  • 机器人(Robot)是自动执行工作的机器装置。它既可以接受人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作的工作,例如生产业、建筑业,或是危险的...
  • 二维图形变换原理及齐次坐标

    千次阅读 2018-10-09 16:52:00
    二维图形变换通过学习【向量分析】和【图形变换】,可以设计出一些方法来描述我们所遇见的各种几何对象,并学会如何把这些几何方法转换成数字。一、向量从几何角度看,向量是具有长度和方向的实体,但是没有位置。而...
  • 采用机器人运动学中的齐次坐标变换来描述工艺系统各组成部分的空间位姿关系,建立了工艺系统各组件的几何误差累积模型.将制造过程看作是刀具轨迹形成的点集更新被加工零件点集的过程,加工后零件点集组成了新的齐次...
  • 齐次坐标的理解

    2019-11-02 09:46:41
    齐次坐标的理解 一直对齐次坐标这个概念...特别是针对这样一句话进行了有力的证明:“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,454
精华内容 4,581
关键字:

齐次坐标进行变换