一、局部空间

又称模型空间,即对象被创建时,所在的空间

例如我们用模型软建(ZBrush、Blender、3DMax等)创建了一个龙的模型,那么它在创建的时候,就处于它的局部空间内,一般来讲,模型的中心即局部空间的中心(0, 0, 0),如果我们这里说龙的眼睛的坐标为(2.2, 1.5, -2),那么也就是这个龙的眼睛相对于自身的中心,偏移量为(2.2, 1.5, -2)

就如下图,一个球体和一个正方体,它们都处于各自的局部空间,并且中心都在(0, 0, 0)的位置

在 Unity3D 中,一个物体 Transform 组件上的属性都是其在父物体的模型空间下定义的,如果没有父物体就是在世界空间下定义

二、世界空间

如果我们将所有的对象导入到程序当中,它们就有可能全部挤在世界的原点上(0, 0, 0),然而这并不是我们想要的结果,我们想要为每一个对象分配一个合理的位置,世界坐标即是如此

如下图,我们为正方形分配了一个坐标(0, 0, 0),球体分配了一个坐标(2, 0, 0)

那么上面的坐标(2, 0, 0)和(0, 0, 0)就是物体相对于(游戏)世界的位置

  • 我们一般所说的坐标,往往都默认是世界坐标

对象的坐标通过M:模型矩阵(Model Matrix),来完成局部坐标到世界坐标的转换的,还记得上一章所说的位移、缩放、旋转矩阵嘛,这里的模型矩阵也可以说是一种转换矩阵

三、观察空间

在现实世界中,观察空间即我们眼睛所看到的空间,也就是视觉空间

在游戏世界中,观察空间即以摄像机为原点的空间,也就是摄像机空间

很明显无论是摄像机还是我们的眼睛,本质都是将对象的世界空间的坐标转换为观察者视野前面的坐标,也可以这样理解,游戏世界中的摄像机 = 我们的眼睛

如下,世界中有3个物体,但只有正方形和球在摄像机的范围内,图2就是摄像机所见的空间

世界空间到观察空间的变换就相对复杂一点,但是本质上是相同的,通常是由一系列的平移和旋转的组合来平移和旋转场景从而使得特定的对象被转换到摄像机前面,这些组合在一起的转换通常存储在一个V:观察矩阵(View Matrix)里,用来将世界坐标转换到观察空间,在Unity3D中,五大基础空间仅有观察空间为右手坐标系

四、裁剪空间

在一个顶点着色器运行的最后,所有的坐标应该都在一个给定的范围内,这部分的坐标将变为屏幕上可见的片段,这个范围即是裁剪空间(Clip Space)任何在这个范围之外的点都会被裁剪掉(Clipped),也就是被忽略

为了将顶点坐标从观察空间转换到裁剪空间,我们需要用到投影矩阵

投影矩阵首先会将所有顶点坐标从观察空间变换到裁剪空间,然后,这些顶点会被再次变换到标准化设备坐标(normalized device coordinates/ NDC space),即(-1, 1)这个范围,所有在在范围(-1, 1)外的坐标都不会被绘制出来并且会被裁剪,这一步是通过用用裁剪坐标的分量除裁剪坐标实现的,这个操作被称为透视划分(Perspective Division),在透视划分之后,就没有  这一分量了,透视划分由OpenGL自动计算

  • 如果只是片段的一部分例如三角形超出了裁剪体积(Clipping Volume),则OpenGL会重新构建三角形以使一个或多个三角形能适应在裁剪范围内
  • 目前为止,仅有透视投影会使得最后的 分量不为1,并且这个  分量刚好对应着投影边界

正射投影和透视投影

再回到摄像机,可以从上面的图中看出,摄像机前有一个白线范围,这便是由投影矩阵创建的观察区域(Viewing Box),也被称为平截头体(Frustum),很显然,每个出现在平截头体范围内的坐标都会最终出现在用户的屏幕上

投影矩阵将观察坐标转换为裁剪坐标的过程有两种不同的方式(通过不同的投影矩阵),分别为正射投影(Orthographic Projection)和透视投影(Perspective Projection),如下:

正射投影异常的简单,其平截头体就是一个标准的立方体

透视投影的平截头体是个锥体,这也是现实生活中,人眼睛的视线范围,在这种投影方式下,同样的物体离摄像头(眼睛)越近,它就会显得越大,这种效果也被叫做为透视(Perspective)

关于P:投影矩阵(Projection Matrix)的计算可以参考这篇文章:中文版、原文

可以利用glm直接生成对应的投影矩阵:

  • glm::ortho(l, r, x, y, A, B):创建一个正射投影矩阵,第1~2个参数指定了平截头体的左右坐标,第3~4参数指定了平截头体的底部和上部坐标,通过这四个参数我们定义了近平面和远平面的大小,第5~6参数为近平面和远平面的距离,刚好这6个参数制定了一块立方体区域
  • glm::perspective(, p, A, B):创建一个透视投影矩阵,第1个参数为视锥体的开放角度,也被称为视野(Field of View),对于一个真实的观察效果,它的值一般默认都是45°,第2个参数为宽高比,由视口的高除以宽(width/height),第3~4个参数设置了平截头体的近和远平面,一般默认设置近距离为0.1而远距离设为100,所有在近平面和远平面的顶点且处于平截头体内的顶点都会被渲染。

五、屏幕空间

可以看出来,这也是一条坐标变换的流水线,我们将所有顶点转换为片段之前,顶点会处于的不同的状态空间中

整合的最终公式为:

经过上面的计算后,顶点就会被赋予顶点着色器中的gl_Position并且OpenGL将会对其自动进行透视划分和裁剪,并在完成后映射到屏幕空间(由glViewport设置)且被转换成片段,在此每个坐标都会关联着一个屏幕上的点(像我们平时的2k屏就是2560 * 1440)

M:模型矩阵(Model Matrix) + V:观察矩阵(View Matrix) + P:投影矩阵(Projection Matrix) 正是著名的 MVP 矩阵

OpenGL基础11:空间相关推荐

  1. OpenGL基础46:切线空间

    到这里,关于OpenGL基础的了解要接近尾声了,上一个节点是<OpenGL基础25:多光源>.在此章之后,学习openGL的各种教程的同时,可以转战想要了解的渲染引擎,也可以去github ...

  2. OpenGL基础29:深度测试

    前置:OpenGL基础11:空间 一.深度测试 在 OpenGL基础13:第一个正方体 这一章中,就开始用深度测试了 深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一 ...

  3. OpenGL基础12:进入3D世界

    前置:OpenGL基础11:空间 一.坐标系 我们都学过坐标系,根据z轴的方向,一般有两种不同的坐标系表示方法: 其中拇指是x轴正方向,食指是y轴正方向,中指是z轴正方形 OpenGL约定是右手坐标系 ...

  4. OpenGL基础45:光照矫正(下)之Gamma校正

    接上文:OpenGL基础44:光照矫正(上) 四.Gamma矫正 4.1.人的视觉特性 和很多错视图一样,对于下面这张灰阶图,如果1表示纯白,0表示纯黑,那么这张图片的哪个位置代表的是0.5,也就是自 ...

  5. OpenGL基础图形编程

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  6. OpenGL基础知识介绍和简单使用

    OpenGL基础知识介绍 OpenGL简介 OpenGL 专业词解析 1.OpenGL上下文[context] 2.渲染 3.顶点数组和顶点缓冲区 4.着色器程序Shader 5.顶点着色器(Vert ...

  7. OpenGL基础编程

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  8. 【转】OpenGL基础图形编程(一)

    原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html  分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...

  9. OpenGL基础图形编程(转)

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

最新文章

  1. Oracle RAC系列之:利用srvctl管理RAC数据库
  2. 2021-09-23对图像深入研究
  3. 网络营销外包专员浅析网站网络营销外包如何快速获取关键词排名
  4. 蒙版遮住全屏(包括导航栏)
  5. 小程序 const moment = require('moment')_C++大作业-XXX管理程序
  6. uva 10534——Wavio Sequence
  7. 从网络访问计算机不能添加用户名,windows7 和 XP 能互相用\\ip访问,但是不能通过计算机名访问...
  8. windows eclipse python环境搭建
  9. jQuery用户从服务器端注册登录
  10. Ceisum官方教程1 -- 开始
  11. WebRAY创业启示录:从小公司到隐形的巨人
  12. [How to] ROOT, Backup Flash (MTKDroidTools, Spflashtool, CWM)
  13. Hadoop KMS 透明加密配置以及测试
  14. 如何卸载冰点还原精灵
  15. adb 查看手机闪存类型
  16. 一行代码调节屏幕亮度
  17. [附源码]Python计算机毕业设计调查问卷及调查数据统计系统
  18. oracle cpu使用率高怎么排查解决,OracleCPU占用率较高的处理方法
  19. 终端图像处理实践:AR全景动态贴纸方案简介
  20. C语言递归(pta递归求简单交错幂级数的部分和)

热门文章

  1. python语言-python语言的有何特点?
  2. 自学python好找工作么-学习python后好找工作吗
  3. Git创建分支并上传~满满的干货哦
  4. 登录状态 token
  5. js里css不起作用,CSS文件在NODE js中不起作用
  6. echart 饼图标题title的详细参数配置
  7. 递归处理汉诺塔问题(c++/python)
  8. LeetCode 516 最长回文子串
  9. oracle联机文档使用,Sqlplus 联机文档学习
  10. r语言和python的区别_c语言和python的区别