一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
坐标系
坐标系用于描述物体在空间中的位置。
一般3d软件都采用笛卡尔坐标系描述物体的坐标信息。
笛卡尔坐标系又分左手坐标系和右手坐标系。
区别在于z轴的方向是向外还是向内:左手向内,右手向外。
用双手表示时,大拇指表示x周,食指表示y轴,中指表示z轴。
unity使用的是左手坐标系。z轴表示的是深度。用(x,y,z)的形式来表示坐标。
根据原点不同的选择原则,坐标系又分以下4种。
1.全局坐标系
也叫世界坐标系。
unity场景中创建的物体都是以全局坐标系的坐标原点来确定各自位置。
2.局部坐标系
也叫模型坐标系或物体坐标系。
模型mesh保存的顶点坐标均为局部坐标系下的坐标。
每个物体有其独立的物体坐标系。
工具栏可切换全局坐标和局部坐标。(global/local)
如果两个游戏对象存在父子关系,即a是b的子级。此时a的坐标原点为b,b的坐标原点为全局原点。
即子对象的位置是相对于父对象而言的。
3.相机坐标系
以相机为原点。
根据观察位置和方向建立的坐标系。
可以据此判断物体与相机的相对位置(是否处于相机前方等),以及物体之间的先后遮挡顺序等。
4.屏幕坐标系
建立在屏幕的二维坐标系,用来描述像素在屏幕上的位置。
坐标系间的转化:利用Transform组件里的方法,可实现点或向量,在局部坐标系和全局坐标系间的转换。
类型 | global->local | local->global |
---|---|---|
点 | Transform.TransformPoint | Transform.InverseTransformPoint |
向量 | Transform.TransformDirection | Transform.TransformDirection |
向量vector
也叫矢量。用于描述具有大小和方向属性的物理量,如运动速度,加速度,相机观察方向,刚体受力等。
几何中,使用带箭头的线段表示向量。
向量的运算,包括加减,数乘,点乘和叉乘。
在unity中,与向量相关的类有Vector2,Vector3,Vector4,分别对应不同维度的向量。
其中Vector3三维向量使用范围最广。
其常用成员变量如下。
常用方法如下。
矩阵maxtrix
矩阵是一个有行和列的矩形阵列。可以表示数据的变换。
unity种常用矩阵通常为4*4矩阵,可以用来描述向量的平移,旋转,缩放等所有线性变换。
unity使用Maxtrix4x4类描述4*4矩阵,但为了简化脚本编写,向量的常用操作在Vector3类和四元数Quaternion类中已经提供了对应的方法,且Transform组件也提供了不少方便的功能。
对于矩阵的直接操作,相对较少,对Maxtrix4x4的操作仅在Transform,Camera,Material和GL等几个类函数中用到。
齐次坐标
在原来的三位向量(x,y,z),添加一个维度,区别向量和点,形如(x,y,z,w)。
齐次坐标的用途:
1.当w=1,表示坐标点;w=0,表示向量
2.用4*4齐次矩阵统一表示平移,旋转,缩放变换。
3.分量w(与前面提到的w不同)可以用来表示无穷远的点。
(不是很理解这句)
四元数
四元数Q形式为:
Q=[w,(x,y,z)]
w为标量分量,(x,y,z)为三维向量分量。
四元数可用于表示旋转。
unity中,使用类Quaternion表示四元数,常用变量和函数如下。
unity中,可通过修改游戏变量的Transform组件的Transform.rotation和Transform.localRotation来使游戏对象发生旋转。
因为以上两个变量均为四元数形式。
表示游戏对象在全局坐标系和在父对象的局部坐标系下的旋转。
unity中,表示旋转还有欧拉角,矩阵,三种表示方法各有优缺点,需要根据实际需求选择。
比较如下: