Lecture4 - Transformation
0. 对上节课的补充
- 对于二维旋转变换,旋转角度为
θ
\theta
θ(默认绕原点逆时针旋转
θ
\theta
θ度),有如下旋转变换矩阵
R θ = [ cos θ − sin θ sin θ cos θ ] {\Large R_{ \theta} = \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta&\cos \theta \end{bmatrix}} Rθ=⎣ ⎡cosθsinθ−sinθcosθ⎦ ⎤
如果旋转角度为 − θ - \theta −θ度时,变换矩阵为
R − θ = [ cos θ sin θ − sin θ cos θ ] {\Large 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,而对于旋转角度为 θ \theta θ和旋转角度为 − θ -\theta −θ来说,这两个变换属于互逆变换,从上节课我们可以得知,一个变换是另外一个变换的逆变换,其变换矩阵有 R − θ = R θ − 1 R_{-\theta } = R_{\theta}^{-1} R−θ=Rθ−1,综上,我们就可以有如下结论
R − θ = R θ − 1 = R θ T \Large{ R_{-\theta } = R_{\theta}^{-1} = R_{\theta}^{T} } R−θ=Rθ−1=RθT
因此,当求一个旋转变换的逆变换矩阵的时候,我们可以不再求其逆矩阵,只需要求原变换矩阵的转置即可得到逆变换矩阵。 - 对于线性变换和平移变换二者合起来叫做仿射变换。
1. 三维变换
1.1 基本概念
- 类似于二维变换,我们定义三维点坐标为 ( x , y , z , 1 ) , T \left ( x,y,z,{\color{Red} 1} \right ) ,^{T} (x,y,z,1),T,三维向量可表示为 ( x , y , z , 0 ) , T \left ( x,y,z,{\color{Red} 0} \right ) ,^{T} (x,y,z,0),T。通常来说对于 ( x , y , z , w ) T \left ( x,y,z,w \right ) ^{T} (x,y,z,w)T所表达的三维点的坐标为 ( x w , y w , z w ) T \left ( \frac{x}{w} ,\frac{y}{w},\frac{z}{w} \right ) ^{T} (wx,wy,wz)T,其中 w ≠ 0 w\ne 0 w=0。
- 对于三维变换矩阵可表达为
[ 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 ] {\Large \begin{bmatrix} x^{\prime } \\ y^{\prime }\\ z^{\prime }\\ 1 \end{bmatrix} = \begin{bmatrix} a& b & c & t_{x} \\ d& e & f & t_{y}\\ g& h & i & t_{z}\\ 0& 0 & 0 & 1 \end{bmatrix}\cdot \begin{bmatrix} x \\ y\\ z\\ 1 \end{bmatrix}} ⎣ ⎡x′y′z′1⎦ ⎤=⎣ ⎡adg0beh0cfi0txtytz1⎦ ⎤⋅⎣ ⎡xyz1⎦ ⎤ - 缩放变换矩阵可表达为
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 ] {\Large S\left ( s_{x},s_{y},s_{z} \right ) = \begin{bmatrix} s_{x}& 0 & 0 & 0 \\ 0& s_{y} & 0 & 0\\ 0& 0 & s_{z} & 0\\ 0& 0 & 0 & 1 \end{bmatrix}} S(sx,sy,sz)=⎣ ⎡sx0000sy0000sz00001⎦ ⎤ - 平移变换矩阵可表达为
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 ] {\Large T\left ( t_{x},t_{y},t_{z} \right ) = \begin{bmatrix} 1& 0 & 0 & t_{x} \\ 0& 1 & 0 &t_{y}\\ 0& 0 & 1& t_{z}\\ 0& 0 & 0 & 1 \end{bmatrix}} T(tx,ty,tz)=⎣ ⎡100001000010txtytz1⎦ ⎤ - 对于三维变换的旋转来说可能会有一些复杂,但我们可以将其分解为绕
x
x
x轴旋转,绕
y
y
y轴旋转,绕
z
z
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 ] {\Large \begin{align*} &R_{x}\left ( \alpha \right ) = \begin{bmatrix} 1& 0 & 0 & 0\\ 0& \cos \alpha & -\sin \alpha & 0\\ 0& \sin \alpha & \cos \alpha & 0\\ 0& 0 & 0 & 1 \end{bmatrix}\\ &R_{y}\left ( \alpha \right ) = \begin{bmatrix} \cos \alpha& 0 & \sin \alpha & 0\\ 0& 1 & 0 & 0\\ -\sin \alpha& 0 & \cos \alpha & 0\\ 0& 0 & 0 & 1 \end{bmatrix}\\ &R_{z}\left ( \alpha \right ) = \begin{bmatrix} \cos \alpha& -\sin \alpha & 0 & 0\\ \sin \alpha& \cos \alpha & 0 & 0\\ 0& 0 & 1 & 0\\ 0& 0 & 0 & 1 \end{bmatrix} \end{align*}} Rx(α)=⎣ ⎡10000cosαsinα00−sinαcosα00001⎦ ⎤Ry(α)=⎣ ⎡cosα0−sinα00100sinα0cosα00001⎦ ⎤Rz(α)=⎣ ⎡cosαsinα00−sinαcosα0000100001⎦ ⎤ - 因此,三维旋转可由基本的绕轴旋转组合而成,其表达式如下
R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) {\Large R_{xyz} \left ( \alpha ,\beta, \gamma \right ) = R_{x}\left ( \alpha \right ) R_{y}\left ( \beta \right ) R_{z}\left ( \gamma \right ) } Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
其中 α , β , γ \alpha ,\beta, \gamma α,β,γ叫做欧拉角,在图形学中,可以很自然地使用飞机旋转的Roll,Yaw,Pitch来表达绕轴旋转,其示意图如下
1.2 罗德里格斯公式(Rodrigues’s Formula)(参考链接)
- 采用一个旋转轴 u \mathbf{u } u(默认是过坐标原点的轴)和一个旋转角 θ \mathbf{\theta } θ来刻画三维旋转。
- 假设一个过原点的旋转轴
u
=
(
x
,
y
,
z
)
T
u = \left ( x,y,z \right ) ^{T}
u=(x,y,z)T(如果不过原点,可以先把旋转轴平移至原点,进行旋转之后再移回原来位置),同时也规定
∥
u
∥
=
1
\left \| u \right \| = 1
∥u∥=1,即为一个单位向量,我们想把一个向量
v
v
v绕着这个轴旋转
θ
\theta
θ度变换到
v
′
v^{\prime }
v′,示意图如下:
- 根据上一节我们可以得知,三维旋转我们可以将其分解为简单的旋转然后进行组合之后即为旋转结果,因此,我们可以先将向量
v
v
v分解为平行于旋转轴和垂直于旋转轴的两个向量
v = v ∥ + v ⊥ {\Large v = v_{\parallel } + v_{\perp }} v=v∥+v⊥
然后分别旋转这两个分向量,然后再将它们的旋转结果相加即可获得旋转之后的向量
v ′ = v ∥ ′ + v ⊥ ′ {\Large v^{\prime } = v_{\parallel }^{\prime } + v_{\perp }^{\prime }} v′=v∥′+v⊥′ - 平行于旋转轴的向量旋转之后不变,因此,
v
∥
v_{\parallel }
v∥其实就是
v
v
v在旋转轴
u
u
u上的投影,一个向量由长度和方向组成,因此投影向量可以由该向量的长度与方向的乘积表达,因此可以通过点乘来计算(
u
u
u是一个单位向量,
α
\alpha
α为向量
v
v
v和
u
u
u的夹角)
v ∥ ′ = ∥ v ∥ cos α × u = ∥ u ∥ ∥ v ∥ cos α ∥ u ∥ × u = ( u ⋅ v ) u {\Large v_{\parallel }^{\prime} = \left \| v \right \| \cos \alpha \times u = \frac{\left \| u \right \| \left \| v \right \| \cos \alpha}{\left \| u \right \|}\times u = \left ( u\cdot v \right ) u} v∥′=∥v∥cosα×u=∥u∥∥u∥∥v∥cosα×u=(u⋅v)u - 垂直于旋转轴的向量的旋转可以看作是平面内的一个旋转,因为旋转不改变
v
⊥
v_{\perp }
v⊥的长度,所以其旋转路径是一个圆,其示意图如下,右图是俯视图
由此,垂直向量的旋转就被变成了二维平面上的旋转,但在这个平面上只有一个 v ⊥ v_{\perp } v⊥是不够的,因此我们需要构造一个同时垂直于 u u u和 v ⊥ v_{\perp } v⊥的向量 w w w,这个向量我们可以通过叉乘得到
w = u × v ⊥ \Large{w = u\times v_{\perp }} w=u×v⊥
由叉乘的模计算公式可知, u u u和 v ⊥ v_{\perp } v⊥的夹角为 π 2 \frac{\pi }{2} 2π,而 u u u又是一个单位向量,因此 w w w的模等于 v ⊥ v_{\perp } v⊥的模,也即 w w w也在圆上,等式如下
∥ w ∥ = ∥ u × v ⊥ ∥ = ∥ u ∥ ∥ v ⊥ ∥ sin π 2 = ∥ v ⊥ ∥ \Large{\left \| w \right \| = \left \| u\times v_{\perp } \right \| =\left \| u \right \| \left \| v_{\perp } \right \|\sin \frac{\pi }{2} = \left \|v_{\perp } \right \|} ∥w∥=∥ ∥u×v⊥∥ ∥=∥u∥∥ ∥v⊥∥ ∥sin2π=∥ ∥v⊥∥ ∥
有了向量 w w w之后我们可以将 v ⊥ ′ v_{\perp } ^{\prime } v⊥′投影到 w w w和 v ⊥ v_{\perp } v⊥上,并将其分解为 v v ′ v_{v}^{\prime } vv′和 v w ′ v_{w} ^{\prime } vw′,投影向量为长度和方向(单位向量)的乘积,因此可以有以下式子
v ⊥ ′ = v v ′ + v w ′ = ∥ v ⊥ ′ ∥ cos θ × v ⊥ ∥ v ⊥ ∥ + ∥ v ⊥ ′ ∥ cos ( π 2 − θ ) × w ∥ w ∥ = v ⊥ cos θ + ∥ v ⊥ ′ ∥ sin θ × w ∥ w ∥ = v ⊥ cos θ + w sin θ = v ⊥ cos θ + ( u × v ⊥ ) sin θ \large{\begin{align*} v_{\perp }^{\prime } & = ~v_{v}^{\prime }+ v_{w}^{\prime }\\ & = ~ \left \| v_{\perp }^{\prime } \right \| \cos \theta \times \frac{v_{\perp }}{\left \| v_{\perp } \right \| } + \left \| v_{\perp }^{\prime } \right \| \cos \left ( \frac{\pi }{2} - \theta \right ) \times \frac{w}{\left \| w \right \| }\\ & = ~ v_{\perp } \cos \theta + \left \| v_{\perp }^{\prime } \right \| \sin\theta \times \frac{w}{\left \| w \right \| }\\ & = ~ v_{\perp } \cos \theta + w\sin\theta\\ & = ~ v_{\perp } \cos \theta + \left ( u\times v_{\perp } \right ) \sin \theta \end{align*}} v⊥′= vv′+vw′= ∥ ∥v⊥′∥ ∥cosθ×∥v⊥∥v⊥+∥ ∥v⊥′∥ ∥cos(2π−θ)×∥w∥w= v⊥cosθ+∥ ∥v⊥′∥ ∥sinθ×∥w∥w= v⊥cosθ+wsinθ= v⊥cosθ+(u×v⊥)sinθ
其中 ∥ v ⊥ ′ ∥ = ∥ v ⊥ ∥ = ∥ w ∥ \left \| v_{\perp }^{\prime } \right \| = \left \| v_{\perp } \right \| = \left \| w \right \| ∥v⊥′∥=∥v⊥∥=∥w∥ - 由此将
v
∥
′
v_{\parallel }^{\prime}
v∥′和
v
⊥
′
v_{\perp }^{\prime }
v⊥′相加即可得到最终的变换结果
v ′ = v ∥ ′ + v ⊥ ′ = v ∥ + v ⊥ cos θ + ( u × v ⊥ ) sin θ \Large{v^{\prime } = v^{\prime }_{\parallel }+v^{\prime }_{\perp }=v_{\parallel }+v_{\perp } \cos \theta + \left ( u\times v_{\perp } \right ) \sin \theta} v′=v∥′+v⊥′=v∥+v⊥cosθ+(u×v⊥)sinθ
因为叉乘满足分配律,而且由 v ⊥ = v − v ∥ v_{\perp } = v- v_{\parallel } v⊥=v−v∥和平行的两个向量的叉乘为0可知
u × v ⊥ = u × ( v − v ∥ ) = u × v − u × v ∥ = u × v {\Large \begin{align*} u\times v_{\perp }& =~u\times \left ( v- v_{\parallel }\right ) \\ & =~u\times v-u\times v_{\parallel } \\ & =~u\times v \end{align*}} u×v⊥= u×(v−v∥)= u×v−u×v∥= u×v
最后将 v ∥ = ( u ⋅ v ) u v_{\parallel } = \left ( u\cdot v \right )u v∥=(u⋅v)u和 v ⊥ = v − ( u ⋅ v ) u v_{\perp } = v-\left ( u\cdot v \right )u v⊥=v−(u⋅v)u带入得到
v ′ = ( u ⋅ v ) u + cos ( θ ) ( v − ( u ⋅ v ) u ) + sin ( θ ) ( u × v ) = cos ( θ ) v + ( 1 − cos ( θ ) ) ( u ⋅ v ) u + sin ( θ ) ( u × v ) {\large \begin{align*} v^{\prime } & =~\left ( u\cdot v \right )u+\cos \left ( \theta \right ) \left ( v-\left ( u\cdot v \right )u \right ) + \sin \left ( \theta \right ) \left ( u\times v \right ) \\ &=~\cos \left ( \theta \right )v+\left ( 1-\cos \left ( \theta \right ) \right ) \left ( u\cdot v \right )u+\sin \left ( \theta \right ) \left ( u\times v \right ) \end{align*}} v′= (u⋅v)u+cos(θ)(v−(u⋅v)u)+sin(θ)(u×v)= cos(θ)v+(1−cos(θ))(u⋅v)u+sin(θ)(u×v)
- 根据上一节我们可以得知,三维旋转我们可以将其分解为简单的旋转然后进行组合之后即为旋转结果,因此,我们可以先将向量
v
v
v分解为平行于旋转轴和垂直于旋转轴的两个向量
- 由此得到了最终的罗德里格斯公式,3D 空间中任意一个
v
v
v 沿着单位向量
u
u
u旋转
θ
\theta
θ角度之后的
v
′
v^{\prime }
v′为
v ′ = cos ( θ ) v + ( 1 − cos ( θ ) ) ( u ⋅ v ) u + sin ( θ ) ( u × v ) v^{\prime }=\cos \left ( \theta \right )v+\left ( 1-\cos \left ( \theta \right ) \right ) \left ( u\cdot v \right )u+\sin \left ( \theta \right ) \left ( u\times v \right ) v′=cos(θ)v+(1−cos(θ))(u⋅v)u+sin(θ)(u×v)
2. 视图变换(View Transformation)
2.1 基本概念
- 如何理解模型变换,视图变换和映射变换,可以由下边一张图阐明
因此,视图变换也可以叫做Camera Transformation
2.2 定义一个摄像机
- 如果要进行视图变换我们首先需要定义一个摄像机,所以摄像机的定义如下
- 摄像机的位置 e ⃗ \large{\vec{e}} e
- 摄像机的朝向,也即摄像机看向的方向 g ^ {\large \hat{g} } g^
- 摄像机的向上的向量 t ^ {\large \hat{t}} t^
- 对于现实中拍摄一张照片来说,如果摄像机和拍摄的对象保持相对运动不变,那么拍摄的结果应该是一样的,那么在这里我们规定摄像机位于坐标原点,其朝向为
−
Z
-Z
−Z方向,向上向量为
Y
Y
Y,其示意图为
- 那么我们如何将一个摄像机变换(
M
v
i
e
w
M_{view}
Mview)到坐标原点呢,其步骤可总结如下
- 将其位置 e ⃗ \large{\vec{e}} e平移到原点
- 旋转朝向 g ^ {\large \hat{g} } g^到 − Z -Z −Z方向
- 旋转向上向量 t ^ {\large \hat{t} } t^到 Y Y Y方向
- 旋转 g ^ {\large \hat{g} } g^与 t ^ {\large \hat{t} } t^的叉乘即 ( g ^ × t ^ ) \left ( \hat{g} \times \hat{t} \right ) (g^×t^)到 X X X方向
- 如何使用变换矩阵来表达
M
v
i
e
w
M_{view}
Mview呢,可以将
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
- 首先将
e
⃗
\large{\vec{e}}
e平移至原点,其平移变换矩阵为
T v i e w = [ 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ] {\Large 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⎦ ⎤ - 然后将
g
^
{\large \hat{g} }
g^旋转至
−
Z
-Z
−Z,将
t
^
{\large \hat{t} }
t^旋转至
Y
Y
Y,最后将
(
g
^
×
t
^
)
\left ( \hat{g} \times \hat{t} \right )
(g^×t^)旋转至
X
X
X。我们比较难写出这个变换矩阵,但是我们可以很容易写出它的逆变换矩阵,即
X
X
X旋转至
(
g
^
×
t
^
)
\left ( \hat{g} \times \hat{t} \right )
(g^×t^),
Y
Y
Y旋转至
t
^
{\large \hat{t} }
t^,最后将
Z
Z
Z旋转至
−
g
^
{\large -\hat{g} }
−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 ] {\Large R_{view}^{-1} = \begin{bmatrix} x_{\hat{g}\times \hat{t} } & x_{\hat{t}} & x_{-\hat{g}}& 0\\ y_{\hat{g}\times \hat{t} }& y_{\hat{t}}& y_{-\hat{g}}& 0\\ z_{\hat{g}\times \hat{t} }& z_{\hat{t}}& z_{-\hat{g}}& 0\\ 0& 0& 0&1 \end{bmatrix}} Rview−1=⎣ ⎡xg^×t^yg^×t^zg^×t^0xt^yt^zt^0x−g^y−g^z−g^00001⎦ ⎤
由第一部分的讲解可知逆变换矩阵是原变换矩阵的转置矩阵,因此有 ( R v i e w − 1 ) T = R v i e w \left ( R_{view}^{-1} \right ) ^{T} = R_{view} (Rview−1)T=Rview,所以
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 ] {\Large R_{view} = \begin{bmatrix} x_{\hat{g} \times \hat{t}} & y_{\hat{g} \times \hat{t}} & z_{\hat{g} \times \hat{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⎦ ⎤ - 综上可以得到摄像机变换到原点的变换矩阵 M v i e w M_{view} Mview,对于其他物体只要做相同的变换即可与摄像机保持相对静止。
- 首先将
e
⃗
\large{\vec{e}}
e平移至原点,其平移变换矩阵为
3. 投影变换(Projection Transformation)
3.1 基本概念
- 投影变换包括正交投影(Orthographic Projection)和透视投影(Perspection Projection),二者的区别就是是否有近大远小的视觉效果,示意图如下
其中透视投影可以看作将摄像机放置到近处,由此射出一个四棱锥,投影物体,近处平面小于远处平面,而正交投影可以看作将摄像机放置无限远处,近平面和原平面一样。
3.2 正交投影
- 以一种简单的方式理解正交投影:直接将物体的
Z
Z
Z坐标扔掉,然后在将其平移和缩放至
[
−
1
,
1
]
2
\left [ -1,1 \right ] ^{2}
[−1,1]2大小的矩形内就是正交投影的效果,如下图所示
- 通常我们会以一个立方体的平移和缩放至一个标准正方体
[
−
1
,
1
]
3
\left [ -1,1 \right ] ^{3}
[−1,1]3作为正交投影的解释,其变换如下图所示
其中立方体 X X X方向上的范围为 [ l , r ] \left [ l,r \right ] [l,r], Y Y Y方向上的范围为 [ b , t ] \left [ b,t \right ] [b,t],最后 Z Z Z方向上的范围为 [ f , n ] \left [ f,n \right ] [f,n],因为摄像机的朝向是沿着 − Z -Z −Z方向,因此远处的坐标更小,该立方体先将其平移至原点,然后将其规范化为正方体,也即长宽高都缩放至2。其变换矩阵 M o r t h o M_{ortho} Mortho如下
M o r t h o = R o r t h o T 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 ] \Large{M_{ortho} = R_{ortho}T_{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=RorthoTortho=⎣ ⎡r−l20000t−b20000n−f200001⎦ ⎤⎣ ⎡100001000010−2r+l−2t+b−2n+f1⎦ ⎤
3.3 透视投影
- 回顾: 在之前的学习中我们提到,对于点 ( x , y , z , 1 ) \left ( x,y,z,1 \right ) (x,y,z,1)来说,将他们的坐标同时乘以个 k k k,其中 k ≠ 0 k\ne 0 k=0,其在三维空间中所表达的三维坐标点为 ( x , y , z ) \left ( x,y,z\right ) (x,y,z),因为 k k k是任意一个不为零的数,因此如果我们令 k = z k=z k=z,则 ( x z , y z , z 2 , z ) \left ( xz,yz,z^{2},z\right ) (xz,yz,z2,z)所表达也是 ( x , y , z ) \left ( x,y,z\right ) (x,y,z)点,例如坐标点 ( 1 , 0 , 0 , 1 ) \left ( 1,0,0,1\right ) (1,0,0,1)和 ( 2 , 0 , 0 , 2 ) \left ( 2,0,0,2\right ) (2,0,0,2)表达的都是 ( 1 , 0 , 0 ) \left (1,0,0\right ) (1,0,0)这个点,这个小知识点在后边我们将会用到。
- 透视投影具有近大远小的效果,如果直接进行透视变换比较难,透视投影和正交投影对比图如下图所示
由上图我们可以看出,正交投影和透视投影的区别就是一个是立方体,一个是棱锥,因此,我们可以将透视投影通过如下步骤进行转化- 首先将透视投影的原平面(后边比较大的那个平面)“挤压”到和近平面一样的大小,也即转化为正交投影,变换矩阵为 M p e r s p → o r t h o M_{persp\to ortho} Mpersp→ortho
- 然后在进行正交投影变换 M o r t h o M_{ortho} Mortho
- 注意: 在”挤压过程中“我们有几个限制,在挤压过程中,近平面的大小以及位置不变,同时远平面的位置,也即上图中的 f f f是不变的,最后,挤压过程中中心点的位置不变。
- 那么如何去求远平面”挤压”的变换矩阵呢,通过透视投影的侧视图如下
其中, n n n为近平面的 Z Z Z坐标,而 z z z为远平面 Z Z Z坐标,对于两个平面的 Y Y Y坐标来说,根据相似三角形我们知道有如下关系
y ′ y = n z ⇒ y ′ = n z y \Large{\frac{y^{\prime } }{y} = \frac{n }{z} \Rightarrow y^{\prime } = \frac{n }{z}y} yy′=zn⇒y′=zny
因此,通过这个相似关系,我们也可以得出 x ′ x^{\prime} x′的坐标
x ′ = n z x \Large{x^{\prime } = \frac{n }{z}x} x′=znx
到此,虽然我们根据这些条件无法计算得出 z z z,但我们根据回顾中的知识可以知道如下关系
[ x y z 1 ] → [ n x z n y z u n k n o w n 1 ] → × z [ n x n y s t i l l u n k n o w n 1 ] {\Large \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}\xrightarrow[]{} \begin{bmatrix} \frac{nx}{z}\\ \frac{ny}{z}\\ unknown\\ 1 \end{bmatrix}\overset{\times z}{\rightarrow} \begin{bmatrix} nx\\ ny\\ still~unknown\\ 1 \end{bmatrix}} ⎣ ⎡xyz1⎦ ⎤⎣ ⎡znxznyunknown1⎦ ⎤→×z⎣ ⎡nxnystill unknown1⎦ ⎤
因此,从透视变换到正交变换的矩阵表达为
M p e r s p → o r t h o 4 × 4 [ x y z 1 ] = [ n x n y s t i l l u n k n o w n 1 ] {\Large M_{persp\rightarrow ortho}^{4\times 4} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}=\begin{bmatrix} nx\\ ny\\ still~unknown\\ 1 \end{bmatrix}} Mpersp→ortho4×4⎣ ⎡xyz1⎦ ⎤=⎣ ⎡nxnystill unknown1⎦ ⎤
根据上边这个式子我们可以知道 M p e r s p ⟶ o r t h o M_{persp\longrightarrow 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 ] {\Large 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坐标也不变
- 首先,根据近平面的
Z
Z
Z坐标不变这一点我们可以将近平面坐标带入到透视投影到正交投影的变换的式子中
M p e r s p → o r t h o 4 × 4 [ x y z 1 ] = [ n x n y s t i l l u n k n o w n 1 ] ⇒ M p e r s p → o r t h o 4 × 4 [ x y n 1 ] = [ n x n y n 2 n ] \Large{ M_{persp\rightarrow ortho}^{4\times 4} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}=\begin{bmatrix} nx\\ ny\\ still~unknown\\ 1 \end{bmatrix}\Rightarrow M_{persp\rightarrow ortho}^{4\times 4}\begin{bmatrix} x\\ y\\ n\\ 1 \end{bmatrix}=\begin{bmatrix} nx\\ ny\\ n^{2}\\ n \end{bmatrix}} Mpersp→ortho4×4⎣ ⎡xyz1⎦ ⎤=⎣ ⎡nxnystill unknown1⎦ ⎤⇒Mpersp→ortho4×4⎣ ⎡xyn1⎦ ⎤=⎣ ⎡nxnyn2n⎦ ⎤
根据这个关系我们可以假设 M p e r s p ⟶ o r t h o M_{persp\longrightarrow ortho} Mpersp⟶ortho的第三行为 [ 0 0 A B ] \begin{bmatrix} 0& 0 & A &B \end{bmatrix} [00AB],因为最后的结果 n 2 n^{2} n2与 x x x、 y y y都没有关系,因此就有如下等式
[ 0 0 A B ] [ x y n 1 ] = n 2 ⇒ A n + B = n 2 {\Large \begin{bmatrix} 0& 0 & A &B \end{bmatrix}\begin{bmatrix} x\\ y\\ n\\ 1 \end{bmatrix} = n^{2} \Rightarrow An+B=n^{2}} [00AB]⎣ ⎡xyn1⎦ ⎤=n2⇒An+B=n2 - 其次,根据远平面的
Z
Z
Z坐标也不变这一点跟上边一样构造等式,这次我们取远平面的中心点
[
0
0
f
1
]
\begin{bmatrix} 0\\ 0\\ f\\ 1 \end{bmatrix}
⎣
⎡00f1⎦
⎤作为特殊点带入到公式中
[ 0 0 f 1 ] = [ 0 0 f 2 f ] ⇒ A f + B = f 2 \Large{ \begin{bmatrix} 0\\ 0\\ f\\ 1 \end{bmatrix}=\begin{bmatrix} 0\\ 0\\ f^{2}\\ f \end{bmatrix}\Rightarrow Af+B=f^{2}} ⎣ ⎡00f1⎦ ⎤=⎣ ⎡00f2f⎦ ⎤⇒Af+B=f2 - 综上两个等式,组成方程组即可求出
A
A
A和
B
B
B的值
{ A n + B = n 2 A f + B = f 2 ⇒ { A = n + f B = − n f \Large{ \begin{cases} An+B=n^{2}\\ Af+B=f^{2} \end{cases}\Rightarrow \begin{cases} A=n+f\\ B=-nf \end{cases} } ⎩ ⎨ ⎧An+B=n2Af+B=f2⇒⎩ ⎨ ⎧A=n+fB=−nf
由此,我们求出了整个透视投影到正交投影的变换矩阵
M p e r s p → o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] {\Large M_{persp\rightarrow ortho}= \begin{bmatrix} n& 0 & 0 & 0\\ 0& n & 0 & 0\\ 0& 0 & n+f & -nf\\ 0& 0 & 1 &0 \end{bmatrix}} Mpersp→ortho=⎣ ⎡n0000n0000n+f100−nf0⎦ ⎤
而正交投影矩阵 M o r t h o M_{ortho} Mortho我们也已经知道通过 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即可求出最终的透视投影矩阵
至此本节课结束