耀哥教你做游戏--向量
向量也被称为矢量,是所有3D 游戏引擎的重要基础,可以用来表示空间中的点,比如游戏中的物体的位置或者三角网格的顶点。向量还可以用来表示空间中的方向,比如相机的方向或者三角网格的表面法向量,数量掌握向量运算是3D图形程序员的基本技能。
1. 向量的性质
用实数的N元数组表示向量
n维向量可以表示为 V=<V1,V2,......,Vn>
向量和标量的乘法/除法
只要把向量的每一个分量和标量进行相乘或者相除即可
标量a与向量V乘积
aV = Va = <aV1, aV2,......, aVn>
向量的加法、减法
向量的加法和减法是按分量逐个相加或相减完成的,结果是一个相同维度的新向量
向量P,Q相加
P+Q = <P1+Q1, P2+Q2, ....... , Pn+Qn>
向量加法的三角定则
向量的模
|V| =
模是一个标量 向量的绝对值有时也成为向量的范数或者长度
绝对值为1的向量成为单位向量
单位向量也被成为被归一化向量,向量转换为单位向量的过程被称为归一化/规范化
任意非零向量给该向量乘以1/|V|将其变为单位向量
|P| >= 0
|aP| = |a||P|
零向量 每一个分量都为0, V=(0,0,0)不能被归一化
2. 向量的点积
也被称为向量的内积或者标量积,是3D图形学中应用最多的概念之一
两个N维向量P和Q的内积可以表示为P·Q,是一个标量,相当于每一个分量乘积的和
P·Q = =
PxQx + PyQy + PzQz
也可以表示为矩阵乘积
[]
给定任意两个n维向量,点积满足以下等式
P·Q = |P| |Q| COSa
根据余弦定理
|P-Q| = +
-
2|P||Q|COSa
=
+
-
2|P||Q|COSa
=
- 2|P||Q|COSa
Pi·Qi = =
|P||Q|COSa
可以得出结论P·Q=0,COSa=0 两个向量相互垂直,零向量与任意向量相互垂直
向量内积的符号反应了两个向量的指向方向
两个向量的内积反应了这两个向量位于平面的同侧还是异侧
点积的几何意义
点积几乎应用到图形学的各个方面,一个重要几何意义就是投影
a·b等于b在a方向上的投影 再乘以a的长度
给定任意向量P,Q,R, 标量a
性质一:点积可结合标量乘法
(aP)·Q = a(P·Q) = P·(aQ)
性质二:点积可结合矢量加减法
P·(Q+R)= P·Q + P·R
性质三:向量与本身的点积等于 该向量模的平方
P·P =
|P|COSa =
与向量Q平行 可以用该向量的长度乘以单位向量Q/|Q|获得
P在向量Q上的投影表示为
ProjP = Q
3. 向量的叉积
也成为向量的外积,两个向量的外积可以产生一个垂直于这两个向量的新向量,叉积的结果是一个矢量
一个应用是给定物体表面一点和两个不同的切向量,计算出物体表面在该点的法线。
定理:给定两个三维向量P和Q,它们的外积可以写为P x Q
P x Q = <PyQz - PzQy, PzQx - PxQz, PxQy - PyQx>
P x Q = |P||Q|SINa
= ()
=
=
叉积不满足交换律
P x Q也可以写成矩阵与向量的乘积形式
P x Q右手坐标系判断,右手手指方向与向量P方向对齐,手掌朝向向量Q的方向,拇指所指方向就是向量P与向量Q的外积P x Q的方向