【OpenGL】-002 OpenGL数学基础
这是我看OpenGL书时的数学笔记。
1、Vector
1.1 意义
顶点是OpenGL中的一个重要的输入,表示空间中的一个位置,通常可以用一个向量来表示,即一个xyz空间中的三元组。三元组(x,y,z)表示不仅表示了位置还表示了长度(向量的模)。
向量
(x,y,z)
(
x
,
y
,
z
)
的模计算公式如下:
|(x,y,z)|=x2+y2+z2−−−−−−−−−−√
|
(
x
,
y
,
z
)
|
=
x
2
+
y
2
+
z
2
1.2 向量加减
向量
a⃗ =(ax,ay,az)
a
→
=
(
a
x
,
a
y
,
a
z
)
,向量
b⃗ =(bx,by,bz)
b
→
=
(
b
x
,
b
y
,
b
z
)
,则向量加减法计算方式如下:
a⃗ +b⃗ =(ax+bx,ay+by,az+bz)
a
→
+
b
→
=
(
a
x
+
b
x
,
a
y
+
b
y
,
a
z
+
b
z
)
a⃗ −b⃗ =(ax−bx,ay−by,az−bz)
a
→
−
b
→
=
(
a
x
−
b
x
,
a
y
−
b
y
,
a
z
−
b
z
)
1.3 点乘
向量
a⃗ =(ax,ay,az)
a
→
=
(
a
x
,
a
y
,
a
z
)
,向量
b⃗ =(bx,by,bz)
b
→
=
(
b
x
,
b
y
,
b
z
)
,则向量点乘计算方法如下:
a⃗ ⋅b⃗ =axbx+ayby+azbz=||a⃗ ||⋅||b⃗ ||⋅cos(θ)
a
→
·
b
→
=
a
x
b
x
+
a
y
b
y
+
a
z
b
z
=
|
|
a
→
|
|
·
|
|
b
→
|
|
·
c
o
s
(
θ
)
其中
θ
θ
是
a⃗
a
→
与
b⃗
b
→
的夹角,
0≤θ≤π
0
≤
θ
≤
π
根据向量的以上性质,可以用于求两个向量的夹角大小:
cos(θ)=a⃗ ⋅b⃗ ||a⃗ ||⋅||b⃗ ||=axbx+ayby+azbz||a⃗ ||⋅||b⃗ ||
c
o
s
(
θ
)
=
a
→
·
b
→
|
|
a
→
|
|
·
|
|
b
→
|
|
=
a
x
b
x
+
a
y
b
y
+
a
z
b
z
|
|
a
→
|
|
·
|
|
b
→
|
|
如果
a⃗
a
→
与
b⃗
b
→
是单位向量,则
||a⃗ ||=1
|
|
a
→
|
|
=
1
,
||b⃗ ||=1
|
|
b
→
|
|
=
1
,此时
cos(θ)=axbx+ayby+azbz
c
o
s
(
θ
)
=
a
x
b
x
+
a
y
b
y
+
a
z
b
z
。
向量点乘的性质
(1) 如果
a⃗ ⋅b⃗ =0
a
→
·
b
→
=
0
,则
a⃗
a
→
⊥
b⃗
b
→
.
(2) 如果
a⃗ ⋅b⃗ >0
a
→
·
b
→
>
0
,则
0≤θ<π2
0
≤
θ
<
π
2
.
(3) 如果
a⃗ ⋅b⃗ <0
a
→
·
b
→
<
0
,则
π2<θ≤π
π
2
<
θ
≤
π
.
1.4 叉乘
向量
a⃗ =(ax,ay,az)
a
→
=
(
a
x
,
a
y
,
a
z
)
,向量
b⃗ =(bx,by,bz)
b
→
=
(
b
x
,
b
y
,
b
z
)
,则向量叉乘计算方法如下:
w⃗ =a⃗ ×b⃗ =(aybz−azby,axbz−azbx,axby−aybx)=||a⃗ ||⋅||b⃗ ||⋅sin(θ)⋅n⃗
w
→
=
a
→
×
b
→
=
(
a
y
b
z
−
a
z
b
y
,
a
x
b
z
−
a
z
b
x
,
a
x
b
y
−
a
y
b
x
)
=
|
|
a
→
|
|
·
|
|
b
→
|
|
·
s
i
n
(
θ
)
·
n
→
,其中
n⃗
n
→
是垂直与这两个向量组成的平面的单位向量。
由此可以看出,两个向量的叉乘的结果仍然是一个向量,该向量垂直于由向量
a⃗
a
→
与
b⃗
b
→
确定的平面,即
w⃗
w
→
⊥
a⃗
a
→
,
w⃗
w
→
⊥
b⃗
b
→
.
w⃗
w
→
的方向遵循右手定则,手指指向第一个向量,向第二个向量蜷缩手指,角度范围在
0≤θ≤π
0
≤
θ
≤
π
,此时,拇指的方向即为
w⃗
w
→
的方向。
1.5 反射与透射
入射向量
Rin→
R
i
n
→
,界面法向向量
N⃗
N
→
,入射角度为
θ
θ
,折射率为
η
η
,反射向量记为
Rreflect→
R
r
e
f
l
e
c
t
→
,折射向量记为
R(refract,η)→
R
(
r
e
f
r
a
c
t
,
η
)
→
.则有如下计算公式成立:
Rreflect→=Rin→−(2N⃗ ⋅Rin→)N⃗
R
r
e
f
l
e
c
t
→
=
R
i
n
→
−
(
2
N
→
·
R
i
n
→
)
N
→
折射向量计算方法如下:
k=1−η2(1−(N⃗ Rin→)2)
k
=
1
−
η
2
(
1
−
(
N
→
R
i
n
→
)
2
)