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