计算机图形学(二) -- 变换

缩放(Scale)

在这里插入图片描述
写为数学形式,则可表达为:
x ′ = s x x' = sx x=sx
y ′ = s y y' = sy y=sy
写为矩阵形式:
[ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy] = [ s x 0 0 s y ] \begin{bmatrix}s_x&0\\0&s_y\end{bmatrix} [sx00sy] [ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy]
非均匀缩放(non-uniform) 仍然可以使用上式表示,这时 s x = 0.5 s_x = 0.5 sx=0.5 s y = 1.0 s_y = 1.0 sy=1.0
在这里插入图片描述

对称(Reflection)

在这里插入图片描述
使用矩阵形式表示为
[ x ′ y ′ ] \begin{bmatrix}x'\\y'\end{bmatrix} [xy] = [ − 1 0 0 − 1 ] \begin{bmatrix}-1&0\\0&-1\end{bmatrix} [1001] [ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy]

斜切(Shear Matrix)

在这里插入图片描述
[ x ′ y ′ ] \begin{bmatrix}x'\\y'\end{bmatrix} [xy] = [ 1 a 0 1 ] \begin{bmatrix}1&a\\0&1\end{bmatrix} [10a1] [ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy]

旋转(Rotate)

在这里插入图片描述
推导过程如下:
在这里插入图片描述

线性变换(linear transforms)

x ′ = a x + b y x' = ax + by x=ax+by
y ′ = c x + d y y' = cx + dy y=cx+dy
[ x ′ y ′ ] \begin{bmatrix}x'\\y'\end{bmatrix} [xy] = [ a b c d ] \begin{bmatrix}a&b\\c&d\end{bmatrix} [acbd] [ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy]
如上,把变换可以使用一个矩阵乘以输入的坐标可以得到一个输出的坐标的形式,就叫做线性变换。

平移(Translation)

在这里插入图片描述
理解平移之前需要先理解齐次坐标的概念

齐次坐标

为什么需要齐次坐标

因为平移无法表示为矩阵的形式
[ x ′ y ′ ] \begin{bmatrix}x'\\y'\end{bmatrix} [xy] = [ a b c d ] \begin{bmatrix}a&b\\c&d\end{bmatrix} [acbd] [ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy] + [ t x t y ] \begin{bmatrix}t_x\\t_y\end{bmatrix} [txty]
所以平移不是一个线性变换。
但是我们又不想将平移当作一个特殊的情况来处理,所以试图找到一个统一的办法来表示各种各样的变换,解决办法就是引入齐次坐标

添加第三个坐标(w-coordinate)

  • 2D 点可表示为 = ( x , y , 1 ) T (x, y, 1)^T (x,y,1)T
  • 2D 向量可表示为 = ( x , y , 0 ) T (x, y, 0)^T (x,y,0)T

则使用矩阵来表示平移为:

( x ′ y ′ w ′ ) \begin{pmatrix}x'\\y'\\w'\end{pmatrix} xyw = ( 1 0 t x 0 1 t y 0 0 1 ) \begin{pmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{pmatrix} 100010txty1 . . . ( x y 1 ) \begin{pmatrix}x\\y\\1\end{pmatrix} xy1 = ( x + t x y + t y 1 ) \begin{pmatrix}x+t_x\\y+t_y\\1\end{pmatrix} x+txy+ty1

上式中,2D 向量为什么第三个坐标是 0 而不是 1 呢?
因为向量具有平移不变性,所以引入齐次坐标后也要保持向量的平移不变性,使用矩阵表示如下:
( x ′ y ′ w ′ ) \begin{pmatrix}x'\\y'\\w'\end{pmatrix} xyw = ( 1 0 t x 0 1 t y 0 0 1 ) \begin{pmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{pmatrix} 100010txty1 . . . ( x y 0 ) \begin{pmatrix}x\\y\\0\end{pmatrix} xy0 = ( x y 0 ) \begin{pmatrix}x\\y\\0\end{pmatrix} xy0

那么使用齐次坐标表示的点或者向量,则可验证如下几个关系:

  • vector + vector = vector 两个向量相加,结果仍然是一个向量
    ( x 1 y 1 0 ) T \begin{pmatrix}x_1&y_1&0\end{pmatrix}^T (x1y10)T + ( x 2 y 2 0 ) T \begin{pmatrix}x_2&y_2&0\end{pmatrix}^T (x2y20)T = ( x 1 + x 2 y 1 + y 2 0 ) T \begin{pmatrix}x_1+x_2&y_1+y_2&0\end{pmatrix}^T (x1+x2y1+y20)T
  • point - point = vector 两个点相减,得到一个向量
    ( x 1 y 1 1 ) T \begin{pmatrix}x_1&y_1&1\end{pmatrix}^T (x1y11)T - ( x 2 y 2 1 ) T \begin{pmatrix}x_2&y_2&1\end{pmatrix}^T (x2y21)T = ( x 1 − x 2 y 1 − y 2 0 ) T \begin{pmatrix}x_1-x_2&y_1-y_2&0\end{pmatrix}^T (x1x2y1y20)T
  • point + vector = point
    ( x 1 y 1 1 ) T \begin{pmatrix}x_1&y_1&1\end{pmatrix}^T (x1y11)T + ( x 2 y 2 0 ) T \begin{pmatrix}x_2&y_2&0\end{pmatrix}^T (x2y20)T = ( x 1 + x 2 y 1 + y 2 1 ) T \begin{pmatrix}x_1+x_2&y_1+y_2&1\end{pmatrix}^T (x1+x2y1+y21)T
  • point + point = 两个点的中点
    在齐次坐标中, ( x y w ) \begin{pmatrix}x\\y\\w\end{pmatrix} xyw 就表示一个 2D 点 ( x / w y / w 1 ) \begin{pmatrix}x/w\\y/w\\1\end{pmatrix} x/wy/w1
    那么两个点相加,就等于 ( x 1 y 1 1 ) T \begin{pmatrix}x_1&y_1&1\end{pmatrix}^T (x1y11)T + ( x 2 y 2 1 ) T \begin{pmatrix}x_2&y_2&1\end{pmatrix}^T (x2y21)T = ( x 1 + x 2 y 1 + y 2 2 ) T \begin{pmatrix}x_1+x_2&y_1+y_2&2\end{pmatrix}^T (x1+x2y1+y22)T = ( ( x 1 + x 2 ) / 2 ( y 1 + y 2 ) / 2 1 ) T \begin{pmatrix}(x_1+x_2)/2&(y_1+y_2)/2&1\end{pmatrix}^T ((x1+x2)/2(y1+y2)/21)T 即为两个点的中点坐标

仿射变换(Affine Transformations)

仿射变换 = 线性变换 + 平移
[ x ′ y ′ ] \begin{bmatrix}x'\\y'\end{bmatrix} [xy] = [ a b c d ] \begin{bmatrix}a&b\\c&d\end{bmatrix} [acbd] [ x y ] \begin{bmatrix}x\\y\end{bmatrix} [xy] + [ t x t y ] \begin{bmatrix}t_x\\t_y\end{bmatrix} [txty]
使用齐次坐标表示
( x ′ y ′ 1 ) \begin{pmatrix}x'\\y'\\1\end{pmatrix} xy1 = ( a b t x c d t y 0 0 1 ) \begin{pmatrix}a&b&t_x\\c&d&t_y\\0&0&1\end{pmatrix} ac0bd0txty1 . . . ( x y 1 ) \begin{pmatrix}x\\y\\1\end{pmatrix} xy1

齐次坐标下所有的 2D 变换表示为:

缩放

S ( s x , s y ) S(s_x, s_y) S(sx,sy) = ( s x 0 0 0 s y 0 0 0 1 ) \begin{pmatrix}s_x&0&0\\0&s_y&0\\0&0&1\end{pmatrix} sx000sy0001

旋转

R ( α ) R(\alpha) R(α) = ( c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ) \begin{pmatrix}cos\theta&-sin\theta&0\\sin\theta&cos\theta&0\\0&0&1\end{pmatrix} cosθsinθ0sinθcosθ0001

平移

T ( t x , t y ) T(t_x, t_y) T(tx,ty) = ( 1 0 t x 0 1 t y 0 0 1 ) \begin{pmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{pmatrix} 100010txty1

逆变换(Inverse Transform)

逆变换的变换矩阵为变换矩阵的逆矩阵 M − 1 M^-1 M1
在这里插入图片描述

组合变换

注意,这里说的平移和旋转都是相对于坐标原点而言,而不是下图中正方形的左下点。
先平移后旋转(Translate then Rotate)
在这里插入图片描述
先旋转后平移(Rotate Then Translate)
在这里插入图片描述
由此可知,组合变换中,平移和旋转的顺序得到的结果是不一样的。也就是说平移和旋转的顺序很重要。从矩阵的乘法来理解,也是能说通的。矩阵的乘法不满足交换律,交换位置后得到的结果是两个不同的矩阵。

一系列仿射变换

在这里插入图片描述

分解一系列仿射变换

在这里插入图片描述

补充

正交矩阵的证明
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值