Unity3D中的数学

点乘判断角度,叉乘判断方向。

点乘

结果是一个标量
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所使用
  • 多个角位移连接
  • 矩阵的逆

缺点:

  • 矩阵占用了更多的内存
  • 难于使用
  • 矩阵可能是病态的

欧拉角

使用三个角度来表示方位,这三个角度是绕三个互相垂直轴的有顺序旋转的旋转量。
优点:

  1. 容易使用,符合人们思考方位的方式
  2. 表达方式简洁
  3. 任意三个数都是合法的,没有“不合法”的欧拉角,可矩阵和四元数就不一定了。

缺点:

  1. 给定方位的表达方式不唯一
  2. 两个角度间求插值非常困难
  3. 万向锁,自由度会减少一个

四元数

优点:

  • 平滑插值,slerp和squad提供了方位间的平滑插值
  • 快速连接和角位移求逆
  • 能和矩阵形式快速转换
  • 仅用四个数,而矩阵用了9个数
  • 避免欧拉角的万向锁

缺点:

  • 比欧拉角稍微大一些
  • 四元数可能不合法
  • 难于使用

这里写图片描述

猜你喜欢

转载自blog.csdn.net/crayon_chen/article/details/79883841