文章目录
Transformation Cont
补充上节课内容
旋转
−
θ
-\theta
−θ角的矩阵表示:
R
−
θ
=
R
θ
T
=
R
θ
−
1
R_{-\theta}=R^{T}_{\theta}=R^{-1}_{\theta}
R−θ=RθT=Rθ−1
结论:在旋转里,旋转矩阵的逆就是旋转矩阵的转置。
正交矩阵:矩阵的逆=矩阵的转置
本节内容
- Viewing transformation(视图变换)
- View/Camera transformation
- Projection(投影)transformation
- Orthographic(正交) Projection
- Perspective(透视)
View/Camera transformation
变换目的:将三维空间的物体变换成二维空间的照片。
MVP变换三步骤:
- 模型变换(Model transformation):摆好模型
- 视图变换(View transformation):改变相机的角度、位置等
- 投影变换(Projection transformation):三维投影到二维
视图变换:
- 首先定义相机:位置、往哪看(Look-at/gaze direction)、向上方向(相机头部的方向,向左偏、向右偏之类的)观察方向和向上方向是垂直的(因为镜头方向和相机头部垂直)
- Key observation观察点
- 如果相机和所有物体一起移动,则其相对位置没有改变,拍的照片也是一样的。
- 如果相机和所有物体一起移动,则其相对位置没有改变,拍的照片也是一样的。
- 设定相机的位置作为原点固定,永远朝向-z方向看,向上方向为y轴方向——相机在标准位置,其他物体跟随相机移动。
如何改变:
先把
e
⃗
\vec e
e平移到原点
(
0
,
0
,
0
)
(0,0,0)
(0,0,0),观察方向
g
⃗
\vec g
g旋转到-Z方向,向上方向
t
⃗
\vec t
t旋转到Y方向,
g
⃗
×
t
⃗
\vec{g}\times\vec{t}
g×t自然也旋转到了X方向
矩阵表示:
先平移到原点:
再将观察方向
g
⃗
\vec g
g
(
x
g
y
g
z
g
)
\left(\begin{matrix}x_g\\y_g\\z_g\end{matrix}\right)
⎝⎛xgygzg⎠⎞旋转到-Z
(
0
0
−
1
)
\left(\begin{matrix}0\\0\\-1\end{matrix}\right)
⎝⎛00−1⎠⎞方向,向上方向
t
⃗
\vec t
t
(
x
t
y
t
z
t
)
\left(\begin{matrix}x_t\\y_t\\z_t\end{matrix}\right)
⎝⎛xtytzt⎠⎞旋转到Y
(
0
1
0
)
\left(\begin{matrix}0\\1\\0\end{matrix}\right)
⎝⎛010⎠⎞方向,
(
g
⃗
×
t
⃗
)
(\vec{g}\times\vec{t})
(g×t)旋转到X
(
1
0
0
)
\left(\begin{matrix}1\\0\\0\end{matrix}\right)
⎝⎛100⎠⎞方向这样很困难。
换一种思考方式,将X
(
1
0
0
)
\left(\begin{matrix}1\\0\\0\end{matrix}\right)
⎝⎛100⎠⎞旋转到
(
g
⃗
×
t
⃗
)
(\vec{g}\times\vec{t})
(g×t),将Z
(
0
0
1
)
\left(\begin{matrix}0\\0\\1\end{matrix}\right)
⎝⎛001⎠⎞旋转到
−
g
⃗
\vec {-g}
−g
(
−
x
g
−
y
g
−
z
g
)
\left(\begin{matrix}-x_g\\-y_g\\-z_g\end{matrix}\right)
⎝⎛−xg−yg−zg⎠⎞,Y
(
0
1
0
)
\left(\begin{matrix}0\\1\\0\end{matrix}\right)
⎝⎛010⎠⎞旋转到
t
⃗
\vec t
t
(
x
g
y
g
z
g
)
\left(\begin{matrix}x_g\\y_g\\z_g\end{matrix}\right)
⎝⎛xgygzg⎠⎞,然后该矩阵的逆即为所求矩阵。
因为旋转矩阵是正交矩阵,所以直接将计算得到的逆矩阵
R
v
i
e
w
−
1
R^{-1}_{view}
Rview−1转置即得到所求的矩阵
R
v
i
e
w
R_{view}
Rview。
Projection transformation
两种投影方式:
Orthographic(正交) Projection
Perspective(透视)Projection:会有近大远小的现象
区别:正交对应平行线条还是平行的,透视对应平行线条延长后会相交。是否有近大远小的现象。
正交投影是假设把相机拿到无限远,越远,物体的近处和远处的区别越不明显。
Orthographic(正交) Projection
相机按标准摆放位置。
假设把Z给扔掉,则’E’和‘■’都挤在了xy平面,再缩小范围,将图片缩放到
[
−
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],定义立方体的左右在x轴的哪一部分范围,下上在y轴的哪一部分范围,前后在z轴的哪一部分范围。
因为右手坐标系,观察方向是沿着-Z方向,所以远坐标f的z值比近坐标n的z值更小。而OPENGL是左手坐标系,所以他的远坐标f的z值比近坐标n的z值更大。 - 将该立方体映射到正则立方体(规范、标准立方体)
[
−
1
,
1
]
3
[-1,1]^{3}
[−1,1]3上。先将定义的立方体的中心移动到原点,然后将立方体xyz轴拉成[-1,1]的范围。
矩阵表示变换矩阵:(依旧是先平移到原点,再缩放)
Perspective(透视)Projection
应用的最广泛的投影。
平行线不再平行:
强调:
(
x
,
y
,
z
,
1
)
(x,y,z,1)
(x,y,z,1)与
(
k
x
,
k
y
,
k
z
,
k
)
,
k
≠
0
(kx,ky,kz,k),k\neq0
(kx,ky,kz,k),k=0表示的是同一个点
(
x
,
y
,
z
,
1
)
(x,y,z,1)
(x,y,z,1)。那么
(
x
z
,
y
z
,
z
2
,
z
)
,
z
≠
0
(xz,yz,z^2,z),z\neq0
(xz,yz,z2,z),z=0也表示的是
(
x
,
y
,
z
,
1
)
(x,y,z,1)
(x,y,z,1)。
透视的远平面更大。
锥体定义方式:
从摄像机出发看向某个区域,假设看到的是近平面n,则为近平面定义一个高度和宽度,宽高比Aspect ratio=width/height。
垂直可视角度Vertical Field of View,角度越大,所看到的范围大,角度越小,所看到的范围远。
水平可视角度可由垂直可视角度与宽高比得出。
所以正常情况下定义一个视锥,只需要定义宽高比和垂直可视角度,其他可以自动转化到定义一个正交投影区域的远近左右上下的操作。
透视操作:
先把远平面f“挤成”和近平面n一样,即将锥体变成柱体,这样就从透视变成了正交。注意以下需要遵循的规则:
- 近平面n永远不变,远平面f的z值不变
- 远平面f的中心点不变
然后就按照正交投影的操作进行。
挤压的详细步骤:
侧视图:
挤压后的坐标,同时乘z后依旧是那个坐标:
矩阵表示挤压:
将坐标与
M
p
e
r
s
p
−
>
o
r
t
h
o
M_{persp->ortho}
Mpersp−>ortho矩阵相乘后:
① 在近平面(z轴坐标为n)上的任意一点
(
x
y
n
1
)
\left(\begin{matrix}x\\y\\n\\1\end{matrix}\right)
⎝⎜⎜⎛xyn1⎠⎟⎟⎞不会发生任何变化。
即:
对于矩阵第三行可列方程:
即
A
n
+
B
=
n
2
(1)
An+B=n^2 \tag{1}
An+B=n2(1)
② 在远平面(z轴坐标为f)上的任意一点
(
x
y
f
1
)
\left(\begin{matrix}x\\y\\f\\1\end{matrix}\right)
⎝⎜⎜⎛xyf1⎠⎟⎟⎞它的z坐标f不会发生任何变化。
f平面的中点变换后坐标不变:
(1)(2)联立,解得:
A
=
n
+
f
,
B
=
−
n
f
A=n+f,B=-nf
A=n+f,B=−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
)
M_{persp->ortho}=\left(\begin{matrix}n&0&0&0\\0&n&0&0\\0&0&n+f&-nf\\0&0&1&0\end{matrix}\right)
Mpersp−>ortho=⎝⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎞
透视矩阵: