8 min read

Vector3

  • 模长 float dis = vertor.magnitude;
    • 模的平方 vertor.sqrMagnitude;
    • transform.position.magnitude
  • 方向 (归一化,标准)
    • transform.position / transform.position.magnitude
  • 向量的计算
    • 等于各个分向量相减 [x1, y1, z1] - [x2, y2, z2] = [x1 - x2, y1 - y2, z1 - z2] 注意要移动到原点
    • Vector3 result = transform1.position - transform2.position // result.normalized 获取方向,避免两个物体间距对速度不影响
    • 等于各个分向量相加 [x1, y1, z1] + [x2, y2, z2] = [x1 + x2, y1 + y2, z1 + z2] 两向量对角线
  • 向量和标量的乘除
    • 乘法:该向量的各个分向量相乘 k[x, y, z] = [kx, xy, kz]
    • 除法:该向量的各个分向量相除
    • 几何意义: 缩放向量长度
  • API
    • Vector3.up
    • Vector3.right 等价于 Vector3(0, 1, 0)
    • Vector3.forward 等价于 Vector3(0, 0, 1)

点乘

  • Dot 点乘又称点积或内积
  • 公式 各个分向量乘机和 [x1, y1, z1]·[x2, y2, z2] = x1x2 + y1y2 + z1z2
  • 几何意义 a·b = |a|·|b|cos<a,b> 两个向量的单位向量相乘后再乘以二者夹角的余弦值
  • API float dot = Vector3.Dot(va, vb); // float dot = Vector3.Dot(t1.position.normalized, t2.position.normalized); angle = Mathf.Acos(dot) * Mathf.Rad2Deg; // 计算夹角
  • 计算后的夹角只能试0-180度之间的,区分不出正反
  • yingyong

叉乘

  • Cross 叉乘又称叉积或外积
  • 公式 [x1, y1, z1] x [x2, y2, z2] = [y1 * z2 - z1 * y2, z1 * x2 - x1 * z2, x1 * y2 - y1 * x2]
  • 几何意义:结果为两个向量所组成面的垂直向量,模长为两向量模长乘积在乘夹角的正弦值
  • API Vector vector = Vector.Cross(a, b)
  • 区分出正反 if (vector.y < 0) angle = 360 - angle
  • 应用 创建垂直于平面的向量 判断两条向量的相对位置

角的度量方式

  • 角度Degree
  • 弧度Radian
  • 两条射线从圆心向周围射出,形成一个夹角与夹角正对的一段弧。当弧长等于圆周长的360分之一时,夹角为1度。弧长等于圆的半径时,夹角为1弧度
  • PI=180度 1弧度=180度/PI 1角度=PI/180度
  • 角度 >= 弧度:弧度 = 角度PI/180 API: 弧度=角度数Mathf.Deg2Rad
  • 弧度 >= 角度:角度 = 弧度180/PI API: 角度=弧度数Mathf.Rad2Deg

三角函数

  • 建立了直角三角形中角与边长比值的关系
  • 可用于根据一边一角,计算另一边长 角的对边a,角的临边b,角的斜边c
  • sin x = a / c; API: Mathf.Sin(float radian)
  • cos x = b / c; API: Mathf.Cos(float radian)
  • tan x = a / b; API: Mathf.Tan(float radian)

反三角函数

  • 反正弦、反余弦、反正切等函数总成
  • 可用于根据两边,计算角度 角的对边a,角的临边b,角的斜边c
  • arcsin a / c = x; API: Mathf.Asin(float radian)
  • arccos b / c = x; API: Mathf.Acos(float radian)
  • arctan a / b = x; API: Mathf.Atan(float radian)

欧拉角

  • 什么是欧拉角
    • 使用三个角度来保存方位
    • X与Z沿自身坐标系旋转,Y沿世界坐标系旋转
    • API Vector3 eulerAngle = this.transform.enlerAngles; xyz表示各个轴向上的旋转角度
  • 优点
    • 仅使用三个数字表达方位,占用空间小
    • 沿坐标轴旋转的单位为角度
    • 任意三个数字都是合法的,不存在不合法的欧拉角
  • 缺点
    • 方位的表达方式不唯一 对于一个欧拉角,存在多个欧拉角的描述,无法判断多个欧拉角代表的角方位是否相同 例如 --0,5,0和0,365,0 --250,0,0和290,180,180
    • 为了保证任意方位都只有独一无二的表示,unity引擎限制了角度范围,即沿x轴旋转限制在-90到90之间,沿y与z轴旋转限制在0-360之间
    • 万向节死锁
      • 物体沿X轴旋转正负90度,自身坐标系Z轴与世界坐标系Y轴将重合,此时再沿Y或Z轴旋转时,将失去一个自由度
      • 在万向节死锁的情况下,规定沿Z轴完成绕竖直轴的全部旋转,此时Y轴旋转为0

四元数

  • Quaternion 在3D图形学中代表旋转,由一个三维向量(X,Y,Z)和一个标量(W)组成
  • 旋转轴为V,旋转弧度为0,如果使用四元数表示,则四个分量为: x = sin(0/2)*V.x y = sin(0/2)*V.y z = sin(0/2)*V.z w = cos(0/2)
  • X,Y,Z,W 取值范围 -1到1
  • API Quaternion qt = this.transform.rotation
  • 优点
    • 避免万向节死锁
      • this.transform.rotation *= Quaternion.Euler(0, 1, 0);
      • 等价于 this.transform.Rotate(Vector3 eulerAngles)
  • 缺点
    • 难于使用,不建议单独修改某个数值
    • 存在不合法的四元数

坐标系

  • Unity坐标系
    • World Space 世界坐标系,整个场景的固定坐标;作用:在游戏场景中表示每个游戏对象的位置和方向
    • Local Space 物体坐标系,每个物体都有独立的坐标系,原点为模型轴心点,随物体移动或旋转改变; 作用:表示物体间相对位置和方向
    • Screen Space 屏幕坐标系,以像素为单位,原点在屏幕的左下,Z为物体到相机的距离; 作用:表示物体在屏幕中的位置
    • Viewport Space 视口(摄像机)坐标系,原点在左下(0, 0),Z为到相机的距离,右上角为(1, 1); 作用:表示物体在摄像机中的位置
  • 坐标系转换
    • Local Space -> World Space
      • transform.forward 在世界坐标系中表示物体正前方
      • transform.right 在世界坐标系中表示物体正右方
      • transform.up 在世界坐标系中表示物体正上方
      • transform.TransfromPoint 转换点,受变换组件位置、旋转和缩放影响
      • transform.TransfromDirection 转换方向,受变换组件旋转影响
      • transform.TransfromVector 转换向量,受变换组件旋转和缩放影响
    • World Space -> Local Space
      • transform.InverseTransformPoint 转换点,受变换组件位置,旋转和缩放影响
      • transform.InverseTransformDirection 转换方向,受变换组件旋转影响
      • transform.InverseTransformVector 转换向量,受变换组件旋转和缩放影响
    • World Space <-> Screen Space
      • Camera.main.WorldToScreenPoint 将点从世界坐标系转换到屏幕坐标系
      • Camera.main.ScreenToWorldPoint 将点从屏幕坐标系转换到世界坐标系
    • World Space <-> ViewPort Space
      • Camera.main.WorldToViewportPoint 将点从世界坐标系转换到视口坐标系
      • Camera.main.ViewportToWorldPoint 将点从视口坐标系转换到世界坐标系