unity中的3d数学基础

478 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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->locallocal->global
Transform.TransformPointTransform.InverseTransformPoint
向量Transform.TransformDirectionTransform.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中,表示旋转还有欧拉角,矩阵,三种表示方法各有优缺点,需要根据实际需求选择。

比较如下: