点乘判断角度,叉乘判断方向。
点乘
结果是一个标量
a·b = (ax,ay,az)·(bx,by,bz) = axbx+ayby+azbz
a·b = b·a 满足交换律
a·b = |a||b|cosθ
点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近。
应用:
计算投影
比较矢量长度:v·v=|v|²,避免开平方操作
计算夹角,cosθ=0垂直,cosθ>0锐角,cosθ<0钝角
叉乘
结果是一个矢量
axb = (ax,ay,az)x(bx,by,bz) = (aybz-azby,azbx-axbz,axby-aybx)
axb ≠ bxa 不满足交换律; axb = -(bxa) 满足反交换律;(axb)xc ≠ ax(bxc)不满足结合律
|axb| = |a||b|sinθ
两个向量的叉乘所得到的是两个向量所组成的面的垂直向量,分两个方向。
叉乘最重要的应用就是创建垂直于平面、三角形或多边形的向量。
形象的说当一个,敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人。
矩阵
移动、旋转、缩放变换
rxn的矩阵A和nxc的矩阵B相乘,得到rxc的矩阵C。A的列数必须和B的行数相同,否则不能相乘。
AB ≠ BA 不满足交换律
(AB)C = A(BC) 满足结合律
优点:
- 可以立即进行向量的旋转
- 矩阵的形式被图形API所使用
- 多个角位移连接
- 矩阵的逆
缺点:
- 矩阵占用了更多的内存
- 难于使用
- 矩阵可能是病态的
欧拉角
使用三个角度来表示方位,这三个角度是绕三个互相垂直轴的有顺序旋转的旋转量。
优点:
- 容易使用,符合人们思考方位的方式
- 表达方式简洁
- 任意三个数都是合法的,没有“不合法”的欧拉角,可矩阵和四元数就不一定了。
缺点:
- 给定方位的表达方式不唯一
- 两个角度间求插值非常困难
- 万向锁,自由度会减少一个
四元数
优点:
- 平滑插值,slerp和squad提供了方位间的平滑插值
- 快速连接和角位移求逆
- 能和矩阵形式快速转换
- 仅用四个数,而矩阵用了9个数
- 避免欧拉角的万向锁
缺点:
- 比欧拉角稍微大一些
- 四元数可能不合法
- 难于使用