转载自:http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/B_coordinate_system.html
三维坐标系介绍
基本概念
我们需要三个轴来表示三维坐标系,前两个称作x轴和y轴,这类似于2D平面,第三个轴称作z轴。一般情况下,3个轴互相垂直。也就是每个轴都垂直于其他两个轴。图1展示了一个3D坐标系。
![3D笛卡尔坐标系](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image001.png)
图1 3D笛卡尔坐标系
在Flash3D产品中我们实际上是位于z轴负方向面向xy平面来进行操作。当我们面对计算机屏幕并且坐标系没有旋转的情况下,实际看到的应该是图2的情况,这时候z轴垂直屏幕向里。
在这里的三维空间中,z 属性表示深度。当对象向右移动时,x 属性的值会增大。当对象向上移动时,y 属性的值会增大。当对象远离视点时,z 属性的值会增大。若使用透视投影和缩放,则对象在靠近屏幕时会显得大一些,而在远离屏幕时会显得小一些。
![面对计算机实际看到xy平面](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image002.png)
图2 面对计算机实际看到xy平面
2D平面中我们指定x轴向右为正,y轴向上为正的坐标系为标准形式,但是3D中并没有标准形式。不同的作者、不同的研究领域使用不同的标准。但这里我们统一使用图1所示坐标系。
把3D中的x轴、y轴等同于2D中的x轴、y轴是不准确的。3D中,任意一对轴都定义了一个平面并垂直于第3个轴(例如,包含x,y轴的xy平面,垂直于z轴。同样,xz平面垂直于y轴,yz平面垂直于x轴)。我们指定+x,+y和+z分别指向右方,上方和前方。
在3D中定位一个点需要三个值:x,y和z,分别代表该点到yz,xz和xy平面的有符号距离1。例如x值是到yz平面的有符号距离,此定义是直接从2D中扩展来的。如图3所示:
![3D中定位点](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image003.png)
图3 3D中定位点
左手坐标系与右手坐标系
3D坐标系存在两种完全不同的坐标系:左手坐标系和右手坐标系。如果同属于左手坐标系或右手坐标系,则可以通过旋转来重合,否则不可以。
“左手”和“右手”分别代表什么意思呢?我们先学习一下怎样判断坐标系的类型。伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上。中指指向前方。现在,我们就已经建立了一个左手坐标系,拇指、食指和其余手指分别代表x、y、z轴的正方向。如图4所示:
![左手坐标系](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image004.png)
图4 左手坐标系
同样,伸出右手,使食指向上,中指向前,拇指这时指向左,这就是一个右手坐标系,拇指、食指和其余三个手指分别代表x、y、z轴的正方向。右手坐标系如图5所示:
![右手坐标系](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image005.png)
图5 右手坐标系
无论你怎么转动手腕,也不可能让两只手代表的坐标系重合。
在我们的Flash3D产品中使用的是左手坐标系。
左手坐标系与右手坐标系对于“正向旋转”的定义也是不一样的,假设空间有一条直线,我们需要绕该直线旋转一定的角度,首先我们叫这个轴为“旋转轴”,不要想当然的认为这里的“轴”是基准轴(x,y或z轴),旋转轴可以取任意方向。这时候如果希望绕轴旋转30度,我们怎么知道该如何旋转呢?
我们首先要知道哪个方向为正,哪个方向为负,这样才能进行下一步操作。标准区分左手坐标系中的正向与负向的方式叫做“左手法则”。如何操作呢?首先明确一个前提,虽然旋转轴理论上是无限长的,但是我们还是认为它和基准轴一样有一个正方向和一个负方向;左手法则的使用方式:左手握住旋转轴,竖起拇指指向旋转轴正方向,正向旋转方向就是其余手指卷曲的方向;相同的操作方式在右手坐标系就是“右手法则”;如下图6,7:
![左手法则](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image006.png)
图6 左手法则
![右手法则](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image007.png)
图7 右手法则
可以发现,在左手坐标系统中,从旋转轴正方向看下去,正向旋转方向就是顺时针方向;而在右手坐标系统中,从旋转轴正方向看下去,正向旋转方向就是逆时针方向;
左手坐标系与右手坐标系可以互转,最简单的方式就是将某一个基准轴的正方向和负方向调转;如果掉转了两个轴,相当于绕第三个轴旋转了180度,并没有坐标系的变化。
世界坐标系与物体坐标系
世界坐标系
3D世界坐标与flash里的坐标不一样, flash坐标只有两根轴(x轴与y轴)以flash影片左上角为坐标原点,向右为X轴正方向,向下为Y轴正方向。3D的世界坐标有三轴(x,y,z),如图8:
![视口与世界坐标](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image008.png)
图8 视口与世界坐标
世界坐标的Z轴垂直于视口平面。
物体坐标系
每个3D元素都有自身坐标,在默认情况下,新创建一个3D元素时,该元素的自身坐标与世界坐标重合。下图新建一球(3D基本元素),该球自身坐标与世界坐标重合。
![自身坐标](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image009.png)
图9 自身坐标
当3D元素被移动或转动时,其自身坐标也跟着移动和转动。
![自身坐标相对世界坐标旋转](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image010.png)
图10 自身坐标相对世界坐标旋转(rotationZ=30)
将图9里的球的绕z轴旋转30度时就的到图2。图中黑线描出世界坐标。
SuperMap iClient For Flash3D产品中的一些概念
屏幕坐标,世界坐标,地图坐标
屏幕坐标比较容易理解,就是我们看到的电脑屏幕对应的坐标点,这里的坐标点为二维坐标点,以左上角为原点,水平向右是正向x轴,垂直向下是正向y轴。当我们的鼠标在屏幕上移动或者点击的时候,首先获得的是屏幕坐标,进而通过转换能够得到世界坐标和地图坐标,屏幕坐标如下图11。
![屏幕坐标](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image011.png)
图11 屏幕坐标
世界坐标系直接影响到我们观察到的Flash3D内部对象的效果,例如近大远小的透视效果, 所以世界坐标系是一个三维坐标系,我们这里使用的是笛卡尔坐标系,如图1所示,初始 状态,原点位于屏幕正中心,xy平面与计算机屏幕重合,向右向下为正,z轴垂直于电脑 屏幕向里为正。
地图坐标系是我们看到 的地图平面的坐标系,是一个二维坐标系,它以左下角为原点,向右为x轴正方向,向上 为y轴正方向,如图12所示。这里的二维地图平面放在世界坐标系中,所以它有翻转等效 果。
![地图坐标系](http://support.supermap.com.cn/DataWarehouse/WebDocHelp/OnlineHelp/Flash3D/G_ProjectDocumentation/images/image012.png)
图12 地图坐标系
三种坐标系之间转换关系
当我们已知屏幕坐标,需要知道对应的世界坐标的时候,就会用到屏幕坐标向世界坐标的转换(map:screenToVector3D()方法);同理,当已知三维对象的世界坐标需要知道屏幕坐标的时候,就需要世界坐标向屏幕坐标的转换(map:vector3DToScreen()方法)。应用场景比如:鼠标单击屏幕上某一点能够拾取世界坐标系中该点所在的地物等。
当我们已知世界坐标上的一个坐标位置,需要知道它在地图上的位置的时候,则需要进行世界坐标到地图坐标的转换(map: vector3DToMap()方法);同理,当知道地图上坐标点,需要知道它在世界坐标系中的位置时,就需要将地图坐标转换成世界坐标(map: mapToVector3D()方法)。应用场景比如:三维世界有一个建筑,需要放在二维地图上,位置间的转化就显得非常必要了。
当需要鼠标在屏幕移动并获取其对应的地图坐标点位置的时候,就需要屏幕坐标向地图坐标的转换(map: mapToScreen()方法),当已知地图上某点地理坐标,需要知道对应的屏幕坐标的时候,就需要将地图坐标转换成屏幕坐标(map: screenToMap()方法)。应用场景比如:鼠标的框选能够选取地图坐标中对应位置的地物要素(这里就类似二维地图的一些操作),就会用到地图坐标与屏幕坐标的转换。
总之,坐标之间的转换在具体的应用场景中是非常重要的,尤其影响各个地物之间在不同坐标系之间的展现形式。