模型变换
视图变换
2D变换
缩放scale
( x ′ y ′ ) = ( s x 0 0 s y ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} s_x & 0 \\ 0 & s_y \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (x′y′)=(sx00sy)(xy)
反射Reflection
( x ′ y ′ ) = ( − 1 0 0 1 ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} -1 & 0 \\ 0 & 1 \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (x′y′)=(−1001)(xy)
切变Shear
(
x
′
y
′
)
=
(
1
a
0
1
)
(
x
y
)
\begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} 1 & a \\ 0 & 1 \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix}
(x′y′)=(10a1)(xy)
旋转Rotation
默认绕原点,逆时针旋转。
(
x
′
y
′
)
=
(
cos
θ
−
sin
θ
sin
θ
cos
θ
)
(
x
y
)
\begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix}
(x′y′)=(cosθsinθ−sinθcosθ)(xy)
线型变换
(
x
′
y
′
)
=
(
a
b
c
d
)
(
x
y
)
\begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} a & b \\ c & d \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix}
(x′y′)=(acbd)(xy)
x
′
=
M
x
x'=Mx
x′=Mx
齐次坐标
平移变换
x
′
=
x
+
t
x
,
y
′
=
x
+
t
y
x'=x+t_x,\ \\ y'=x+t_y
x′=x+tx, y′=x+ty
不能写成矩阵乘法形式 –仿射变换Affine
(
x
′
y
′
)
=
(
a
b
c
d
)
(
x
y
)
+
(
t
x
t
y
)
\begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} a & b \\ c & d \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} + \begin{pmatrix} t_x\\ t_y \\ \end{pmatrix}
(x′y′)=(acbd)(xy)+(txty)
平移不是线性变换。那么能不能统一起来?
算法中trade-off
齐次坐标
二维点
(
x
,
y
,
1
)
T
(x,y,1)^T
(x,y,1)T
二维向量
(
x
,
y
,
0
)
T
(x,y,0)^T
(x,y,0)T ,向量表示方向,平移不变性
齐次坐标:
(
x
′
y
′
w
′
)
=
(
1
0
t
x
0
1
t
y
0
0
1
)
(
x
y
1
)
=
(
x
+
t
x
y
+
t
y
1
)
\begin{pmatrix} x' \\ y' \\ w' \end{pmatrix}= \begin{pmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x+t_x \\ y+t_y \\ 1 \end{pmatrix}
x′y′w′
=
100010txty1
xy1
=
x+txy+ty1
w左边为1或0为有效运算:
- 向量+向量=向量
- 点 - 点 = 向量
- 点 + 向量 = 点, 点移动
- 点 + 点 =??两个点的中点
( x , y , w ) (x,y,w) (x,y,w)是二维点 ( x / w , y / w . 1 ) , w ≠ 0 (x/w,y/w.1), w\ne 0 (x/w,y/w.1),w=0
齐次坐标下仿射变换
(
x
′
y
′
1
)
=
(
a
b
t
x
c
d
t
y
0
0
1
)
(
x
y
1
)
=
(
x
+
t
x
y
+
t
y
1
)
\begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix}= \begin{pmatrix} a & b & t_x\\ c & d & t_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x+t_x \\ y+t_y \\ 1 \end{pmatrix}
x′y′1
=
ac0bd0txty1
xy1
=
x+txy+ty1
变换矩阵理论上只需存储六个值
逆变换
矩阵的逆
组合变换
变换顺序很重要
推广到多个变换
如何绕一个给定点
c
c
c旋转
1.平移中心到原点 2. 旋转 3. 平移到原位置
T ( c ) ⋅ R ( α ) ⋅ T ( − c ) T(c)\cdot R(\alpha)\cdot T(-c) T(c)⋅R(α)⋅T(−c)
3D变换
三维点
(
x
,
y
,
z
,
1
)
T
(x,y,z,1)^T
(x,y,z,1)T
三维向量
(
x
,
y
,
z
,
0
)
T
(x,y,z,0)^T
(x,y,z,0)T
仿射变换
(
x
′
y
′
z
′
1
)
=
(
a
b
c
t
x
c
d
f
t
y
g
h
i
t
z
0
0
0
1
)
(
x
y
z
1
)
\begin{pmatrix} x' \\ y' \\ z'\\ 1 \end{pmatrix}= \begin{pmatrix} a & b & c&t_x\\ c & d & f&t_y\\ g & h & i & t_z\\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ z\\ 1 \end{pmatrix}
x′y′z′1
=
acg0bdh0cfi0txtytz1
xyz1
先线性变换再平移
R
θ
=
(
cos
θ
−
sin
θ
sin
θ
cos
θ
)
R_\theta = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \\ \end{pmatrix}
Rθ=(cosθsinθ−sinθcosθ)
R
−
θ
=
(
cos
θ
sin
θ
−
sin
θ
cos
θ
)
R_{-\theta}=\begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \\ \end{pmatrix}
R−θ=(cosθ−sinθsinθcosθ)
R
−
θ
=
R
θ
T
R_{-\theta} = R_\theta^T
R−θ=RθT,
R
−
θ
=
R
θ
−
1
R_{-\theta}=R_\theta^{-1}
R−θ=Rθ−1
旋转
绕x,y,z轴
R x ( θ ) = ( 1 0 0 0 0 cos θ − sin θ 0 0 sin θ cos θ 0 0 0 0 1 ) R_x(\theta)=\begin{pmatrix} 1&0&0&0\\ 0&\cos\theta & -\sin\theta &0\\ 0&\sin\theta & \cos\theta &0\\ 0&0&0&1 \end{pmatrix} Rx(θ)= 10000cosθsinθ00−sinθcosθ00001
R y ( θ ) = ( cos θ 0 sin θ 0 0 1 0 0 − sin θ 0 cos θ 0 0 0 0 1 ) R_y(\theta)=\begin{pmatrix} \cos\theta&0&\sin\theta&0\\ 0& 1& 0 &0\\ -\sin\theta&0 & \cos\theta &0\\ 0&0&0&1 \end{pmatrix} Ry(θ)= cosθ0−sinθ00100sinθ0cosθ00001
R z ( θ ) = ( cos θ − sin θ 0 0 sin θ cos θ 0 0 0 0 1 0 0 0 0 1 ) R_z(\theta)=\begin{pmatrix} \cos\theta&-\sin\theta &0&0\\ \sin\theta&\cos\theta & 0&0\\ 0&0 & 1&0\\ 0&0&0&1 \end{pmatrix} Rz(θ)= cosθsinθ00−sinθcosθ0000100001
任意两个可得到后一个。
y怎么是反的,z叉乘x得到y
R
x
y
z
(
α
,
β
,
γ
)
=
R
x
(
α
)
R
y
(
β
)
R
y
(
γ
)
R_{xyz}(\alpha,\beta,\gamma)=R_{x}(\alpha)R_y(\beta)R_y(\gamma)
Rxyz(α,β,γ)=Rx(α)Ry(β)Ry(γ)
欧拉角
roll, pitch, yaw
Rodrigues’ Rotation Formula
绕(过原点)轴 n \mathbf{n} n旋转角度 α \alpha α:
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
)
R(\mathbf{n},\alpha) = \cos(\alpha) \mathbf{I} + (1-\cos\alpha)\mathbf{n}\mathbf{n}^T + \sin\alpha\begin{pmatrix} 0 & -n_z & n_y\\ n_z & 0 & -n_x\\ -n_y & n_x & 0 \end{pmatrix}
R(n,α)=cos(α)I+(1−cosα)nnT+sinα
0nz−ny−nz0nxny−nx0
绕任意轴旋转:平移,旋转,平移回原位置
证明:待补充
旋转矩阵不适合插值,—四元数
Viewing (观测)transformation
- View/Camera transformation
- Projection transformation
- orthographic projection
- perspective projection
View/Camera transformation
模型变换:找的到合适的模型(风景/人)
视图变换:找到合适相机角度
投影变换
MVP变换
定义相机
- 位置 e ⃗ \vec{e} e
- look-at/gaze direction g ^ \hat{g} g^
- 上方向 Up direction
t
^
\hat{t}
t^
(assuming perp. to look-at)
key observations:
如果相机和所有的物体一起移动,那么照片相同
将相机变换到原点,up at Y轴,look at -Z轴
并随着相机变换对象
通过 M v i e w M_{view} Mview变换相机
- 平移到原点
- 旋转g到-z
- 旋转t到y
- 旋转(
g
×
t
g\times t
g×t)到X
M
v
i
e
w
=
R
v
i
e
w
T
v
i
e
w
M_{view}=R_{view}T_{view}\\
Mview=RviewTview
变换到原点
T
v
i
e
w
=
(
1
0
0
−
x
e
0
1
0
−
y
e
0
0
1
−
z
e
0
0
0
1
)
T_{view}=\begin{pmatrix} 1 & 0 & 0 & -x_e\\ 0 & 1 & 0 & -y_e\\ 0 & 0 & 1 & -z_e\\ 0 & 0 & 0 & 1 \end{pmatrix}
Tview=
100001000010−xe−ye−ze1
旋转g到-z, 旋转t到y, 旋转(
g
×
t
g\times t
g×t)到X
考虑逆旋转:X TO
g
×
t
g\times t
g×t, y TO t, z TO -g
R
v
i
e
w
−
1
=
(
x
g
×
t
x
t
x
−
g
0
y
g
×
t
y
t
y
−
g
0
z
g
×
t
z
t
z
−
g
0
0
0
0
1
)
R_{view}^{-1}=\begin{pmatrix} x_{g\times t} & x_t & x_{-g} & 0\\ y_{g\times t} & y_t & y_{-g} & 0\\ z_{g\times t} & z_t & z_{-g} & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}
Rview−1=
xg×tyg×tzg×t0xtytzt0x−gy−gz−g00001
则
R
v
i
e
w
=
(
x
g
×
t
y
g
×
t
z
g
×
t
0
x
t
y
t
z
t
0
x
−
g
y
−
g
z
−
g
0
0
0
0
1
)
R_{view}=\begin{pmatrix} x_{g\times t} & y_{g\times t} & z_{g\times t} & 0\\ x_t & y_t & z_t & 0\\ x_{-g} & y_{-g} & z_{-g} & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}
Rview=
xg×txtx−g0yg×tyty−g0zg×tztz−g00001
ModelView
Projection transformation
3D TO 2D
正交投影, 透视投影
Orthographic projection 正交投影
简单理解:
相机放在原点,up at Y轴,look at -Z轴
去掉z坐标
平移缩放结果到
[
−
1
,
1
]
2
[-1,1]^2
[−1,1]2
(如何区分物体前后?)
一般:
将一个立方体
[
l
,
r
]
×
[
b
,
t
]
×
[
f
,
n
]
[l,r]\times[b,t]\times[f,n]
[l,r]×[b,t]×[f,n]映射到canonical(正则,规范,标准) cube
[
−
1
,
1
]
3
[-1,1]^3
[−1,1]3
M
o
r
t
h
o
=
(
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
−
l
+
r
2
0
1
0
−
t
+
b
2
0
0
1
−
n
+
f
2
0
0
0
1
)
M_{ortho}=\begin{pmatrix} 2/(r-l) & 0 & 0 & 0\\ 0 & 2/(t-b) & 0 & 0\\ 0 & 0 & 2/(n-f) & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 & -\frac{l+r}{2}\\ 0 & 1 & 0 & -\frac{t+b}{2}\\ 0 & 0 & 1 & -\frac{n+f}{2}\\ 0 & 0 & 0 & 1 \end{pmatrix}
Mortho=
2/(r−l)00002/(t−b)00002/(n−f)00001
100001000010−2l+r−2t+b−2n+f1
near > far
OpenGL使用左手系
Perspective projection 透视投影
更符合现实
近大远小
平行线可能相交于一个点
透视投影过程:
将锥体映射到一个立方体(
M
p
e
r
−
>
o
t
h
M_{per->oth}
Mper−>oth),做正交投影(
M
o
t
h
M_{ oth}
Moth)
规定近平面不变
( x ′ y ′ z ′ 1 ) = ( n x / z n y z u n k n o w 1 ) = = > ( n x n y u n k n o w n z ) \begin{pmatrix}x' \\y' \\z'\\1 \end{pmatrix}=\begin{pmatrix}nx/z\\nyz\\unknow\\1 \end{pmatrix}==>\begin{pmatrix} nx\\ ny\\ unknown\\ z \end{pmatrix} x′y′z′1 = nx/znyzunknow1 ==> nxnyunknownz
M
p
e
r
s
p
−
>
o
r
t
h
o
=
(
n
0
0
0
0
n
0
0
?
?
?
?
0
0
1
0
)
M_{persp->ortho}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ ? & ? & ? & ?\\ 0 & 0 & 1 & 0 \end{pmatrix}
Mpersp−>ortho=
n0?00n?000?100?0
第三行和z’有关
在近平面的点不变
(
x
y
n
1
)
=
=
(
n
x
n
y
n
2
n
)
\begin{pmatrix}x\\y\\n\\1 \end{pmatrix}== \begin{pmatrix}nx\\ny\\n^2\\n \end{pmatrix}
xyn1
==
nxnyn2n
对于变换矩阵第三行
(
0
0
A
B
)
(
x
y
n
1
)
=
n
2
\begin{pmatrix}0&0&A&B\end{pmatrix}\begin{pmatrix}x\\y\\n\\1 \end{pmatrix}=n^2
(00AB)
xyn1
=n2
A
n
+
B
=
n
2
An+B=n^2
An+B=n2
远平面的点的z不变
(
0
0
f
1
)
\begin{pmatrix}0\\0\\f\\1 \end{pmatrix}
00f1
A
f
+
B
=
f
2
Af+B=f^2
Af+B=f2
A
=
n
+
f
,
B
=
−
n
f
A=n+f, B=-nf
A=n+f,B=−nf
中间的点的z变小?
最后做正交变换
可得透视变换的矩阵
近平面l,r,b,t
vertical field of view, fovY 垂直视场/可视角度
aspect ratio纵横比