点积

点积,又称为点乘,a.b,是向量对应分量乘积的和,结果为一个标量。 代数定义:[x,y,z].[a,b,c] = ax+by+cz。 几何定义:a.b = |a||b|cos(夹角)。 点积描述了向量的相似程度,结果值越大,向量越相近。

向量积

向量积,又称为叉乘,结果为一个向量,且不满足交换律。 公式:[x,y,z]x[a,b,c] = [yc-zb,za-xc,xb-ya]。 几何解释:向量积得到的向量垂直于原来的两个向量。叉乘的结果方向遵守坐标系规则。 a x b = c,如果左手坐标系,当左手从 a 以不超过180度的转角转向 b 时,竖起的大拇指指向的就是 c 的方向。 Unity使用的是左手坐标系,因为z轴朝向前方。所以 (1, 0, 0) 点乘 (0, 0, 1) 等于 (0, -1, 0)。

旋转

Transform.rotation:对象在世界坐标系下的旋转; Transform.localRotation:对象在父对象的局部坐标系下的旋转。 两个变量的类型均为四元素。

  • 得到游戏对象当前旋转的角-轴表示 transform.rotation.ToAngleAxis(angle, axis);

  • 旋转归零,局部坐标系的坐标轴与世界坐标系的坐标轴平行 transform.rotation = Quaternion.identity;

  • 使对象朝向target

1
2
3
relativePos = target.position - transform.position;
rotation = Quaternion.LookRotation(relativePos);
transform.rotation = rotation;
  • 将对象的旋转从from平滑差值到to,可以用来模拟相机的观察方向从物体a过渡到物体b的效果。
1
transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.deltaTime*speed)

坐标系

常用的坐标系有世界坐标系、局部坐标系、相机坐标系、屏幕坐标系。Transform.TransformPoint可以将坐标点从局部坐标系转换到世界坐标系,Transform.InverseTransformPoint可以将坐标点从世界坐标系转换到局部坐标系;Transform.TransformDirection和Transform.InverseTransformDirection对向量在世界坐标系和局部坐标系之间转换。例如,将对象位置转换为相机坐标系下的坐标:

1
2
3
4
cam = Camera.main.transform;
CameraRelative = cam.InverseTransformPoint(transform.position)
if (CameraRelative.z > 0)
    Debug.log("The object is in front of Camera");

矩阵

一组元素,以n个数为一段,分成m段,按顺序排列为m行,可以构成一个矩阵。 矩阵形如矩形,当 m==n 时形如正方形,称为n阶方阵。 矩阵乘以一个常数,就是所有位置都乘以这个数。 两个矩阵可以相乘,条件:左矩阵的列数必须等于右矩阵的行数。 左矩阵每行与右矩阵每列的对应的数进行相乘然后相加得到一个数。

1
2
3
1 2 3     1 1     10 8
1 2 0  x  0 2  =  1  5
          3 1

转置矩阵:将 mxn 的矩阵的行和列互换,得到 nxm 的矩阵。 逆矩阵:对于一个n阶方阵A,如果存在一个n阶方阵B,使得 AxB=BxA=E,那么互为逆矩阵,E为单位矩阵。 单位矩阵:单位矩阵E就是对角线上全为1,其它为0。AxE=A。 如果一个数为g,有gxA=C,那么为了求g,可以使用逆矩阵,gxAx(A的逆矩阵)=Cx(A的逆矩阵),g=Cx(A的逆矩阵)。

一个点的坐标乘以一个矩阵,可以对改点进行缩放、旋转操作。如果要表示平移,需要添加一列元素,所以通常用 4x4 的矩阵对 vector3 表示的点坐标进行各种变换。

四元素

$i^2 = j^2 = k^2 = ijk = -1$ 其中i,j,k都为虚数,虽然虚数是不存在的,但是可以把一次旋转90度看作是乘以一个i,转180度即乘以 $i^2$,正好反向。复数是实数和虚数的和,而四元素源于复数,四元素的一般形式,用4个数表示: $q = [s, xi + yj + zk]$ 由于四元素计算公式复杂,通常在Unity中用欧拉角来创建四元素,而非直接使用。

傅立叶变换

卷积