Unity3D基础篇——聊一聊三维世界和Unity3D中常用的坐标系和

最近在看Unity的旋转变换,看着看着就发现里边有一些基础知识自己还是没彻底弄明白,于是为了扫清障碍,就跳到了基础知识的学习中(也是醉了,每次看东西只要看到不懂得就会身就不放,结果就跑偏了),废话不多说,接下来就学习下3D数学中的一个基础知识点——坐标系。

一、笛卡尔坐标系

一般情况下没有特殊说明笛卡尔坐标系就是指直角坐标系,但直角坐标系是笛卡尔坐标系的一种特殊情况。

定义:1.每个2D笛卡尔坐标系都有一个特殊的点,成为原点(0,0)它是坐标系的中心。

            2.每个2D笛卡尔坐标系都有两条过原点的直线向两边无限延伸,称为轴,两个轴互相垂直

笛卡尔坐标系定位:坐标系是一个精确定位点的框架。为了在笛卡尔坐标系中定位点,引入了笛卡尔坐标的概念。在2D平面中,两个数(xy)就可以定义一个点。标的每个分量都表明了该点与原点之间的距离和方位,每个分量都是相应轴的有符号距离。有符号距离指在某个方向上距离为正,而在相反方向为负。

二、 3D坐标系

3D坐标系表示三维空间系,3D坐标系存在三个轴,比2D坐标系多了一个Z轴,3个轴互相垂直,也就是每个轴都有垂直于其他两个轴。在3D坐标系中点位需要3 数:xyz

左手坐标系、右手坐标系:

3D坐标系存在两种完全不同的坐标系,左手坐标系和右手坐标系。如果属于相同的坐标系,可以通过旋转来重合,否则是不可以重合的。两个坐标系之间没有好坏,只是应用于不同的场景。计算机中使用左手坐标系,线性代数中使用右手坐标系。

三、多坐标系:

 为什么使用多坐标系?因为在不同的情况下使用不同的坐标系更加方便。某些信息只有在特定的上下文环境中获得。下面介绍一些常用的坐标系:

1.世界坐标系

是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架,另一方面说,能用时间坐标系描述其他坐标系的位置,而不能用更大的坐标系来描述世  界坐标系。

2.物体坐标系

特定物体相关联的坐标系。当物体位移或改变方向时,和该物体相关的坐标系也随之移动和改变方向。比如告诉你“向前走一步”则是向你的物体坐标系发 指令。“前、后、左、右”这样的概念只有物体坐标系才有意义。“向左转”是物体坐标系,“向东”是世界坐标系。有时候物体坐标系也称为模型坐标系,模型 顶点的坐标都是在模型坐标系中描述的。

3.摄像机坐标系

观察者密切相关的坐标系。摄像机坐标系被看做是一种特殊的物体坐标系,该坐标系定义摄像机的屏幕可视区域。在摄像机坐标系中,摄像机在原点,x轴 向右,z轴向前,y轴向上。关于摄像机坐标系的轴向约定可能不同。许多图形学书中习惯用右手坐标系,z轴向外,即从屏幕指向读者。2D幕上显示的内容就是3D摄像机坐标系通过投影转换呈现的。

4.惯性坐标系

为了简化世界坐标系到物体坐标系之间的转换,才有了惯性坐标系。惯性坐标系的原点和物体坐标系的原点重合,但惯性坐标系的轴平行于世界坐标系 轴。所以物体坐标系转换为惯性坐标系只需要旋转,从惯性坐标系到世界坐标系只需要平移。

5.嵌套坐标系

3D虚拟世界中每个物体都有自己的坐标系——自己的原点和坐标轴。每个模型都有自己的原点和坐标轴,模型的子物体就是在这个嵌套坐标系中。

物体坐标系到世界坐标系的转换:

1.旋转物体坐标系到惯性坐标系。将物体坐标系旋转到与惯性坐标系重合。

2.将惯性坐标系原点移至世界坐标系

四、关于Unity的一些常用坐标系介绍

首先,Unity是左手坐标系,常用的坐标系有:

1.世界坐标系

我们在场景中添加物体,他们都是以世界坐标显示在场景中的。Transform.position可以获取该位置坐标。

2.屏幕坐标系

以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height,Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。

3.绘制GUI界面的坐标系

这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

4.视口坐标系:

视口坐标是标准的相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。

世界坐标—屏幕坐标camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

屏幕坐标—视口坐标camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

视口坐标—屏幕坐标camera.ViewportToScreenPoint();

视口坐标—世界坐标camera.ViewportToWorldPOint();



猜你喜欢

转载自blog.csdn.net/u014086857/article/details/54708188