三维空间中的几种坐标系

为什么我们需要多个坐标系统呢?任何一个坐标系统都是无限的,包括了空间中的所有点。所以,我们用任意一个坐标系统,然后规定它是“世界空间”,然后所有的点位置都可以用这个坐标系统来描述了。难道就不能更简单点了么?实践证明的答案是不能。很多人发现在不同的场景下使用不同的坐标系统更方便。

使用多个坐标系统的原因是,在一个特定的场景上下文中,可以拥有一份确定的信息。也许整个世界上的所有点都可以在一个坐标系里表示,然而,对于一个确定的顶点a,我们可能不知道它在世界坐标中的位置,但是我们可能可以明确它在相对于某些坐标系统中的位置。

比如,有两个相邻的城市A,B。A城市聪明的居民们在代价公认的一个城市的中心建立了坐标原点,然后用罗盘所指的方向来作为坐标轴,而B城市的居民可能在他们的城市中一个任意的位置建立了坐标原点,然后然坐标轴的方向在一个任意的方向,两座城市的居民都觉得他们各自的坐标系统十分便利。然而,这时候有一名工程师被分配了一个任务,要求他在两个城市之间建立第一条公路,而且需要一个地图来清楚地看两个城市以及城市间的所有细节。因此引入了更为便利的第三坐标系,这个坐标系对于两座城市的居民没有任何影响。两座城市中各自的坐标点都需要从本地坐标转换成新的坐标系的坐标来绘制新地图。

在今天开明的时代,我们习惯于在媒体上听到文化相对主义,这促使人们认为,认为一个文化或信仰系统或国家议程优于另一个文化或信仰系统是不正确的。 将想象力扩展到我们所谓的“转换相对主义”并不是太大的飞跃,即没有地方或方向或坐标系统被认为优于其他方面的论点。 在某种意义上,这是真的,乔治·奥威尔解释:“所有的坐标系统被认为是平等的,但有些是比别人更平等”。现在让我们看看一些在3D图形中常见的坐标系统。

     不同的坐标系统都是有必要的,因为只有在一些特殊的场景下这些信息才是有意义和可以使用的。在这一节,将会有一些公共坐标系的例子。

世界坐标系(World space)

作者写这本书的时候在芝加哥。有一个确定的经纬度,这个经纬度是绝对的,所以,你并不需要知道芝加哥在哪里,不需要芝加哥在美国,因为这个经纬度是绝对的。在这个世界上,人们规定经度是0的地方在格林尼治天文台,纬度为0的地方在赤道。

(有一些好奇的读者可能意识到这个经纬度的坐标系并不是笛卡尔坐标系了,这是一种其他的坐标系,但是对于这次我们讨论的话题没有什么影响,我们生活在一个二维的平面上,就是地球的表面,只不过这个平面是包裹在一个球的外层的。)

世界坐标系是一个特殊的坐标系,它建立了一个全局的场景,有了这个全局的坐标系,其他的坐标系统就可以被确立了。换句话说,我们可以把在其他坐标系中的点转成世界坐标系来表示。但是我们不能用更大的坐标系来表示和包括世界坐标系了。

在非技术的角度来看,世界坐标系是建立一个我们关心的最大的坐标系统,但很多情况下这并不是整个世界,举个例子,如果我们希望渲染一个笛卡尔坐标系中的一个画面,我们会真实用到的笛卡尔坐标系就是“世界”,我们没必要关心这个世界坐标系被定位在哪里,甚至它是否存在于真实的世界中。

我们之前说了世界坐标系是用来描述点的绝对坐标的。希望你听到这样的说法的时候耳朵有些刺痛,因为你知道这不完全是真理。我们这里说的绝对坐标是指的在这个我们刚定义的最大的坐标系统中的坐标,而不是在真实的世界中的坐标。就比如之前所说的,你可能知道你现在的位置的经纬度,但是放眼整个宇宙,假设把世界坐标系的原点放在整个银河系的中心的时候,怕是没有人能说出来自己的确切位置了。

世界坐标系在很多时候也被叫作全局坐标系和宇宙坐标系。

物体坐标系(Object spce)

物体坐标系是关联了一个指定的物体,每一个物体都有一个独立的物体坐标系。当一个物体移动旋转改变了它的朝向,那么与这个物体关联的物体坐标系也随之改变了,也一起改变了朝向。比如,我们都带着自己的坐标系统,如果我们对你说“向前走一步”,我们给了你一个相对于你自己的物体坐标系的指令(请原谅我们把你说成是一个物体,其实你知道我们想表述的意思的)。我们没办法描述你要移动的绝对方向,你可能会向北移动,也可能向南移动,这些“向前”,“向后”,“向左”,“向右”对于一个物体坐标系是有意义的。当你驾车的时候,有的人给你一些指示,有时候告诉你“向左转”,还有的时候告诉你“向东走”。“向左走”是对于一个物体坐标系的,而“向东走”呢,是对于世界坐标系来说的。

位置和方向在物体坐标系也是可以被明确的。比如,当我问你你车上的杯子在哪里,你不会说在芝加哥,甚至不会说在哪条街道,在这种情况下,如果回答是一个相对于全局的位置是没有意义的,我当然希望的是你能说清楚你的杯子位于你的车的物体坐标系的哪里。

在图形学中,物体坐标系又被称作模型坐标系(model space),因为模型的顶点都是在这个模型坐标系中表示的。物体坐标系也被广泛用于物理中,比如,用身体的中轴线来当坐标轴。

相机坐标系(Camera Space)

有一个比较特殊的物体坐标系就是相机坐标系,这个坐标系是我们的视点用来渲染看到的场景所用的坐标系。在相机坐标系中,相机一直处于相机坐标系的原点,+x的方向是向右的,+z的方向是向前的(向屏幕里的方向,因为使用的是左手坐标系),+y的方向是向上。这里的像上不是世界坐标的正上,而是一个相机的上方向。可以来看一下这个相机坐标系的图片。

    

这里要注意一些细节,相机的坐标是三维空间,而我们在屏幕上看到的是二维的。因为我们是做了一个映射,把三维空间的东西映射到了一个二维的平面上,这个映射就是大家知道的“投影”了。

时间: 2024-10-02 08:48:46

三维空间中的几种坐标系的相关文章

Unity3D的四种坐标系

[Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. 2.Screen Space(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的.注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕

三维空间中如何寻找和一组给定直线垂直程度最高的直线

这是个挺有意思的小问题,给定一组直线(至少两条不平行),希望能找到和这组直线尽可能垂直的直线.打个比方,比如在三维空间中,如下图(forked from wiki) a和b分别是在一个平面上不平行的两条直线上,那么显而易见与a和b所在直线垂直程度最高的就是与a和b俩俩垂直的竖线,也就是叉积axb方向平行的直线.两条直线可以用叉积,那么多于两条的情况呢?想象如果又有了一条直线,其一端的方向可以用向量c表示,如果c和a.b在一个平面上的话,那么好办,还是axb,或者bxc也行:但是如果c和a.b不在

Unity3D的三种坐标系

来自:http://blog.csdn.net/luxiaoyu_sdc/article/details/13168497 1, World Space(世界坐标): 我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. 2, Screen Space(屏幕坐标): 以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的. 注:鼠

【Unity3D的四种坐标系】

1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. 2.Screen Space(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的.注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouc

Android中的11种传感器

在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. ? 1 2 3 4 5 6 7 8 9 10 11 #define SENSOR_TYPE_ACCELEROMETER       1 //加速度 #define SENSOR_TYPE_MAGNETIC_FIELD      2 //磁力 #define SENSOR_TYPE_ORIENTATION         3 //方向 #define SENSOR_TYPE_GYROSCOPE   

Android用OpenGL ES2.0显示YUV数据,在手机上需要两种坐标系的解决方案

如题 ,不知道大家看懂了这个题目没有,给个链接:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下称链接①), 里面评论有很多人提到了这个问题,我也是其中一员,但是问遍了所有人,自己也发帖(http://bbs.csdn.net/topics/390769358) 寻求解决方案,却终究没能得到一个可用的方案. 从2014年4月中旬遇到这个问题,纠结了两个多星期,终于在看了好多好多资料之后,于4月的最后一个周一,暂时解决了这么

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来