Games101----Viewing Transformation
1. V i e w / C a m e r a T r a n s f o r m a t i o n View/Camera \space\space Transformation View/Camera Transformation
1.1 什么是 v i e w t r a n s f o r m a t i o n ? view \space\space transformation? view transformation?
- 想象一下如何拍照
- 找一个好的地方,安排好人的站位、姿势等( m o d e l t r a n s f o r m a t i o n model \space\space transformation model transformation)
- 找一个好的拍照“角度”( v i e w t r a n s f o r m a t i o n view \space\space transformation view transformation)
- 茄子!( p r o j e c t i o n t r a n s f o r m a t i o n projection \space\space transformation projection transformation)
1.2 如何实现一个 v i e w t r a n s f o r m a t i o n ? view \space\space transformation? view transformation?
- 首先定义一个相机
- Position: e ⇀ ; \overrightharpoon{e}; e;
- Look-at/gaze direction: g ˆ ; \text{\^{g}}; gˆ;
- Up direction:
t
⇀
\overrightharpoon{t}
t.
- 关键点:如果所有的物体跟着相机以相同的方式一起移动,拍摄出来的照片不变。
- 根据上一点,我们永远可以把相机变换到
- 位置在原点,up direction为Y轴正向,look at -Z方向;如下图所示。
- 而其他物体跟着相机一起移动。
- 假设将相机变换到“位置在原点,up direction为
Y
Y
Y轴正向,look at
−
Z
-Z
−Z方向”的变换矩阵为
M
v
i
e
w
M_{view}
Mview,则
M
v
i
e
w
M_{view}
Mview要实现:
- 移动 e ⇀ \overrightharpoon{e} e到原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0);
- 将 g ⇀ \overrightharpoon{g} g旋转到 − Z -Z −Z;
- 将 t t t旋转到 Y Y Y.
很明显,直接写出来非常困难!!!
- 换一种思路,将
M
v
i
e
w
M_{view}
Mview变成几种变换的组合形式,即先将相机平移到原点,然后再旋转到指定的形式,有
M
v
i
e
w
=
R
v
i
e
w
T
v
i
e
w
M_{view}=R_{view}T_{view}
Mview=RviewTview. 现在变成求
R
v
i
e
w
R_{view}
Rview和
T
v
i
e
w
T_{view}
Tview.
- 对
T
v
i
e
w
T_{view}
Tview,很明显有:
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{bmatrix}1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix}. Tview=⎣⎢⎢⎡100001000010−xe−ye−ze1⎦⎥⎥⎤. - 对
R
v
i
e
w
R_{view}
Rview,可以考虑反向的旋转,即:
X
→
g
×
t
X \rightarrow g \times t
X→g×t,
Y
→
t
Y \rightarrow t
Y→t,
Z
→
−
g
Z \rightarrow -g
Z→−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{bmatrix}x_{\text{\^{g}}\times \text{\^{t}}} & x_t & x_{-g} & 0 \\ y_{\text{\^{g}}\times \text{\^{t}}} & y_t & y_{-g} & 0 \\ z_{\text{\^{g}}\times \text{\^{t}}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}. Rview−1=⎣⎢⎢⎡xgˆ×tˆygˆ×tˆzgˆ×tˆ0xtytzt0x−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{bmatrix}x_{\text{\^{g}}\times \text{\^{t}}} & y_{\text{\^{g}}\times \text{\^{t}}} & z_{\text{\^{g}}\times \text{\^{t}}} & 0 \\ x_t & y_t & z_t & 0 \\ x_{-g} & y_{-g} & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}. Rview=⎣⎢⎢⎡xgˆ×tˆxtx−g0ygˆ×tˆyty−g0zgˆ×tˆztz−g00001⎦⎥⎥⎤.
- 对
T
v
i
e
w
T_{view}
Tview,很明显有:
1.3 旋转矩阵的逆就是旋转矩阵的转置的简单证明
以二维为例,旋转
θ
\theta
θ角的旋转矩阵为:
R
θ
=
[
cos
θ
−
sin
θ
sin
θ
cos
θ
]
.
R_{\theta}=\begin{bmatrix}\cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}.
Rθ=[cosθsinθ−sinθcosθ].
其逆变换为反向旋转
θ
\theta
θ角,即旋转
−
θ
-\theta
−θ角:
R
−
θ
=
[
cos
θ
sin
θ
−
sin
θ
cos
θ
]
.
R_{-\theta}=\begin{bmatrix}\cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}.
R−θ=[cosθ−sinθsinθcosθ].
显然,有:
R
−
θ
=
R
θ
T
.
R_{-\theta}=R_{\theta}^T.
R−θ=RθT.
2. 投影变换( P r o j e c t i o n T r a n s f o r m a t i o n Projection \space\space Transformation Projection Transformation)
- 从3D到2D的变换
- 正交投影(Orthographic Transformation)
- 透视投影(Perspective Transformation)
2.1 正交投影和透视投影的对比
2.2 正交投影
- 更容易理解正交投影的方式
- 将摄像机放置在原点,对着 − Z -Z −Z轴,向着 Y Y Y轴,是不是很熟悉?
- 丢掉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]映射到标准的立方体
[
−
1
,
1
]
3
[-1,1]^3
[−1,1]3上。
- 先平移,将立方体的中心平移到原点为止;
- 再缩放到标准立方体的大小;
- 如下图所示。
- 求变换矩阵
- 先平移,即将立方体中心点 ( ( r + l ) / 2 , ( t + b ) / 2 , ( n + f ) / 2 ) ((r+l)/2, (t+b)/2, (n+f)/2) ((r+l)/2,(t+b)/2,(n+f)/2)平移到原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),其平移矩阵为 [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] ; \begin{bmatrix} 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{bmatrix}; ⎣⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎤;
- 后缩放,缩放矩阵为 [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] ; \begin{bmatrix} \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{bmatrix}; ⎣⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎤;
- 因此,变换矩阵为
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 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] . M_{ortho}=\begin{bmatrix} \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{bmatrix} \begin{bmatrix} 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{bmatrix}. Mortho=⎣⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎤⎣⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎤. - 警告:由于是指向 − Z -Z −Z轴, n n n和 f f f的大小不太符合直觉。
2.3 透视投影
- 在计算机图形学、艺术和视觉系统更为常见;
- 呈现出近大远小的特点;
- 平行线不平行;收敛于某一点。
- 如何做透视投影
- 首先,先将平截头体“挤成”一个立方体 ( n → n , f → f ) , ( M p e r s p → o r t h o ) (n \rightarrow n, f \rightarrow f), (M_{persp \rightarrow ortho}) (n→n,f→f),(Mpersp→ortho),如下图;
- 然后再进行正交变换(见上节的内容)。
- 为了得出变换,参考下图,找出变换后的点
(
x
′
,
y
′
,
z
′
)
(x', y',z')
(x′,y′,z′)和原来的点
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)之间的关系;
从而有: y ′ = n z y , x ′ = n z x . y'=\frac{n}{z}y,x'=\frac{n}{z}x. y′=zny,x′=znx.
用齐次坐标表示就是:
[
x
y
z
1
]
⇒
[
n
x
/
z
n
y
/
z
u
n
k
n
o
w
n
1
]
=
=
[
n
x
n
y
u
n
k
n
o
w
n
z
]
\begin{bmatrix} x \\ y \\ z \\ 1\end{bmatrix}\Rightarrow \begin{bmatrix} nx/z \\ ny/z \\ unknown \\ 1\end{bmatrix}==\begin{bmatrix} nx \\ ny \\ unknown \\ z\end{bmatrix}
⎣⎢⎢⎡xyz1⎦⎥⎥⎤⇒⎣⎢⎢⎡nx/zny/zunknown1⎦⎥⎥⎤==⎣⎢⎢⎡nxnyunknownz⎦⎥⎥⎤
- 因此,有:
M p e r s p → o r t h o ( 4 × 4 ) [ x y z 1 ] = [ n x n y u n k n o w n z ] M_{persp \rightarrow ortho}^{(4 \times 4)}\begin{bmatrix} x \\ y \\ z \\ 1\end{bmatrix}=\begin{bmatrix} nx \\ ny \\ unknown \\ z\end{bmatrix} Mpersp→ortho(4×4)⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡nxnyunknownz⎦⎥⎥⎤ - 从而,可以求得部分的
M
p
e
r
s
p
→
o
r
t
h
o
M_{persp \rightarrow ortho}
Mpersp→ortho:
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 \rightarrow ortho}=\begin{bmatrix}n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ ? & ? & ? & ? \\ 0 & 0 & 1 & 0 \end{bmatrix}. Mpersp→ortho=⎣⎢⎢⎡n0?00n?000?100?0⎦⎥⎥⎤. - 如何求第三行的值?
- 通过观察,第三行负责
z
′
z'
z′值:
- 近平面上的任意一点不会改变;
- 远平面上任意一点的 z z z值不会改变。
- 近平面上的任意一点不会改变
所以,第三行必定是 ( 0 , 0 , A , B ) (0,0,A,B) (0,0,A,B)的形式(否则,必定包含有 x x x或者 y y y的项),从而有:
A n + B = n 2 (1) \tag{1}An+B=n^2 An+B=n2(1) - 远平面上任意一点的
z
z
z值不会改变
(隐约记得, x x x和 y y y用 0 0 0替代是因为第三行前两项为 0 0 0)。
由上图,有:
A f + B = f 2 (2) \tag{2}Af+B=f^2 Af+B=f2(2)
联立 ( 1 ) ( 2 ) (1)(2) (1)(2)求解可得:
{ A = n + f B = − n f \begin{cases} A=n+f \\ B=-nf\end{cases} {A=n+fB=−nf - 所以
M p e r s p → o r t h o = [ n 0 0 1 0 n 0 0 0 0 n + f − n f 0 0 0 1 ] . M_{persp \rightarrow ortho}=\begin{bmatrix}n & 0 & 0 & 1 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 0 & 1 \end{bmatrix}. Mpersp→ortho=⎣⎢⎢⎡n0000n0000n+f010−nf1⎦⎥⎥⎤.
最终的 M p e r s p = M o r t h o M p e r s p → o r t h o . M_{persp}=M_{ortho}M_{persp \rightarrow ortho}. Mpersp=MorthoMpersp→ortho. 即:
M p e r s p = [ 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 1 0 n 0 0 0 0 n + f − n f 0 0 0 1 ] . M_{persp}=\begin{bmatrix} \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{bmatrix} \begin{bmatrix} 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{bmatrix}\begin{bmatrix}n & 0 & 0 & 1 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 0 & 1 \end{bmatrix}. Mpersp=⎣⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎤⎣⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎤⎣⎢⎢⎡n0000n0000n+f010−nf1⎦⎥⎥⎤.