Transformation
2D 线性变换
- 线性变换:变换能够用矩阵乘法得到
可以说,Linear Transformation = Matrices (of the same dimension)
我们将如下所示的简单矩阵乘法定义为对向量
(
x
,
y
)
T
(x, y)^{T}
(x,y)T 的线性变换。
[
a
11
a
12
a
21
a
22
]
[
x
y
]
=
[
a
11
x
+
a
12
y
a
21
x
+
a
22
y
]
\left[\begin{array}{ll} a_{11} & a_{12} \\ a_{21} & a_{22} \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right]=\left[\begin{array}{l} a_{11} x+a_{12} y \\ a_{21} x+a_{22} y \end{array}\right]
[a11a21a12a22][xy]=[a11x+a12ya21x+a22y]
缩放 (scale)
缩放变换是一种沿着坐标轴作用的变换,定义如下:
scale
(
s
x
,
s
y
)
=
[
s
x
0
0
s
y
]
\operatorname{scale}\left(s_{x}, s_{y}\right)=\left[\begin{array}{cc} s_{x} & 0 \\ 0 & s_{y} \end{array}\right]
scale(sx,sy)=[sx00sy]
即除了
(
0
,
0
)
T
(0,0)^{T}
(0,0)T 保持不变之外,所有的点变为
(
s
x
x
,
s
y
y
)
T
\left(s_{x} x, s_{y} y\right)^{T}
(sxx,syy)T
剪切 (shearing)
shear 变换直观理解就是把物体一边固定,然后拉另外一边,定义如下:
s
h
e
a
r
−
x
(
s
)
=
[
1
s
0
1
]
,
s
h
e
a
r
−
y
(
s
)
=
[
1
0
s
1
]
shear-x(s)=\left[\begin{array}{ll}1 & s \\ 0 & 1\end{array}\right], \\shear-y (s)=\left[\begin{array}{ll}1 & 0 \\ s & 1\end{array}\right]
shear−x(s)=[10s1],shear−y(s)=[1s01]
- 拉向 x x x 轴
- 拉向 y y y 轴
旋转 (rotation)
- 在无特殊说明的情况下,默认关于 ( 0 , 0 ) (0,0) (0,0) 点,逆时针方向旋转 θ \theta θ 角度(弧度)的公式如下
R θ = [ cos θ − sin θ sin θ cos θ ] \mathbf{R}_{\theta}=\left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] Rθ=[cosθsinθ−sinθcosθ]
推导如下
齐次坐标
- 以上的线性变换矩阵不能描述平移变换,为了统一平移变换和线性变换(以上三种变换),引入平移变换
定义 2D 坐标和 2D向量如下
- 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
- 由于向量具有平移不变性,第3维的0保护了向量不会因为平移而改变
齐次坐标下向量和点的操作
-
vector + vector = vector
-
point – point = vector
-
point + vector = point (一个点沿着向量移动)
-
point + point = 两个点的中点
此外,当第三维为
w
(
w
≠
0
)
w(w\ne 0)
w(w=0)时,定义
(
x
y
w
)
is the
2
D
point
(
x
/
w
y
/
w
1
)
,
w
≠
0
\left(\begin{array}{c} x \\ y \\ w \end{array}\right) \text { is the } 2 \mathrm{D} \text { point }\left(\begin{array}{c} x / w \\ y / w \\ 1 \end{array}\right), w \neq 0
⎝
⎛xyw⎠
⎞ is the 2D point ⎝
⎛x/wy/w1⎠
⎞,w=0
仿射变换
- 仿射变换使用一个矩阵统一了所有操作
- 先应用线性变换再应用平移变换
仿射变换下 2D 变换的描述
Scale
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⎠ ⎞
Rotation
R ( α ) = ( cos α − sin α 0 sin α cos α 0 0 0 1 ) \mathbf{R}(\alpha)=\left(\begin{array}{ccc} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1 \end{array}\right) R(α)=⎝ ⎛cosαsinα0−sinαcosα0001⎠ ⎞
Translation
T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) \mathbf{T}\left(t_{x}, t_{y}\right)=\left(\begin{array}{ccc} 1 & 0 & t_{x} \\ 0 & 1 & t_{y} \\ 0 & 0 & 1 \end{array}\right) T(tx,ty)=⎝ ⎛100010txty1⎠ ⎞
逆变换
- 使用逆矩阵
- M − 1 \mathbf{M}^{-1} M−1 is the inverse of transform M \mathbf{M} M in both a matrix and geometric sense
复合变换
- 复杂变换可由简单变换得到
- 变换的顺序非常重要,如先旋转再平移和先平移再旋转得到的结果不同
- 矩阵变换不满足交换律
- 计算是右结合的
3D 线性变换
再次使用齐次坐标描述
- 3D point = ( x , y , z , 1 ) T =(x, y, z, 1)^{T} =(x,y,z,1)T
- 3D vector = ( x , y , z , 0 ) T =(x, y, z, 0)^{T} =(x,y,z,0)T
- In general,
(
x
,
y
,
z
,
w
)
(
w
≠
0
)
(x, y, z, w)(w \ne0)
(x,y,z,w)(w=0) is the 3D point:
(
x
/
w
,
y
/
w
,
z
/
w
)
(x / w, y / w, z / w)
(x/w,y/w,z/w)
- e.g. ( 1 , 0 , 0 , 1 ) (1, 0, 0, 1) (1,0,0,1) and ( 2 , 0 , 0 , 2 ) (2, 0, 0, 2) (2,0,0,2) both represent ( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)
- 先应用线性变换再应用平移变换
Use
4
×
4
4 \times 4
4×4 matrices for affine transformations
(
x
′
y
′
z
′
1
)
=
(
a
b
c
t
x
d
e
f
t
y
g
h
i
t
z
0
0
0
1
)
⋅
(
x
y
z
1
)
\left(\begin{array}{l} x^{\prime} \\ y^{\prime} \\ z^{\prime} \\ 1 \end{array}\right)=\left(\begin{array}{lllc} a & b & c & t_{x} \\ d & e & f & t_{y} \\ g & h & i & t_{z} \\ 0 & 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right)
⎝
⎛x′y′z′1⎠
⎞=⎝
⎛adg0beh0cfi0txtytz1⎠
⎞⋅⎝
⎛xyz1⎠
⎞
Scale
S ( s x , s y , s z ) = ( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \mathbf{S}\left(s_{x}, s_{y}, s_{z}\right)=\left(\begin{array}{cccc} s_{x} & 0 & 0 & 0 \\ 0 & s_{y} & 0 & 0 \\ 0 & 0 & s_{z} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) S(sx,sy,sz)=⎝ ⎛sx0000sy0000sz00001⎠ ⎞
Translation
T ( t x , t y , t z ) = ( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \mathbf{T}\left(t_{x}, t_{y}, t_{z}\right)=\left(\begin{array}{cccc} 1 & 0 & 0 & t_{x} \\ 0 & 1 & 0 & t_{y} \\ 0 & 0 & 1 & t_{z} \\ 0 & 0 & 0 & 1 \end{array}\right) T(tx,ty,tz)=⎝ ⎛100001000010txtytz1⎠ ⎞
? Rotation
-
around x − , y − x-, y- x−,y−, or z z z-axis
-
sin α \sin \alpha sinα 的正负号由右手定则确定,顺序是 x → z x\to z x→z
R x ( α ) = ( 1 0 0 0 0 cos α − sin α 0 0 sin α cos α 0 0 0 0 1 ) R y ( α ) = ( cos α 0 sin α 0 0 1 0 0 − sin α 0 cos α 0 0 0 0 1 ) R z ( α ) = ( cos α − sin α 0 0 sin α cos α 0 0 0 0 1 0 0 0 0 1 ) \begin{aligned} \mathbf{R}_{x}(\alpha) &=\left(\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha & 0 \\ 0 & \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \\ \mathbf{R}_{y}(\alpha) &=\left(\begin{array}{cccc} \cos \alpha & 0 & \sin \alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \alpha & 0 & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \\ \mathbf{R}_{z}(\alpha) &=\left(\begin{array}{cccc} \cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \end{aligned} Rx(α)Ry(α)Rz(α)=⎝ ⎛10000cosαsinα00−sinαcosα00001⎠ ⎞=⎝ ⎛cosα0−sinα00100sinα0cosα00001⎠ ⎞=⎝ ⎛cosαsinα00−sinαcosα0000100001⎠ ⎞
- 所有的 3D 变换都可以被描述为在
x
,
y
,
z
x,y,z
x,y,z 轴上的旋转
- 也叫欧拉角
- Often used in flight simulators: roll, pitch, yaw
R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) \mathbf{R}_{x y z}(\alpha, \beta, \gamma)=\mathbf{R}_{x}(\alpha) \mathbf{R}_{y}(\beta) \mathbf{R}_{z}(\gamma) Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
Rodrigues’ Rotation Formula
Rotation by angle
α
\alpha
α around axis
n
n
n
R
(
n
,
α
)
=
cos
(
α
)
I
+
(
1
−
cos
(
α
)
)
n
n
T
+
sin
(
α
)
(
0
−
n
z
n
y
n
z
0
−
n
x
−
n
y
n
x
0
)
⏟
N
\mathbf{R}(\mathbf{n}, \alpha)=\cos (\alpha) \mathbf{I}+(1-\cos (\alpha)) \mathbf{n} \mathbf{n}^{T}+\sin (\alpha) \underbrace{\left(\begin{array}{ccc} 0 & -n_{z} & n_{y} \\ n_{z} & 0 & -n_{x} \\ -n_{y} & n_{x} & 0 \end{array}\right)}_{\mathbf{N}}
R(n,α)=cos(α)I+(1−cos(α))nnT+sin(α)N
⎝
⎛0nz−ny−nz0nxny−nx0⎠
⎞
View / Camera Transformation
Think about how to take a photo
- Find a good place and arrange people (model transformation)
- Find a good “angle” to put the camera (view transformation)
- Cheese! (projection transformation 将三维空间投影到二维视图上)
Projection transformation
Orthographic projection
正则投影的步骤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fx3Pqwmp-1660291810051)(https://cdn.jsdelivr.net/gh/QiuHong-1202/FigureBed/2021/202208071729657.png)]
正则立方体
- map a cuboid
[
l
,
r
]
×
[
b
,
t
]
×
[
f
,
n
]
[l, r] \times [b, t] \times [f, n]
[l,r]×[b,t]×[f,n] to the “canonical (正则、规范、标准)” cube
[
−
1
,
1
]
3
[-1, 1]^3
[−1,1]3
- 因为是朝着 z z z 轴负方向看,所以坐标小的是更远的 f f f ,坐标大的是更近的 n n n
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTM6RjtF-1660291810052)(https://cdn.jsdelivr.net/gh/QiuHong-1202/FigureBed/2021/202208071733145.png)]
正则投影的变换矩阵
Translate (center to origin) first, then scale (length/width/height to 2)
M
ortho
=
[
2
r
−
l
0
0
0
0
2
t
−
b
0
0
0
0
2
n
−
f
0
0
0
0
1
]
[
1
0
0
−
r
+
l
2
0
1
0
−
t
+
b
2
0
0
1
−
n
+
f
2
0
0
0
1
]
M_{\text {ortho }}=\left[\begin{array}{cccc} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{array}\right]
Mortho =⎣
⎡r−l20000t−b20000n−f200001⎦
⎤⎣
⎡100001000010−2r+l−2t+b−2n+f1⎦
⎤
Perspective projection
透视投影的步骤
- First “squish” the frustum into a cuboid
(
n
→
n
,
f
→
f
)
(
M
p
e
r
s
p
→
o
r
t
h
o
)
(n \to n, f \to f) (M_{persp\to ortho})
(n→n,f→f)(Mpersp→ortho) (将远平面挤压为与近平面相同的大小)
- 挤压规则
- 近平面永远不变,任何点在近平面上不变
- 远平面 z z z 值不变,任何远平面上的点 z z z 值不变
- 远平面的中心不变
- 挤压规则
- Do orthographic projection ( M o r t h o M_{ortho} Mortho) (做正则投影)
透视投影的变换矩阵推导
计算机图形学二:视图变换(坐标系转化,正交投影,透视投影,视口变换)
透视投影的变换矩阵
M per = M ortho M persp → ortho \mathrm{M}_{\text {per }}=\mathrm{M}_{\text {ortho }} \mathrm{M}_{\text {persp } \rightarrow\text { ortho }} Mper =Mortho Mpersp → ortho
M per = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f − f n 0 0 1 0 ] \mathrm{M}_{\text {per }}=\left[\begin{array}{cccc} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{array}\right] \left[\begin{array}{cccc} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -f n \\ 0 & 0 & 1 & 0 \end{array}\right] Mper =⎣ ⎡r−l20000t−b20000n−f200001⎦ ⎤⎣ ⎡100001000010−2r+l−2t+b−2n+f1⎦ ⎤⎣ ⎡n0000n0000n+f100−fn0⎦ ⎤