赞
踩
第一部分:矩阵与变换
为了将坐标的平移、旋转、缩放、投影等变换写成 A = M × B A = M \times B A=M×B的形式,我们将空间(或平面)上点与向量的坐标扩展成如下形式:
其中点的坐标也可写为 ( x , y , z , w ) (x,y,z,w) (x,y,z,w),表示的点为 ( x / w , y / w , z / w , 1 ) (x/w,y/w,z/w,1) (x/w,y/w,z/w,1)(显然要求 w ≠ 0 w \ne 0 w=0)。
所谓MVP变换即在图形学中常用的Model、View、Projection变换。
如图,计算机内的物体要想显示到屏幕上,需要经历以下几个变换:
Model变换包含平移、旋转、缩放等操作。对于不同的物体,因为导入时的初始位置和在世界中放置的位置不同,相对应的Model变换也不相同。
我们可以将Model变换拆解成三种变换的组合(以3D为例):
s
c
a
l
e
=
[
s
0
0
0
0
s
0
0
0
0
s
0
0
0
0
1
]
scale=
t
r
a
n
s
l
a
t
i
o
n
=
[
0
0
0
t
x
0
0
0
t
y
0
0
0
t
z
0
0
0
1
]
translation=
R
x
(
α
)
=
[
1
0
0
0
0
cos
(
α
)
−
sin
(
α
)
0
0
sin
(
α
)
cos
(
α
)
0
0
0
0
1
]
R_x(\alpha)=
R
y
(
α
)
=
[
cos
(
α
)
0
sin
(
α
)
0
0
1
0
0
−
sin
(
α
)
0
cos
(
α
)
0
0
0
0
1
]
R_y(\alpha)=
R
z
(
α
)
=
[
cos
(
α
)
−
sin
(
α
)
0
0
sin
(
α
)
cos
(
α
)
0
0
0
0
1
0
0
0
0
1
]
R_z(\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(\vec{n},\alpha) = \cos\alpha\vec{I} + (1-\cos\alpha)\vec{n}\vec{n^T}+\sin\alpha
M m o d e l M_{model} Mmodel矩阵由上述一个或多个矩阵复合(相乘)得到,注意矩阵相乘时实际变换顺序是从右到左。
一般将camera放置在世界坐标的原点,并且令其 g ⃗ \vec{g} g (gaze)方向与 − z -z −z轴重合, t ⃗ \vec{t} t (top)方向与 + y +y +y轴重合。故camera变换一般分为两步:
利用逆变换思想可以写出如下方程:
M
c
a
m
=
[
u
v
w
e
0
0
0
1
]
−
1
=
[
x
u
y
u
z
u
0
x
v
y
v
z
v
0
x
w
y
w
z
w
0
0
0
0
1
]
[
1
0
0
−
x
e
0
1
0
−
y
e
0
0
1
−
z
e
0
0
0
1
]
M_{cam}=
其中用到了旋转矩阵是正交矩阵的性质,即
A
T
=
A
−
1
A^T=A^{-1}
AT=A−1
当用户或玩家移动自身位置、调整视口角度的时候,显示出的物体会实时变化,此变化即为
M
c
a
m
M_{cam}
Mcam矩阵改变并应用在所有物体上的结果。
实际上,当camera移动时,物体的坐标乘以
M
c
a
m
M_{cam}
Mcam矩阵之后改变的是物体的位置,可以理解为camera不动,所有的物体在向着指令相反的方向运动,导致在camera坐标系下观察像是自己在运动。
为了后续viewport transformation的方便,我们需要把需要显示的部分用一个长方体包围起来,并将其压缩到以原点为几何中心,边长为2的正方体中。
运用平移和缩放变换,容易写出以下式子:
M
o
r
t
h
=
[
2
r
−
l
0
0
−
r
+
l
r
−
l
0
2
t
−
b
0
−
t
+
b
t
−
b
0
0
2
n
−
f
−
n
+
f
n
−
f
0
0
0
1
]
M_{orth}=
如图,现实世界中我们的视野呈锥体状而非正交投影认为的长方体状,故透视投影看到的东西要比正交投影看到的东西多(越远物体越小,看到的物体数量越多)。
所以,要想在正交投影的基础上实现透视投影,就需要把透视投影可视部分多出来的那一块“压”进正交投影可视部分中去,然后再进行正交投影。
大致求解 M p e r s p → o r t h o M_{persp\rightarrow ortho} Mpersp→ortho过程如下。
最终
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
o
r
t
h
o
M_{ortho}
Mortho中的参数与视角
θ
\theta
θ以及屏幕长宽比
ω
\omega
ω有关。)
Viewport变换也称为视口变换,是将经过MVP变换后的可视部分(位于 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3内)转换到2D屏幕所在范围内( [ 0 , w i d t h ] ∗ [ 0 , h e i g h t ] [0,width] * [0,height] [0,width]∗[0,height])。
即将位于原点的标准立方体先拉伸,再平移。得:
M
v
i
e
w
p
o
r
t
=
[
w
i
d
t
h
2
0
0
w
i
d
t
h
2
0
h
e
i
g
h
t
2
0
h
e
i
g
h
t
2
0
0
1
0
0
0
0
1
]
M_{viewport}=
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。