Unity之3D数学基础知识
1、3D坐标系(3D Coordinate System)
3D坐标系是3D游戏开发中的基础概念。一般而言3D软件都是采用笛卡尔坐标系来描述物体的坐标信息。笛卡尔坐标系分为左手坐标系和右手坐标系,左手坐标系是Y轴指向上方,X轴指向右方,而Z轴指向前方;左、右手坐标系X、Y轴向相同,而Z轴是相反的。
在Unity中使用的是左手坐标系,其中X轴代表水平方向,Y轴代表垂直方向,而Z轴代表深度,Unity中游戏对象的坐标信息是放在一堆括号中,依次按X、Y、Z轴顺序的格式来写的,例如(1,2,1)。
在游戏开发中,经常会用到不同的坐标系来描述控件中的位置,常用的坐标系有如下几种。
1) 全局坐标系
全局坐标系是用于描述游戏场景内所有物体位置和方向的基准,也称为世界坐标系。在Unity场景中创建的物体都是以全局坐标系中的坐标原点(0,0,0)来确定各自的位置的。新建一个Cube立方体,在Hierarchy视图中设置Position属性为(1,2,1),表示它距离全局坐标系原点在X轴方向上有1个单位的长度,在Y轴方向上有2个单位的长度,Z轴方向上有1个单位的长度。
2) 局部坐标系
每个物体都有其独立的物体坐标系,并且随物体进行相同的移动或者旋转,也称模型坐标系或物体坐标系。模型mesh保存的顶点坐标均为局部坐标系下的坐标。
在Unity中,可以在Hierarachy视图中将一个游戏对象拖动到另一个对象上来建立父子关系(Parenting),这样就使得被拖动的游戏对象称为目标对象的子物体,父子物体的坐标系是关联的,此时子物体会以父物体的坐标点为自身的坐标原点。
3) 相机坐标系
根据观察位置和方向建立的坐标系。使用此坐标系可以方便地判断物体是否在相机前方以及物体之间的先后遮挡顺序等。
4) 屏幕坐标系
建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置。在Unity中,
Transform 组件的 Transform.TransformPoint 方法可以将坐标点从局部坐标系转换到全局坐标系。
Tranform.InverseTransformPoint 可以将坐标点从全局坐标系转换到局部坐标系。
Transform.TransformDirection 和 Transform.InverseTransformDirection 则用于对向量在局部坐标系和全局坐标系之间进行转换。
2、向量(Vector)
向量(又称矢量)是游戏开发过程中非常重要的概念,它是用于描述具有大小和方向两个属性的物理量,例如物体运动的速度、加速度、摄像机观察方向、刚体受到的力等都是向量,向量在游戏开发中十分有用。
在数学里,既有大小又有方向的量就是向量。在几何中,向量可以用一段有方向的线段来表示。
1) 向量的运算
(1) 加减:向量的加法(减法)为各分量分别相加(相减)。在物理上可以用来计算两个力的合力或者几个速度分量的叠加。
(2) 数乘:向量与一个标量相乘称为数乘。数乘可以对向量的长度进行缩放,如果标量大于0,那么向量的方向不变,若标量小于0,则向量的方向会变为反方向。
(3) 点乘:两个向量点乘得到一个标量,数值等于两个向量长度相乘后再乘以二者夹角的余弦。
通过两个向量点乘结果的符号可以快速地判断两个向量的夹角情况:
若u·v=0,则向量u、v相互垂直;
若u·v>0,则向量u、v夹角小于90度;
若u·v<0,则向量u、v夹角大于90度。
(4) 叉乘:两个向量的叉乘得到一个新的向量,新向量垂直于原来的两个向量,并且长度等于原向量长度相乘后再乘夹角的正弦值。
需要注意的是,叉乘不满足交换律,即a×b≠b×a。
2) Vector3类
在Unity中,和向量有关的类有Vector2、Vector3、Vector4,分别对应不同维度的向量,其中Vector3三维向量的使用最为广泛。
文章摘自《Unity官方案例精讲》