一、三维空间中物体的变换
0)补充说明
在接下来的矩阵运算中,我们使用的是齐次坐标进行运算。
1)缩放和平移
对于三维空间中的物体,我们进行缩放和平移使用的线性变换矩阵分别为以下两种
(其中矩阵S为缩放矩阵,矩阵T为平移矩阵)
那么,要缩放三维空间中的一个物体,我们需要用到的变换为
[
x
1
y
1
z
1
1
]
=
[
s
x
0
0
0
0
s
y
0
0
0
0
s
z
0
0
0
0
1
]
[
x
y
z
1
]
\begin{bmatrix} x_1\\ y_1\\ z_1\\ 1\\ \end{bmatrix} = \begin{bmatrix} s_x&0&0&0\\ 0&s_y&0&0\\ 0&0&s_z&0\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix}
x1y1z11
=
sx0000sy0000sz00001
xyz1
相似地,平移物体时,我们使用的是以下的变换
[
x
1
y
1
z
1
1
]
=
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
[
x
y
z
1
]
\begin{bmatrix} x_1\\ y_1\\ z_1\\ 1\\ \end{bmatrix} = \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix}
x1y1z11
=
100001000010txtytz1
xyz1
2)旋转
对于旋转,在三维空间中相比二维平面复杂一些,在三维空间中,旋转分为三种:
- 绕x轴旋转
- 绕y轴旋转
- 绕z轴旋转
三种旋转的变换矩阵从上往下依次为:
R
x
(
α
)
=
[
1
0
0
0
0
c
o
s
α
−
s
i
n
α
0
0
s
i
n
α
c
o
s
α
0
0
0
0
1
]
R_x(\alpha)= \begin{bmatrix} 1&0&0&0\\ 0&cos\alpha&-sin\alpha&0\\ 0&sin\alpha&cos\alpha&0\\ 0&0&0&1\\ \end{bmatrix}
Rx(α)=
10000cosαsinα00−sinαcosα00001
R
y
(
α
)
=
[
c
o
s
α
0
s
i
n
α
0
0
1
0
0
−
s
i
n
α
0
c
o
s
α
0
0
0
0
1
]
R_y(\alpha)= \begin{bmatrix} cos\alpha&0&sin\alpha&0\\ 0&1&0&0\\ -sin\alpha&0&cos\alpha&0\\ 0&0&0&1\\ \end{bmatrix}
Ry(α)=
cosα0−sinα00100sinα0cosα00001
R
z
(
α
)
=
[
c
o
s
α
−
s
i
n
α
0
0
s
i
n
α
c
o
s
α
0
0
0
0
1
0
0
0
0
1
]
R_z(\alpha)= \begin{bmatrix} cos\alpha&-sin\alpha&0&0\\ sin\alpha&cos\alpha&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix}
Rz(α)=
cosαsinα00−sinαcosα0000100001
3)欧拉角
当我们要对三维空间物体进行任意旋转时,我们就运用到了欧拉角,其表达方式如下:
R
x
y
z
(
α
,
β
,
γ
)
=
R
x
(
α
)
R
y
(
β
)
R
z
(
γ
)
R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)R_y(\beta)R_z(\gamma)
Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
4)罗德里格斯公式(Rodrigues’ Rotation Formula)
在三维向量进行旋转时,我们可以使用罗德里格斯公式,例如绕轴n旋转角度alpha的旋转计算如下所示:
由于证明过程过于复杂,这里暂时省略。
二、观测变换(view transformation)
为了实现观测,我们就需要有一个摄像机。因此观测变换也称为摄像机变换(camera transformation)
1)摄像机的定义
为了在三维空间中定义一个摄像机,需要用到以下几个量:
- 摄像机位置(position)
- 摄像机注视方向(gaze direction)
- 与摄像机注视方向垂直的上方向(up direction)
三个量均使用向量来描述。
2)观测变换矩阵
观测变换就是将摄像机位置移到坐标原点,变换到以y轴正方向为up direction的方向,z轴负方向为gaze direction的方向。如果这里我们分别设摄像机的三个量依次为
p
o
s
i
t
i
o
n
=
e
⃗
position=\vec{e}
position=e
g
a
z
e
D
i
r
e
c
t
i
o
n
=
g
⃗
gaze Direction=\vec{g}
gazeDirection=g
u
p
D
i
r
e
c
t
i
o
n
=
t
⃗
upDirection=\vec{t}
upDirection=t
再设
u
⃗
=
g
⃗
×
t
⃗
\vec{u}=\vec{g}\times\vec{t}
u=g×t
那么我们在观测变换需要做的事情就有:
- 将摄像机位置移动到坐标原点
- 将向量g旋转到-z方向
- 将向量t旋转到+y方向
- 还需要注意将向量u旋转到+x方向
变换矩阵:
i)移动摄像机位置:
ii)旋转向量g、t和u:
iii)观测变换矩阵M:
M
v
i
e
w
=
R
v
i
e
w
T
v
i
e
w
M_{view}=R_{view}T_{view}
Mview=RviewTview
三、投影变换(projection transformation)
在将三维场景显示到屏幕上时,我们需要使用到投影变换,而投影变换一般分为两种:正交投影和透视投影。
1)两种投影的区别
正交投影:投影的像只与物体本身的大小有关
透视投影:投影的像根据物体距离投影面的远近有关,呈现近大远小的效果。
示意图如下:
2)正交投影(Orthographic projection)
经过观测变换后,摄像机已经位于原点,朝向z轴负方向,对于正交投影,摄像机的可视范围是一个长方体,为了简化计算,我们将其变换为一个标准立方体,假设未变换的长方体坐标范围为
[
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
要实现这一过程,我们的操作是先平移,再缩放。平移的变换矩阵为:
T
o
r
t
h
o
=
[
1
0
0
−
r
+
l
2
0
1
0
−
t
+
b
2
0
0
1
−
n
+
f
2
0
0
0
1
]
T_{ortho}=\begin{bmatrix} 1&0&0&-{r+l\over 2}\\ 0&1&0&-{t+b\over 2}\\ 0&0&1&-{n+f\over 2}\\ 0&0&0&1\\ \end{bmatrix}
Tortho=
100001000010−2r+l−2t+b−2n+f1
缩放的变换矩阵为:
S
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
]
S_{ortho}=\begin{bmatrix} 2\over r-l&0&0&0\\ 0&2\over t-b&0&0\\ 0&0&2\over n-f&0\\ 0&0&0&1\\ \end{bmatrix}
Sortho=
r−l20000t−b20000n−f200001
那么正交投影的投影矩阵为:
P
o
r
t
h
o
=
S
o
r
t
h
o
T
o
r
t
h
o
=
[
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
]
P_{ortho}=S_{ortho}T_{ortho} =\begin{bmatrix} 2\over r-l&0&0&-{r+l\over r-l}\\ 0&2\over t-b&0&-{t+b\over t-b}\\ 0&0&2\over n-f&-{n+f \over n-f}\\ 0&0&0&1\\ \end{bmatrix}
Portho=SorthoTortho=
r−l20000t−b20000n−f20−r−lr+l−t−bt+b−n−fn+f1
变换过程的示意图(顺序从左到右):
补充: 另一种推导正交投影变换矩阵的方式
设视锥体中x轴上任意一点为
x
o
r
t
h
,
x
o
r
t
h
∈
[
l
,
r
]
x_{orth}, \hspace{1mm} x_{orth} \in [l,r]
xorth,xorth∈[l,r]
设NDC空间x轴上任意一点为
x
n
d
c
,
x
n
d
c
∈
[
−
1
,
1
]
x_{ndc}, \hspace{1mm} x_{ndc} \in [-1,1]
xndc,xndc∈[−1,1]
显然二者之间存在线性映射关系
f
:
x
o
r
t
h
→
x
n
d
c
f:x_{orth} \rightarrow x_{ndc}
f:xorth→xndc
可设对应关系为
A
x
o
r
t
h
+
B
=
x
n
d
c
Ax_{orth}+B = x_{ndc}
Axorth+B=xndc
可列出方程组如下
{
A
l
+
B
=
−
1
A
r
+
B
=
1
\begin{cases} \ Al +B=-1 \\ \ Ar +B=1 \\ \end{cases}
{ Al+B=−1 Ar+B=1
解得
{
A
=
2
r
−
l
B
=
−
r
+
l
r
−
l
\begin{cases} \ A=\frac{2}{r-l}\\ \ B=-\frac{r+l}{r-l}\\ \end{cases}
{ A=r−l2 B=−r−lr+l
则二者的关系式为
x
n
d
c
=
2
r
−
l
x
o
r
t
h
−
r
+
l
r
−
l
x_{ndc} =\frac{2}{r-l}x_{orth}-\frac{r+l}{r-l}
xndc=r−l2xorth−r−lr+l
同理可得
y
n
d
c
=
2
t
−
b
y
o
r
t
h
−
t
+
b
t
−
b
z
n
d
c
=
2
n
−
f
z
o
r
t
h
−
n
+
f
n
−
f
y_{ndc} =\frac{2}{t-b}y_{orth}-\frac{t+b}{t-b} \\ z_{ndc} =\frac{2}{n-f}z_{orth}-\frac{n+f}{n-f}
yndc=t−b2yorth−t−bt+bzndc=n−f2zorth−n−fn+f
这样便能得到正交投影矩阵在齐次空间的表示形式
[
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
]
\begin{bmatrix} 2\over r-l&0&0&-{r+l\over r-l}\\ 0&2\over t-b&0&-{t+b\over t-b}\\ 0&0&2\over n-f&-{n+f \over n-f}\\ 0&0&0&1\\ \end{bmatrix}
r−l20000t−b20000n−f20−r−lr+l−t−bt+b−n−fn+f1
3)透视投影(Perspective projection)
对应透视投影而言,摄像机的可视范围是一个正四棱锥去除尖端的四棱台,为了进行透视投影,我们需要做的操作如下:
- 将四棱台“挤压”成一个立方体
- 按照正交投影的方式进行变换
i.“挤压”变换
首先是“挤压”四棱台的过程,这里我们如果以四棱台的一侧建立坐标系如下:
那么对于四棱台上一点
(
x
,
,
y
,
,
z
,
)
(x^,,y^,,z^,)
(x,,y,,z,)
可以通过相似三角形得出可以用x,y,z,n表示为
y
,
=
n
z
y
y^,=\frac{n}{z}y
y,=zny
x
,
=
n
z
x
x^,=\frac{n}{z}x
x,=znx
设“挤压”这一过程的变换矩阵为
M
p
−
>
o
M_{p->o}
Mp−>o
则变换过程可表示为
M
p
−
>
o
[
x
y
z
1
]
=
[
x
,
y
,
z
,
1
]
=
[
n
z
x
n
z
y
z
,
1
]
=
[
n
x
n
y
z
z
,
z
]
M_{p->o}\begin{bmatrix}x\\ y\\ z\\ 1\\ \end{bmatrix}=\begin{bmatrix} x^,\\ y^,\\ z^,\\ 1\\ \end{bmatrix}=\begin{bmatrix} \frac{n}{z}x\\ \frac{n}{z}y\\ z^,\\ 1\\ \end{bmatrix}=\begin{bmatrix}nx\\ ny\\ zz^,\\ z\\ \end{bmatrix}
Mp−>o
xyz1
=
x,y,z,1
=
znxznyz,1
=
nxnyzz,z
而其中z^,为未知数,不过可以发现矩阵M是四阶方阵,那么可以设M为
M
p
−
>
o
=
[
n
0
0
0
0
n
0
0
?
?
?
?
0
0
1
0
]
M_{p->o}=\begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ ?&?&?&?\\ 0&0&1&0\\ \end{bmatrix}
Mp−>o=
n0?00n?000?100?0
显然第三行跟z^,有关,而且近平面和远平面上的任意点z坐标不会发生改变。对于近平面上任意一点,我们有:
[
x
y
n
1
]
=
[
n
x
n
y
n
2
n
]
\begin{bmatrix}x\\ y\\ n\\ 1\\ \end{bmatrix}=\begin{bmatrix}nx\\ ny\\ n^2\\ n\\ \end{bmatrix}
xyn1
=
nxnyn2n
那么我们就可以设矩阵M为
M
p
−
>
o
=
[
n
0
0
0
0
n
0
0
0
0
A
B
0
0
1
0
]
M_{p->o}=\begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ 0&0&A&B\\ 0&0&1&0\\ \end{bmatrix}
Mp−>o=
n0000n0000A100B0
如果只将矩阵M第三行对应的行向量于近平面任意一点对应的列向量相乘,则有
[
0
,
0
,
A
,
B
]
[
x
y
n
1
]
=
n
2
[0,0,A,B]\begin{bmatrix}x\\ y\\ n\\ 1\\ \end{bmatrix}=n^2
[0,0,A,B]
xyn1
=n2
也可写为方程
A
n
+
B
=
n
2
An+B=n^2
An+B=n2
同理我们可以得到远平面的方程
A
f
+
B
=
f
2
Af+B=f^2
Af+B=f2
两方程联立,解得
A
=
n
+
f
A=n+f
A=n+f
B
=
−
n
f
B=-nf
B=−nf
ii.透视投影变换
根据上一节正交投影变换的介绍,我们可以很容易得到透视投影变换的矩阵为:
P
p
e
r
s
p
=
P
o
r
t
h
o
M
p
−
>
o
P_{persp}=P_{ortho}M_{p->o}
Ppersp=PorthoMp−>o