欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

图形学各种二维基础变换,原来线性代数还能这么用,太牛了

最编程 2024-07-09 11:39:18
...
  • 为了使得在进行平移变换的时候或者其他所有的变换都只用乘一个矩阵就完成变换,所以引入了齐次坐标
  • 也就是在原有维度的情况下添加了第三个坐标维度w,在原先是2d点的情况变为 ( x , y , 1 ) ⊤ (\mathbf{x}, \mathbf{y}, 1)^{\top} (x,y,1)
  • 原先是2d向量的情况现在变为 ( x , y , 0 ) ⊤ (\mathbf{x}, \mathbf{y}, 0)^{\top} (x,y,0)
  • 于是我们可以构建出一个矩阵,从而达成只乘一个矩阵就可完成平移变换 ( x ′ y ′ w ′ ) = ( 1 0 t x 0 1 t y 0 0 1 ) ⋅ ( x y 1 ) = ( x + t x y + t y 1 ) \left(\begin{array}{c} x^{\prime} \\ y^{\prime} \\ w^{\prime} \end{array}\right)=\left(\begin{array}{ccc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{l} x \\ y \\ 1 \end{array}\right)=\left(\begin{array}{c} x+t_x \\ y+t_y \\ 1 \end{array}\right) xyw = 100010txty1 xy1 = x+txy+ty1
  • 只看最右边的前两个值发现就是一个平移操作
  • 而为啥二维的点和二维的向量要区分开呢?也就是二维点增加的维度w为1,二维向量增加的维度w为0,主要是因为向量有一个性质,就是一个向量平移到了另一个位置,那它还是那个向量,并不会发生改变
  • 而看到上面的公式,若把矩阵右边乘上的向量里的1变为0,则乘完矩阵后的值还是(x, y, 0),这样才符合刚刚说的那个向量平移不变性的性质。
  • 同时,区分点和向量还有一个好处就是,向量加向量还是一个向量,例如两个向量相加,比如(x1, y1, 0) + (x2, y2, 0)后为(x1 + x2, y1 + y2, 0),这正好符合向量相加的原则
  • 并且当两个点相减的时候,可以理解为是从a点指向到了b点,那么这个a到b就是一个向量,也就是(x1, y1, 1) - (x2, y2, 1) = (x1 - x2, y1 - y2 , 0),这正好也符合两个点相减的意义
  • 同理可得一个点加上一个向量,就相当于该点移动了一个向量的位置到了另一个点,也就是(x1, y1, 1) + (x2, y2, 0) = (x1 + x2, y1 + y2, 1),这也正好表现为了一个点
  • 所以引入齐次坐标很方便
  • 而任何一个仿射变换都可以使用齐次坐标来转换为仅需乘上一个矩阵就可完成变换
  • ( x ′ y ′ ) = ( a b c d ) ⋅ ( x y ) + ( t x t y ) \binom{x^{\prime}}{y^{\prime}}=\left(\begin{array}{ll} a & b \\ c & d \end{array}\right) \cdot\binom{x}{y}+\binom{t_x}{t_y} (yx)=(acbd)(yx)+(tytx)可转换为 ( x ′ y ′ 1 ) = ( a b t x c d t y 0 0 1 ) ⋅ ( x y 1 ) \left(\begin{array}{l} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right)=\left(\begin{array}{llc} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{l} x \\ y \\ 1 \end{array}\right) xy1 = ac0bd0txty1 xy1
  • 也就是现在处理任何一个变换,都可以仅乘一个矩阵就可以完成变换了
  • 而引入齐次坐标的上述所有变换矩阵,都可以用以下矩阵表示
  • 缩放变换: S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) \mathbf{S}\left(s_x, s_y\right)=\left(\begin{array}{ccc} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{array}\right) S(sx,sy)= sx000sy0001
  • 旋转变换: R ( α ) = ( cos ⁡ α