文章目录
3D数学-正交投影
好记性不如烂笔头啊,还是记录一下!
概述
正交投影也被称为平行投影,不会出现透视投影的
近大远小
的扭曲现象,
正交投影的推导
构建正交投影矩阵相对来说会简单一些,由于不存在透视扭曲。
<
x
e
,
y
e
,
z
e
>
<x_{e}, y_{e}, z_{e}>
<
x
e
,
y
e
,
z
e
>
是相机空间中的一个坐标点
<
x
n
,
y
n
,
z
n
>
<x_{n}, y_{n}, z_{n}>
<
x
n
,
y
n
,
z
n
>
表示经过透视投影后在
规范化设备坐标系(Normalized Device Coordinates)
中的坐标
l
l
l
表示
近裁剪平面(near clip plane)
的左边,即
x
=
l
x=l
x
=
l
r
r
r
表示
近裁剪平面(near clip plane)
的右边,即
x
=
r
x=r
x
=
r
t
t
t
表示
近裁剪平面(near clip plane)
的上边,即
y
=
t
y=t
y
=
t
b
b
b
表示
近裁剪平面(near clip plane)
的下边,即
y
=
b
y=b
y
=
b
如图所示,
<
x
e
,
y
e
,
z
e
>
<x_{e}, y_{e}, z_{e}>
<
x
e
,
y
e
,
z
e
>
可以先行的映射到
规范化设备坐标系(Normalized Device Coordinates)
中的,因为我们实际只是将一个长方体缩成一个立方体,并把它移动到原点。下面我们就来使用
线性映射关系(linear relationship)
来推导正交投影矩阵
现在需要将
x
e
x_{e}
x
e
映射到
x
n
x_{n}
x
n
,
x
e
x_{e}
x
e
得范围是
[
l
,
r
]
[l, r]
[
l
,
r
]
,
x
n
x_{n}
x
n
的范围是
[
−
1
,
1
]
[-1, 1]
[
−
1
,
1
]
,还需要将
y
e
y_{e}
y
e
映射到
y
n
y_{n}
y
n
,
y
e
y_{e}
y
e
得范围是
[
b
,
t
]
[b, t]
[
b
,
t
]
,
y
n
y_{n}
y
n
的范围是
[
−
1
,
1
]
[-1, 1]
[
−
1
,
1
]
,还需要将
z
e
z_{e}
z
e
映射到
z
n
z_{n}
z
n
,由于齐次裁剪空间为左手坐标系,所以需要将z轴反置,因此
z
e
z_{e}
z
e
的范围是
[
−
n
,
−
f
]
[-n, -f]
[
−
n
,
−
f
]
,
y
n
y_{n}
y
n
得范围是
[
−
1
,
1
]
[-1, 1]
[
−
1
,
1
]
可以利用简单线性插值的方法获得以下关系式:
{
x
e
−
l
r
−
l
=
x
n
−
(
−
1
)
1
−
(
−
1
)
y
e
−
b
t
−
b
=
y
n
−
(
−
1
)
1
−
(
−
1
)
z
e
−
(
−
n
)
(
−
f
)
−
(
−
n
)
=
z
n
−
(
−
1
)
1
−
(
−
1
)
\begin{cases} \frac{x_{e}-l}{r-l}=\frac{x_{n}-(-1)}{1-(-1)} \\[2ex] \frac{y_{e}-b}{t-b}=\frac{y_{n}-(-1)}{1-(-1)} \\[2ex] \frac{z_{e}-(-n)}{(-f)-(-n)}=\frac{z_{n}-(-1)}{1-(-1)} \end{cases}
⎩
⎪
⎪
⎪
⎪
⎨
⎪
⎪
⎪
⎪
⎧
r
−
l
x
e
−
l
=
1
−
(
−
1
)
x
n
−
(
−
1
)
t
−
b
y
e
−
b
=
1
−
(
−
1
)
y
n
−
(
−
1
)
(
−
f
)
−
(
−
n
)
z
e
−
(
−
n
)
=
1
−
(
−
1
)
z
n
−
(
−
1
)
解出可得:
{
x
n
=
2
r
−
l
⋅
x
e
−
r
+
l
r
−
l
y
n
=
2
t
−
b
⋅
y
e
−
t
+
b
t
−
b
z
n
=
−
2
f
−
n
⋅
z
e
−
f
+
n
f
−
n
\begin{cases} x_{n}=\frac{2}{r-l} \centerdot x_{e}-\frac{r+l}{r-l} \\[2ex] y_{n}=\frac{2}{t-b} \centerdot y_{e}-\frac{t+b}{t-b} \\[2ex] z_{n}=\frac{-2}{f-n} \centerdot z_{e}-\frac{f+n}{f-n} \end{cases}
⎩
⎪
⎪
⎪
⎪
⎨
⎪
⎪
⎪
⎪
⎧
x
n
=
r
−
l
2
⋅
x
e
−
r
−
l
r
+
l
y
n
=
t
−
b
2
⋅
y
e
−
t
−
b
t
+
b
z
n
=
f
−
n
−
2
⋅
z
e
−
f
−
n
f
+
n
将以上三个关系式写成矩阵形式,可得:
P
n
=
M
o
r
t
h
o
⋅
P
e
=
[
2
r
−
l
0
0
r
+
l
r
−
l
0
2
t
−
b
0
t
+
b
t
−
b
0
0
−
2
f
−
n
−
f
+
n
f
−
n
0
0
0
1
]
⋅
[
x
e
y
e
z
e
1
]
P_{n} = M_{ortho} \cdot P_{e} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & \frac{r+l}{r-l} \\[2ex] 0 & \frac{2}{t-b} & 0 & \frac{t+b}{t-b} \\[2ex] 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\[2ex] 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x_{e} \\[2ex] y_{e} \\[2ex] z_{e} \\[2ex] 1 \end{bmatrix}
P
n
=
M
o
r
t
h
o
⋅
P
e
=
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎡
r
−
l
2
0
0
0
0
t
−
b
2
0
0
0
0
f
−
n
−
2
0
r
−
l
r
+
l
t
−
b
t
+
b
−
f
−
n
f
+
n
1
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎤
⋅
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎡
x
e
y
e
z
e
1
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎤
M
o
r
t
h
o
M_{ortho}
M
o
r
t
h
o
就是
正交投影矩阵
投影矩阵的另一种形式
根据
Size(竖直方向上高度的一半)
和
Aspect(投影平面的宽高比)
可得出以下关系:
A
s
p
e
c
t
=
r
t
t
=
S
i
z
e
b
=
−
t
r
=
t
×
A
s
p
e
c
t
l
=
−
r
Aspect = \frac{r}{t} \\[2ex] t = Size \\[2ex] b = -t \\[2ex] r = t \times Aspect \\[2ex] l = -r
A
s
p
e
c
t
=
t
r
t
=
S
i
z
e
b
=
−
t
r
=
t
×
A
s
p
e
c
t
l
=
−
r
所以
M
o
r
t
h
o
M_{ortho}
M
o
r
t
h
o
还可以写成:
M
o
r
t
h
o
=
[
1
A
s
p
e
c
t
⋅
S
i
z
e
0
0
0
0
1
S
i
z
e
0
0
0
0
−
2
f
−
n
−
f
+
n
f
−
n
0
0
0
1
]
M_{ortho}= \begin{bmatrix} \frac{1}{Aspect \centerdot Size} & 0 & 0 & 0 \\[2ex] 0 & \frac{1}{Size} & 0 & 0 \\[2ex] 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\[2ex] 0 & 0 & 0 & 1 \end{bmatrix}
M
o
r
t
h
o
=
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎡
A
s
p
e
c
t
⋅
S
i
z
e
1
0
0
0
0
S
i
z
e
1
0
0
0
0
f
−
n
−
2
0
0
0
−
f
−
n
f
+
n
1
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎤
本节教程就到此结束,希望大家继续阅读我之后的教程。
谢谢大家,再见!
饮水思源
参考文献:
《3D游戏与图形学中的数学方法》
《OpenGL投影矩阵(Projection Matrix)构造方法》
版权声明:原创技术文章,撰写不易,转载请注明出处!