坐标系统和glMatrix(GLM)

文章同时发布于:个人网站.

这篇文章是接矩阵变换系列文章的,说明各类变换矩阵在一般用于3d图形学程序的什么阶段,如何去使用。如果还没有看过之前的矩阵变换,可以在以下地址访问:

  • 3D图形学中的矩阵变换(一):http://pengfeixc.com/blog/60a7492be97367196dce3eef

  • 3D图形学中的矩阵变换(二):http://pengfeixc.com/blog/60b1b739e97367196dce3ef4

  • 3D图形学中的矩阵变换(三):http://pengfeixc.com/blog/60baf9aae97367196dce3ef6

一. 五个坐标系和四个变换矩阵

在写一个稍微复杂的图形程序中,我们并不是一开始就是将所有的物体都放在同一个坐标系中处理的。就像设计人员在使用建模软件的时候,会将一个复杂世界中的物体单独设计,等所有东西都设计好后,在放置到同一个世界(坐标系)的不同位置,例如设计一个房间,房间内有桌子、椅子、电脑、人等等。设计师会先给房间内每一个物体建模,当设计椅子模型时,椅子所在的坐标系就是一个独立的坐标系,我们认为椅子所在的位置为这个独立坐标系的原点,同理桌子、电脑和人等其他模型也是在他们各自的坐标系中建模的。我们将这些物体单独建模的时候的这些坐标系称之为他们各自的局部坐标系。等所有模型都建好后,设计师会将这些模型移动到同一个场景中(另一个坐标系),这些模型在同一个模型中都有不同的位置,此时这个大家共同存在的场景坐标系,被称作为世界坐标系。

肯定有人要问了,为什么要这么操作,为什么不一开始就在同一个场景同时设计所有的模型,而是在不同场景设计不同的模型再放到同一场景呢?想像一下,如果工程很复杂,设计师在同一个场景,同时设计所有模型,那难度是不是增加太多,因为在同一个场景下给桌子建模的时候可能会影响到椅子模型,这大大增加了难度,而如果我们分开在不同场景设计不同的模型,模型之间互不影响,等设计好后,只需要移动到同一场景下。这样最后实现的场景是一样的,利用分而治之的思想,这大大简化了工作难度,这不是很好吗?

上面描述的过程,将不同的模型从它们所在的局部坐标系移动到同一个世界坐标系,就需要借助变换矩阵来完成了,我们将这个变换矩阵叫做模型矩阵。一般在一个图形应用中会存在以下五个坐标系和四个用于坐标系转换的矩阵:

  • 局部坐标系(局部空间):不同模型各自所在的坐标系。可以通过模型矩阵,将局部坐标转换为世界坐标。

  • 世界坐标系(世界空间):所有模型处在同一个场景中的坐标系。通过视觉矩阵,转换为视觉坐标系。

  • 视觉坐标系(观察空间):观察空间坐标系,用来模拟人眼(摄像机)在不同位置看向场景中某个位置,所看到的场景。坐标系原点是人(摄像机)所在的位置。

  • 裁剪坐标系(裁剪空间/标准设备空间):坐标到达观察空间后,我们需要将其转换到裁剪空间。我们知道opengl/webgl的裁剪空间为-1~+1,所以剪裁坐标会被处理再这个范围内,并判断哪些片段将会出现在屏幕内。裁剪空间也被称为标准设备空间(NDC)。

  • 屏幕坐标系(窗口空间):最后,我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段。

以上所有坐标系都是三维的,可以从窗口空间逆向转换到前面的坐标系。只有标准设备空间坐标系是左手坐标系,其z轴,向屏幕外为负,向屏幕内为正。

关于坐标系统之间的转换矩阵,我在前面的矩阵变换系列的文章里都已经讲解过了。在3D图形学中的矩阵变换(一),讲解了基本的平移、旋转和缩放,可以用于构建模型矩阵, 将局部坐标转换为世界坐标。在3D图形学中的矩阵变换(二),讲解了lookAt矩阵,可以用于构建view矩阵,将世界坐标转换为观察空间坐标。在3D图形学中的矩阵变换(三)中讲解了投影矩阵,可以将观察空间变换为裁剪空间。

最后还有一个屏幕空间, 屏幕空间也是三维的,x从左向右,y从上到下,z从外到里,z的可见范围是[0, 1], 0离我们最近的近平面,1是离我们最远的远平面。知道光标位置和深度z值,可以通过逆变换得到前面任意坐标系的值,在进行物体选择的时候用得到。关于屏幕空间暂时,我不拓展开讲解,这个留到后面。

二. glMatrix和glm

关于图形学用到的变换矩阵,你可以自己写,也可以利用一些现有的库。作为初学者目前我只用过glm和glMatrix。如果你是学opengl的,可以使用glm,如果是webgl,可以使用glMatrix。它们都是三维图形的数学库,里面提供了生成矩阵的一些函数,使用方法差不多,只是基于的语言不一样。还要其他的library,暂时没用过,也没有去了解过。可以在以下地址,获取它们。

glMatrix:https://glmatrix.net/

glm:https://glm.g-truc.net/0.9.8/index.html

本节内容旨在讲解,如何按照一定的模式去构建一个三维场景。我认为这也是学习图形学最重要的,也是最基础的一些内容吧。

我在3d俄罗斯方块中,就是用了矩阵变换思想,感兴趣的可以再下面地址中试玩,界面右上角图标可以获取源代码。

3d-tetris: https://mini.pengfeixc.com?dir=3d-tetris。

坐标系统和glMatrix(GLM)相关推荐

  1. SVG中的坐标系统和坐标变换

    视野和世界 2D绘图中很多人会有一个误区,就是我绘图的区域是一个矩形区域.无论新建一个画布还是创建了一个容器,心里都想象里面有一个矩形区域.其实,在SVG当中,矩形区域只是视野,是我们看到的部分.实际 ...

  2. 坐标系统和投影变换基础知识及其在ArcGIS桌面产品中的应用(二)

    坐标系统和投影变换在ArcGIS桌面产品中的应用 在我们了解了坐标系统和投影的定义和其内在的联系后,本文着重总结一下坐标系统和投影变换在桌面产品(版本9.2)中的应用(分ArcMap.ArcCatal ...

  3. Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  4. ArcGIS中的坐标系统和投影变换

    ArcGIS中的坐标系统和投影变换 主要内容 一.地球椭球体(Ellipsoid) 二.大地基准面(Geodetic datum) 三.空间参考系统(Spatial Reference) 四.坐标系统 ...

  5. 现代opengl 设计入门,坐标系统和立方体的纹理贴图

    本文在 现代opengl 设计入门,纹理贴图 一文的基础上,引入opengl坐标系统,实现立方体的纹理贴图.介绍了opengl 的5个空间,3个变换矩阵.如果看这部分介绍比较繁琐,可以直接看看效果图, ...

  6. 05——svg的坐标系统和坐标系

    一.什么是svg的坐标系统 众所周知,数学上的坐标系统,大部分是指 笛卡尔直角坐标系 并且:x轴 向右,y轴 向上,角度为 逆时针 在svg中,坐标系统同样也是笛卡尔直角坐标系,x轴 向右 但是:y轴 ...

  7. GPS研究---GPS 坐标系统和时间系统

    1.坐标系统 在 GPS 测量与应用中,通常采用的坐标系统有两大类.一类是地球坐标系, 该类坐标系是固结在地球上的,随地球一起转动,又称为地固坐标系(CTS). 第二类是天球坐标系,该类坐标系与地球自 ...

  8. 3D空间中的点坐标转化为屏幕二维点坐标(一)

    每个人在进入计算机图形学的世界中,都有一个同样的困惑,三维世界中的三维坐标是如何被转换成屏幕上的二维坐标的,我如何在屏幕上找到一个点(二维点)对应三维世界中的点(三维点)呢? 要理解其中的过程,对学习 ...

  9. arcgis 坐标系 2000坐标系_干货 | 关于投影和坐标系那些事,你是否都已还给了老师?...

    很多新接触GIS的人员对地图投影以及坐标系统很难理解,甚至做GIS开发做了好几年的人也有这方面的疑惑,地球仪式的地图是如何变成纸上的平面地图的?平面的二维地图是如何在三维GIS里面进行展示的,因为三维 ...

  10. 双球坐标系_2.1 天球坐标系和地球坐标系

    <GPS定位原理及应用>授课教案 第二章 坐标系统和时间系统 2.1天球坐标系和地球坐标系 教学内容: 本节主要介绍天球坐标系.地球坐标系和卫星测量中常用的坐标系的建立方法. 教学重点: ...

最新文章

  1. Non-ASCII character '\xe6'
  2. request、response 中文乱码问题与解决方式
  3. image vb6 图片自适应_请问如何实现图片在窗体上的大小自适应?
  4. 猜数字游戏python程序用函数guesssecret_python实现猜数字游戏
  5. 在python中查看关键字、需要执行,如何在一个文本文件,二进制执行搜索来搜索一个Python关键字?...
  6. 使用element-ui中的container布局容器
  7. tomcat,tomcat7配置https
  8. 数据库系统在计算机系统中的地位与作用,浅谈数据库设计在系统设计中的重要性...
  9. 群晖ds3617xs_23739虚拟机安装与半洗白教程
  10. 阴历阳历的相互转换(支持1900~2100年)
  11. matlab数值分析作业答案,Matlab作业3(数值分析)答案
  12. .dSYM文件的生成
  13. 《自己动手写爬虫》笔记
  14. win10家庭版升级到企业版
  15. VS2017社区版离线安装
  16. x509证书,SSL详解
  17. 1周前,一个对外挂一无所知的人,在的成长过程(经典推荐)
  18. JUCE小白求教VS2019-C1083无法打开包括文件
  19. google 输入栏不显示历史搜索记录方法
  20. java 判断手机号_如何用java判断手机号运营商?

热门文章

  1. Hash散列算法详细解析(六)
  2. 【思考】关于英语论文写作的底层逻辑思考
  3. 汉语语法和英语语法的区别
  4. 《阿凡达》重夺全球影史冠军;区块链或推动“疫苗护照”国际互认 | 美通企业日报...
  5. python实现whois查询_python3实现域名查询和whois查询
  6. Windows中获取用户密码
  7. 英特尔cpu天梯图排名(附台式机CPU天梯图2022年3月份最新版精简图)
  8. 复化科特斯公式matlab_【原创】牛顿-柯特斯数值积分公式及其MATLAB的实现
  9. 冷山的博客思听书摘索引页
  10. 实现一个内存池管理的类