缩放变换
缩放为将坐标按一定比例缩放,
[
x
′
y
′
z
′
]
=
[
x
s
0
0
0
y
s
0
0
0
z
s
]
[
x
y
z
]
\begin{bmatrix} x'\\y' \\z'\end{bmatrix}=\begin{bmatrix} x_{s} & 0 &0 \\ 0& y_{s}&0 \\ 0& 0&z_{s}\end{bmatrix}\begin{bmatrix} x\\y \\z\end{bmatrix}
⎣⎡x′y′z′⎦⎤=⎣⎡xs000ys000zs⎦⎤⎣⎡xyz⎦⎤
其中
x
s
x_{s}
xs
y
s
y_{s}
ys
z
s
z_{s}
zs为缩放的比例
镜像变换
要将坐标点进行镜像,只需左乘镜像矩阵
- x轴镜像矩阵
M x = [ 1 0 0 0 − 1 0 0 0 − 1 ] M_x = \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & -1 \end{bmatrix} Mx=⎣⎡1000−1000−1⎦⎤ - y轴镜像矩阵
M y = [ − 1 0 0 0 1 0 0 0 − 1 ] M_y = \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} My=⎣⎡−10001000−1⎦⎤ - z轴镜像矩阵
M z = [ − 1 0 0 0 − 1 0 0 0 1 ] M_z = \begin{bmatrix} -1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{bmatrix} Mz=⎣⎡−1000−10001⎦⎤
旋转变换
三维的旋转可以看成是原始坐标左乘对应轴的旋转矩阵
顺逆时针旋转的矩阵互为转置矩阵和逆矩阵,所有他们是正交阵
-
坐标系不动,点逆时针旋转的旋转矩阵:
R x ( θ ) = [ 1 0 0 0 cos ( θ ) − sin ( θ ) 0 sin ( θ ) cos ( θ ) ] \mathbf{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos(\theta) & -\sin(\theta) \\ 0 & \sin(\theta) & \cos(\theta) \end{bmatrix} Rx(θ)=⎣⎡1000cos(θ)sin(θ)0−sin(θ)cos(θ)⎦⎤
R y ( θ ) = [ cos ( θ ) 0 sin ( θ ) 0 1 0 − sin ( θ ) 0 cos ( θ ) ] \mathbf{R}_y(\theta) = \begin{bmatrix} \cos(\theta) & 0 & \sin(\theta) \\ 0 & 1 & 0 \\ -\sin(\theta) & 0 & \cos(\theta) \end{bmatrix} Ry(θ)=⎣⎡cos(θ)0−sin(θ)010sin(θ)0cos(θ)⎦⎤
R z ( θ ) = [ cos ( θ ) − sin ( θ ) 0 sin ( θ ) cos ( θ ) 0 0 0 1 ] \mathbf{R}_z(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(θ)=⎣⎡cos(θ)sin(θ)0−sin(θ)cos(θ)0001⎦⎤ -
目标点不动,坐标系逆时针旋转的旋转矩阵(==坐标点或者说是顺时针旋转的矩阵):
R x ( θ ) = [ 1 0 0 0 cos ( θ ) sin ( θ ) 0 − sin ( θ ) cos ( θ ) ] R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos(\theta) & \sin(\theta) \\ 0 & -\sin(\theta) & \cos(\theta) \end{bmatrix} Rx(θ)=⎣⎡1000cos(θ)−sin(θ)0sin(θ)cos(θ)⎦⎤
R y ( θ ) = [ cos ( θ ) 0 − sin ( θ ) 0 1 0 sin ( θ ) 0 cos ( θ ) ] R_y(\theta) = \begin{bmatrix} \cos(\theta) & 0 & -\sin(\theta) \\ 0 & 1 & 0 \\ \sin(\theta) & 0 & \cos(\theta) \end{bmatrix} Ry(θ)=⎣⎡cos(θ)0sin(θ)010−sin(θ)0cos(θ)⎦⎤
R z ( θ ) = [ cos ( θ ) sin ( θ ) 0 − sin ( θ ) cos ( θ ) 0 0 0 1 ] R_z(\theta) = \begin{bmatrix} \cos(\theta) & \sin(\theta) & 0 \\ -\sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(θ)=⎣⎡cos(θ)−sin(θ)0sin(θ)cos(θ)0001⎦⎤ -
三维坐标点绕任意坐标轴旋转可以表示为
[ x ′ y ′ z ′ ] = R x ( θ ) R y ( θ ) R z ( θ ) [ x y z ] \begin{bmatrix} x'\\y' \\z'\end{bmatrix}={R}_x(\theta){R}_y(\theta){R}_z(\theta)\begin{bmatrix} x\\y \\z\end{bmatrix} ⎣⎡x′y′z′⎦⎤=Rx(θ)Ry(θ)Rz(θ)⎣⎡xyz⎦⎤
剪切变换
二维剪切
- x方向剪切
[
x
′
y
′
]
=
[
1
a
0
1
]
[
x
y
]
\begin{bmatrix} x'\\y'\end{bmatrix}=\begin{bmatrix} 1& a\\ 0&1\end{bmatrix}\begin{bmatrix} x\\y\end{bmatrix}
[x′y′]=[10a1][xy]
特点:y值不变,x坐标在最高的点平移了a,最低点没有移动,其余位置为a
∗
*
∗y
- y方向剪切:
[ x ′ y ′ ] = [ 1 0 a 1 ] [ x y ] \begin{bmatrix} x'\\y'\end{bmatrix}=\begin{bmatrix} 1& 0\\ a&1\end{bmatrix}\begin{bmatrix} x\\y\end{bmatrix} [x′y′]=[1a01][xy]
三维剪切
沿z方向剪切:
S
z
=
[
1
0
0
0
1
0
λ
1
λ
2
1
]
S_z = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ \lambda_{1} & \lambda_{2} & 1 \end{bmatrix}
Sz=⎣⎡10λ101λ2001⎦⎤
以z轴剪切为例,
λ
1
\lambda _{1}
λ1
λ
2
\lambda _{2}
λ2 表示剪切因子,剪切因子的值决定了剪切的强度和方向,越大就沿该轴的移动量越多,点坐标左乘该矩阵的效果为x,y坐标不变,z轴坐标产生移动,
**沿y方向剪切
S
z
=
[
1
0
0
λ
2
1
λ
1
0
0
1
]
S_z = \begin{bmatrix} 1 & 0 & 0 \\ \lambda_{2} & 1 & \lambda_{1} \\ 0 & 0 & 1 \end{bmatrix}
Sz=⎣⎡1λ200100λ11⎦⎤
沿z方向剪切
S
z
=
[
1
λ
1
λ
2
0
1
0
0
0
1
]
S_z = \begin{bmatrix} 1 & \lambda_{1} & \lambda_{2} \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}
Sz=⎣⎡100λ110λ201⎦⎤
### 平移变换
非线性平移
一想到平移,我们首先会想到这种形式也称(仿射变换)
[
x
′
y
′
z
′
]
=
[
x
y
z
]
+
[
x
0
y
0
z
0
]
\begin{bmatrix} x'\\y' \\z'\end{bmatrix}=\begin{bmatrix} x\\y \\z\end{bmatrix}+\begin{bmatrix} x_{0}\\y_{0} \\z_{0}\end{bmatrix}
⎣⎡x′y′z′⎦⎤=⎣⎡xyz⎦⎤+⎣⎡x0y0z0⎦⎤
这样的平移变换当然是可行的,但是前面的变换都是左乘一个矩阵就可以完成,而这样的平移变换会带来矩阵加法运算,。人们总是希望能有一个统一的方法来表示同类事物,希望平移变换也能够像其他变换一样用同样的形式表示,使用起来更加便捷统一。
前辈大牛们经过各种尝试,想出了一个办法,就是引入齐次坐标
齐次坐标
简而言之,齐次坐标就是用N+1维来代表N维坐标
把点
[
x
y
z
]
\begin{bmatrix} x\\y \\z\end{bmatrix}
⎣⎡xyz⎦⎤ 用
[
x
y
z
1
]
\begin{bmatrix} x\\y \\z\\1\end{bmatrix}
⎣⎢⎢⎡xyz1⎦⎥⎥⎤表示,
把向量
[
x
y
z
]
\begin{bmatrix} x\\y \\z\end{bmatrix}
⎣⎡xyz⎦⎤ 用
[
x
y
z
0
]
\begin{bmatrix} x\\y \\z\\0\end{bmatrix}
⎣⎢⎢⎡xyz0⎦⎥⎥⎤表示,
向量具有平移不变形,任何一个向量平移后表示原来的向量,在向量转为齐次坐标形式的时候,在末尾添加0,就是为了保护这个向量在平移过程中不发生变化。
线性平移
引入齐次坐标以后,仿射变换可以转换为
[
x
′
y
′
z
′
1
]
=
[
1
0
0
x
0
0
1
0
y
0
0
0
1
z
0
0
0
0
1
]
[
x
y
z
1
]
\begin{bmatrix} x'\\y' \\z'\\1\end{bmatrix}=\begin{bmatrix} 1 & 0&0 & x_{0}\\ 0& 1&0 & y_{0} \\ 0& 0 &1&z_{0} \\ 0& 0 &0&1\end{bmatrix}\begin{bmatrix} x\\ y\\ z\\1\end{bmatrix}
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡100001000010x0y0z01⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
逆变换
逆变换就是乘以乘以变换矩阵的 逆矩阵