Unity中的数学单位

向量

概述

Unity中通过Vector2、Vector3、Vector4来储存二维、三维和四维向量(XYZW),同时还有Vector2Int、Vector3Int这两种整形向量。向量间具有加法和减法的运算符函数重载,向量和数值量间具有乘法和除法的运算符函数重载。坐标、位移、力、速度、旋转等都会用上向量。

不同维度的向量互相存在强制类型转换,在高维向量转化为低维向量时截断高维度值(w>z>y>x),低维向量转化为高维向量时高维度值用0填充。

Vector类的方法和属性一览

注:介绍时使用Vector3类型作为例子,将表格中所有Vector3替换为Vector2、Vector4、Vector2Int、Vector3Int等皆可。

注:表格中Vector3代表静态方法和属性,而vector3代表属于对象的方法和属性。

Unity3d书的几次方api unity 数学_Unity

Unity3d书的几次方api unity 数学_四元数_02

四元数

欧拉角

Unity中同时使用欧拉角和四元数处理旋转,其中显示在Inspector面板中的是欧拉角Eular。

Eular角是经典的直观化的角度储存方式,欧拉角的本质是一个向量,其设计思路是将一个初始角度设定为向量(0,0,0),将向量中的分量x、y、z分别理解为物体沿模型坐标x、y、z轴旋转的度数,借此记录一个旋转的结果。

以一个飞机模型为例解说欧拉角的规则:

Unity3d书的几次方api unity 数学_色彩空间_03

沿着机身右方轴(Unity中的+X)进行旋转,称为Pitch,即俯仰。

沿着机头上方轴(Unity中的+Y)进行旋转,称为Yaw,即偏航。

沿着机头前方轴(Unity中的+Z)进行旋转,称为Roll,即桶滚。

在不同的软件中,欧拉角旋转的顺序是不同的。在Unity中,欧拉角旋转的顺序是R-Y-P,即z-y-x。物体先沿自己的Z轴旋转z度,再沿Y轴旋转y度,再沿X轴旋转x度。

欧拉角最大的不足是具有万向节死锁问题,对此感兴趣的同学可以自行搜索“万向节死锁”。

使用脚本动态修改欧拉角并不直观,很难估计修改的结果,容易导致结果与预期不符,即使是对欧拉角最熟悉的开发者也应尽量避免大量或多次在脚本中直接修改欧拉角度,除了以下的两个情况:

三个轴的角度都是90°的整数倍时,由于旋转很直观,适合使用欧拉角。

当只有一个轴进行旋转,另外两个轴不变时,也适合使用欧拉角。

四元数(Quaternion)简介

鉴于欧拉角的弊端,Unity在脚本中对角度的标准表示是使用单位四元数Quaternion类型。四元数是一个四维复数类型:q = w + xi + yj + zk,对此感兴趣可以自行搜索“四元数”。

在Unity中最常用的transform.rotation就是四元数类型的属性。我们可以直接使用四元数的构造函数来构造新的四元数:

Quaternion(float x, float y, float z, float w);

对四元数没有达到驾轻就熟的同学不要使用构造函数直接生成新的四元数,Unity的Quaternion类提供了可以方便获取新旋转的方法:


颜色

Color类简介

Unity中的颜色使用Color类储存RGBA属性。注意,Unity中储存RGBA使用0至1的浮点数而非0至255的整数。

Color具有加减法运算符重载,而将两个Color相乘相当于将两种颜色混合。Unity中的Color可以与Vector3或Vector4相互进行隐式强制类型转换。

RGB和HSV

RGB和HSV都是颜色的表示方式,RGB模型使用的是立方体型颜色空间,而HSV模型使用的是圆柱体型颜色空间。

Unity3d书的几次方api unity 数学_伽马校正_04

在进行颜色的渐变时,针对不同的颜色取值在不同的颜色空间中进行插值会得到不一样的效果,如在进行全彩渐变时就时候在HSV空间中对Hue进行插值。

色彩空间

线性和非线性色彩空间:这个概念要从人眼对光的感知说起,人眼对较亮的光更敏感,对较暗的光不敏感,也就是说,人眼本身对颜色的感知是非线性的:

Unity3d书的几次方api unity 数学_Unity_05

Unity3d书的几次方api unity 数学_四元数_06

上图是一个从RGB(0,0,0)到RGB(1,1,1)线性变化的色域,但我们观察它时感到白色部分明显比黑色部分要多,不像线性,而下图是一个对上图进行了伽马校正的色域,现在它看起来更线性,但是其数值已经处于非线性色彩空间了。

中间是线性色彩空间在我们眼中直接看到的样子,而右图是中间图进行了伽马校正后的样子,左图则是中间图进行反伽马校正后的样子(伽马校正就是将RGB值通过一个指数特殊的幂函数进行转换)。

Unity3d书的几次方api unity 数学_色彩空间_07

我们可以在"Edit"->“Project Settings”->“Player”->“Other Settings”->“Rendering”->"Color Space*"中修改Unity整体显示的色彩空间。选择Gamma时会给显示在屏幕上的所有像素额外附加一个强度为2.2的伽马校正,使高光更亮,暗部细节更明显。而选择Linear时会取消屏幕上的伽马校正,使最终显示的颜色和输入的颜色一致,这可能使图片没那么精致,但会更加真实。

Unity3d书的几次方api unity 数学_伽马校正_08

Color类的方法和属性一览