2019独角兽企业重金招聘Python工程师标准>>>

接触3D程序设计,难免要认识各种坐标系统,并在各个系统之间进行转换,直接使用程序代码实现公式是个方法,然而3D的世界中经常运用矩阵运算,因此,认识齐次坐标也是必备的,因为,这不单只是数学,与程序代码本身的效率也有很大的关系!

这是左手还是右手?

在3D世界中,最常运用的是直角坐标,然而却有多种不同的表示方式,也就是X、Y、Z轴正方向会有各自不同的表示,软件或链接库可能采用不同系统,这是种困扰,然而木已成舟,开发者只能在运用链接库之前,先分辨它们到底采用哪个系统,粗略来说,直角坐标系统可以分为两种:左手坐标(Left-hand Coordinate)、右手坐标(Right-hand Coordinate)。

对于前者,把左手拿出来,姆指指向若符合X轴正方向,食指符合Y轴正方向,而掌心往上符合Z正方向的话,那么该系统是采用左手坐标,例如,WebGL裁剪空间(Clip Space)就是左手坐标系统;对于后者,就是把右手拿出来,姆指与食指对应X、Y轴后,看看掌心往上是不是符合Z轴正方向,如果是的话,就是采用右手坐标,例如glMatrix、Three.js就属于这类右手坐标系统。如果你一开始设计3D对象时,是采用左手坐标,然而接下来想要套用glMatrix呢?表面上看来,右手坐标似乎只是将Z轴正方向反过来,对glMatrix是如此,然而对其他链接库或软件就不一定了。

例如,OpenSCAD、Blender是右手坐标,然而,它的X、Y是代表2D平面,Z代表高度,也就是说,同为右手坐标系统,还是要注意一下三个轴各自的意义为何;至于3D雕塑软件的部份,似乎偏好左手坐标,例如:Sculptris、SculptGL,不过,它们的z轴正方向是朝上,而不是像WebGL裁剪空间的z轴代表深度。左手坐标或右手坐标的差别,会影响到坐标转换时导证出来的公式结果,如果试图结合两种不同系统的链接库,就必须自行实作转换,不然绘制出来就会是错误的画面。例如,一个右手系统的(x,y,z)要换成左手系统的话,并不是只有(x,y,-z)一种转换方式,(−x,y,z)、(x,−y,z)、(−x,−y,z)、(−x,y,−z)、(x,−y,−z),也都是转换为左手坐标的可能方式。

这是哪个空间?

刚开始接触WebGL时,至少会接触两个空间:裁剪空间与屏幕空间(Screen Space)。对WebGL来说,屏幕指的就是Canvas,基本上,若顶点正确出现在裁剪空间中,WebGL会自动处理屏幕空间的绘制,不过,如果要处理像鼠标点选的问题时,就必须处理绘图坐标至裁剪空间的转换问题。要绘制的几何对象是由一组顶点定义,虽然裁剪空间是左手坐标,然而这组顶点可以基于左手或右手坐标定义,也就是说顶点定义在一个独立的对象空间(Object space),或说是局部空间(Local Space),这个空间有个独立原点,顶点都是相对于该原点而定义。接着,我们会缩放、转动、移动这些几何对象,实际上这些转换动作,是将这些对象中的顶点,转换至世界空间(World Space)。也就是开发者建构的3D世界,在世界空间中可能有许多对象,然而可能只想绘制出某范围内的对象,这就像是有个相机,世界很大,然而,只有相机内看到的范围才会被绘制出来,这个范围称为观察空间(View Space)。

开发者可能会用左、右、上、下,以及近面、远面边界,来定义观察空间,而观察空间会透过一些计算,对应至裁剪空间,这个过程称为投影,常见的作法有正交投影或透视透影──正交投影不会创造出远近感,然而,透视透影会因为视体(Viewing frustum)的视场角度(fov)等参数不同,呈现出不同的远近感。简单来说,从对象空间、世界空间、观察空间一直到裁剪空间等,必须经过多个空间转换,才能顺利地绘制出想要的3D对象,这些转换,说穿了,就是一连串的线性转换数学公式,然而,透过矩阵运算的话会更好,因为这会牵涉到程序运算时的效率问题。

这是点还是向量?

若要透过矩阵运算来执行空间转换,此时,就不得不接触齐次坐标(Homogeneous coordinate)。多半的说词是,齐次坐标在进行仿射转换(Affine Transformation)时很方便,像是混合缩放、转动、移动等操作的转换时计算方便,不过,实际上,齐次坐标还可以用来区别点与向量的差别。若单纯只使用直角坐标,(a, b, c)会是代表什么呢?一个点?一个向量?谁知道!

使用齐次坐标的话,(a, b, c, 1)表示这是个点,而(a, b, c, 0)表示是个向量。至于为什么会这么定义,事实上,这会牵涉到一些线性代数的基础,有兴趣的话,我们可以看看〈Understanding of homogeneous coordinates〉(https://bit.ly/2KECitX)。齐次坐标用第四个分量来代表点,这表示直角坐标中的同一个点(Px, Py, Pz),与之对应的齐次坐标可以有无数个,也就是说(1, 2, 3, 1)、(2, 4, 6, 2)、(3, 6, 9, 3)等都代表着同一点(1, 2, 3),也就是说,对于齐次坐标中的点(Px, Py, Pz, w),对应的直角坐标点是(Px/w, Py/w, Pz/w)。

这就表示,当转换公式涉及某分量的除法时,透过齐次坐标可以化为矩阵运算。例如,公式转换中,若x'=near*x/z,y'=near*y/z,z'=z,就可以用齐次坐标[near * x, near * y, z, z]来表示;也就是说,计算用的矩阵若以列为主(row-major)撰写的话,会是[near, 0, 0, 0, 0, near, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0]。一旦线性转换公式可以化为矩阵运算,那么,就能将各种转换予以组合,最后得到一个矩阵,也就是说,若打算进行缩放、旋转、平移等n个转换操作,对象是1,000个顶点,直接用函式实作个别转换公式的话,必须进行n*1000的呼叫;相对地,如果使用一个结合了n个转换的矩阵,就只需要1,000次计算,若转换对象是图像的像素的话,这样的差异会更为惊人。

不是都有链接库/框架吗?

是的,3D程序设计也会有现成的链接库或框架,来做这类的转换操作,然而,别以为这样,就可以轻松了事。最起码,还是要先搞清楚它采用的坐标系统,以及相关的参数意义,最好的方式,是亲自导证一次缩放、旋转、平移、投影等矩阵等是怎么来的,这会让开发者在转换坐标系统时,更为得心应手。对齐次坐标与矩阵转换有兴趣的话,不妨可以看看〈Interactive guide to homogeneous coordinates〉,该文从程序人的角度,提供互动的方式,来协助你认识齐次坐标与矩阵转换。别以为这只是数学,正如该文中所谈到的:「认识选择的框架背后的数学,写出来的程序代码才会有效率」。

转载于:https://my.oschina.net/u/4024424/blog/3051735

3D程序设计离不开各种坐标系统相关推荐

  1. 2019033期3d计算机开机号,3D历史120期开奖

    3D历史120期开奖以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 1.求福彩3D的历史,开机号,试机号,开奖号 福彩3 ...

  2. 关于Java面向对象程序设计原则之一——开闭原则的思考与分享

    整理日期:2022-05-27 目录 一.开闭原则 二.为什么使用开闭原则 三.如何在程序设计中体现开闭原则 一.开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件 ...

  3. Ogre 3D程序设计 Ogre材质1

    "材质(material)",材质是一个很基本的术语,表示你的物体对光的反射方式.但是对它的实现并不像其解释这样简单,我们会用这一章节进行详细地介绍Ogre中相关的技术. 我们刚才 ...

  4. 【python练习题】随机生成福彩3D号码,模拟开奖并判断是否中奖

    今天学习完,随手练习了下函数的的定义,说说要求: 输入要购买彩票的数量,模拟福彩3D的号码的生成,模拟彩票开奖情况,并判断是否中奖,中奖后中奖号码的数量,及中奖金额. 说说思路: 1.定义生成彩票的函 ...

  5. Allegro17.3导出3D为何打不开?

    Allegor导出3D,而proe软件却无法解析? 解决方法: 1. 高版本Allegro PCB,在Board Geometyr出了需要设计好outline层,还需要设置好 Design_outli ...

  6. php输出3d彩票号码,3D彩票开出罕见“豹子号“!彩票中心要“赔钱”

    原标题:3D彩票开出罕见"豹子号"!彩票中心要"赔钱" 3D彩票新年第一期开奖就给彩民带来了"惊喜"!2月11日晚,3D彩票19035期开奖 ...

  7. 3d游戏编程(转帖)

    3d游戏编程(转帖) 我先声明,我不是编程高手,我还只是个初学者,但我觉得我所知道的对刚入门3D游戏编程的新手,应该能让他们少走弯路,我也很想用朝语来写,但是朝语的词 汇库很久没有更新过了,有些专业的 ...

  8. OGRE 3D 1.7 Beginner‘s Guide中文版 第一章

    文章来源:http://www.cnblogs.com/oneDouble/articles/2492648.html 这是一本优秀的书,这个中文版也是极好地,译者是我QQ群里的网友,陆陆续续用一年翻 ...

  9. [转载]OGRE 3D 1.7 Beginner‘s Guide中文版 第一章

    这是一本优秀的书,这个中文版也是极好地,译者是我QQ群里的网友,陆陆续续用一年翻完,却没有多少人看到,因为最近发现ogre3d.cn关门大吉了,谷歌了一下更没有第二家转载,我心想,哎呀,这么好的东西以 ...

最新文章

  1. 开源FPGA硬件模拟游戏机,原汁原味的复古游戏体验带你回童年
  2. Mozilla 扩展开发环境设置
  3. (转)更新Java final常量后,请重新编译你的class
  4. 使用PM2搭建在线vue.js开发环境(以守护进程方式热启动)
  5. 一键快速生成 Vue 的 HTML页面结构代码
  6. 文本框为空按钮不可点击
  7. 实用的 Python 之 feedparser
  8. [C++]最大连续子序列乘积
  9. 分别采用线性LDA、k-means和SVM算法对鸢尾花数据集和月亮数据集进行二分类可视化分析
  10. 扫雷游戏(实现了网页版的扫雷游戏的所有逻辑)
  11. 西部数据硬盘官网查询
  12. 干部档案管理系统wxpython+mysql
  13. 马蹄集------函数的幂
  14. Vant_根据已有地址获取code
  15. JAVA学习笔记——BLOB类型和数据批量操作
  16. 在 Linux 下安装 GNU ARM 工具链
  17. 物联网SIM卡和SIM卡真的不是一回事
  18. OTA市场寡头竞争态势严峻,同程艺龙赴港IPO能否改变现状?
  19. Express Pi 嵌入式开发板
  20. 微信红包算个毛 ——微信红包,仅仅是个游戏?!

热门文章

  1. 水星路器服务器无响应,联想M720Q、光网卡、Pon stick、Openwrt我的完美软路由折腾记...
  2. ftp匿名登录 漏洞复现
  3. 京东商品3D展示怎么做?
  4. 解决光纤猫恢复出厂功能后的上网问题
  5. pygame鼠标进行拖拽移动图片、缩放、以及按钮响应 案例
  6. WC2015简短感想
  7. 讯时网站管理系统通杀0DAY漏洞
  8. SSL-ZYC 最小步数
  9. 服务器带宽10M能带多少人同时访问之并发数计算
  10. 微信小程序开发什么工具好?