【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
