在OpenGL中有两个重要的投影变换:正交投影(Orthographic Projection)和透视投影(Perspective Projection),二者各有对应的变换矩阵。初学者比较难理解这两个矩阵是怎么来的。本文从数学角度来反向推导两个投影矩阵。

推导的思路

正交投影和透视投影的作用都是把用户坐标映射到OpenGL的可视区域。如果我们能根据二者的变换矩阵来推出最终经过映射的坐标范围恰好是OpenGL的可视区域,也就是反向推导出了这两个投影矩阵。

OpenGL的可视区域的坐标范围是一个边长为2的立方体。每个维度上的大小是2,范围是[-1,+1]。经过各种变换之后的坐标超出[-1,+1]范围的部分将不会显示到屏幕上。

正交投影

变换效果

正交投影在OpenGL中的作用是调整屏幕宽高比,并将实际定义的坐标转换成[-1,+1]范围内的对应的坐标。

矩阵定义

下图是正交投影矩阵。

https://cdn.wxdut.com/ 参数解释如下:

只考虑x轴和y轴,则:

在定义物体的坐标的时候,坐标范围为:


通过上面那个矩阵,就可以转换成[-1,+1]范围内的对应的坐标。下面对此进行证明。

数学推导

① 假设物体上的一个坐标为(x,y,z,1),其中,x的范围为[left, right],y的范围为[top, bottom],z的范围为[near, far]

则,矩阵*向量


即,





② 考虑到perspective divide的存在,此时w=1,所以:




② 先证明x轴确实落在了[-1, +1]的范围。

很明显,x1是关于x的一元一次线性函数。


所以x=right的时候,f(x)最大,x=left的时候,f(x)最小。

代入方程,得到:


③ 所以


同理,y1和z1的范围也是[-1, +1]。

证明结束。

小结

正交变换是将物体的坐标转换成OpenGL的坐标。

变换前的范围为:


变换后的范围为:


透视投影

变换效果

在用2D屏幕展现3D场景时,会有一种近大远小的感觉。OpenGL也是利用这一原理实现在2D屏幕上的3D效果。透视投影会形成一个视椎体,在视椎体内的坐标都是可以绘制到屏幕上的,也就是说,在视椎体上的坐标范围都会被调整到[-1, +1]的区间。

矩阵定义

参数解释如下:

透视矩阵有些特殊,并未说明x和y的范围,下面通过推导得出这个范围。

数学推导

① 假设物体上的一个坐标为(x,y,z,1)

则,矩阵*向量的结果为:


即,





② 考虑perspective divide的存在,得到:




③ 求:当结果落在了[-1, +1]的范围的时候,x的范围是多少?

很明显,x2是关于x的一元一次线性函数。


下面推算当x2的范围为[-1, +1]的时候,x的范围


所以,x的范围为


这里注意,按照习惯,z一般都是负数,所以上面的区间范围是没问题的,下同。

④ 求:当结果落在了[-1, +1]的范围的时候,y的范围是多少?

因为,


分别求y1为1和-1时,y的值。


所以,y的范围为


⑤ 求:当结果落在了[-1, +1]的范围的时候,z的范围是多少?

因为,



则有,


解方程得,


所以,


即变换前的坐标一定要在平截椎体的Z轴范围内才能最终展示到屏幕上。

证明结束。

小结

透视变换是将物体的坐标转换成OpenGL的坐标。

变换前的范围为:


变换后的范围为:


附上透视椎体的图解:

总结

矩阵变换在OpenGL坐标变换中起到了非常重要的作用。在二维图像显示时一般使用正交变换,在三维图像显示时就要用到透视变换。理解这两个变换对应的矩阵的作用对我们理解这两个变换很重要。

OpenGL中投影变换矩阵的反向推导相关推荐

  1. OpenGL中投影函数glOrtho()、glFrustum()以及gluPerspective()以及函数的用法

    OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果乘以投影矩阵(将 ...

  2. OpenGL中投影矩阵(Projection Matrix)详解

    在游戏开发中,一个物体模型从它自身的坐标系转换至我们在屏幕上所见的样子,需要进行一系列的坐标变换以及其他的操作.该过程称为渲染管线.以OpenGL为例: 该过程在以前是被封装的,不能访问.但是现在我们 ...

  3. 法线变换详解 和 3D 变换中法向量变换矩阵的推导

    两篇文章 法线变换详解(Normal Transform) 在图形学中,同样的一个模型视图变换矩阵可以用来变换点.线.多边形以及其它几何体,也可以变换多边形表面的切向量.比如: posEyeSpace ...

  4. OpenGL学习: 投影矩阵和视口变换矩阵(math-projection and viewport matrix)

    转自:https://blog.csdn.net/wangdingqiaoit/article/details/51589825 本文主要翻译并整理自 songho OpenGL Projection ...

  5. 深入理解OpenGL之投影矩阵推导

    深入理解OpenGL之投影矩阵推导 OpenGL流水线中的投影矩阵以及坐标变换 OpenGL中,投影矩阵在Vertex shader中使用,用于变换顶点.一般和Model, View矩阵结合成MVP矩 ...

  6. OpenGL中的投影使用

    OpenGL中的投影使用 在OpenGL中,投影矩阵指定了可视区域的大小和形状.对于正投影与透视投影这两种不同的投影类型,它们分别有各自的用途. 正投影 它适用于2D图形,如文本.建筑画图等.在它的应 ...

  7. 橡树OpenGL中的坐标系统

    [目标]:学习OpenGL中的坐标系统. [参考]: 1.<计算机图形学(OpenGL版) (第三版)> Francis著 (本文主要涉及第三章~第七章) 2.<计算机图形学(Ope ...

  8. 【OpenGL】02 - OpenGL中的坐标系

    [目标]:学习OpenGL中的坐标系统. [参考]: 1.<计算机图形学(OpenGL版) (第三版)> Francis著 (本文主要涉及第三章~第七章) 2.<计算机图形学(Ope ...

  9. OpenGL中各种坐标系的理解

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

最新文章

  1. 机器学习的前沿发展与应用分享
  2. PAT Basic 1032
  3. 深度学习概览之自然语言处理:从基本概念到前沿研究
  4. 猎豹浏览器怎么不能设置背景着颜色护眼?
  5. 癌中之王:基质微环境塑造胰腺癌瘤内结构|Cell
  6. [机器学习]京东机器学习类图书畅销原因分析-决策树或随机森林
  7. 具有固定名称mysql.data_SQLServer数据库之未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架 解决方案...
  8. 构建面向对象的应用软件系统框架
  9. spring boot初体验(三)Spring AOP
  10. shiro框架学习(一)
  11. MD文档编写利器《Typora》
  12. activity多实例任务加签
  13. xp给指定计算机共享,WinXP系统设置访问共享提示指定网络名不可用怎么解决
  14. 洛谷:P1653 猴子(图存储、逆向思维 删边 -->加边)
  15. 微服务网关之Springcloud GateWay
  16. English语法_形容词/副词3级 - 原级
  17. 基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)
  18. excel表格怎么调整行高和列宽_wps表格课程08|调整行高列宽
  19. 牛客多校第八场 Enigmatic Partition(DP)
  20. 通达信接口akshare接口怎么获取?

热门文章

  1. 学python的基础-老司机学python篇:第一季(基础速过、机器学习入门)
  2. python基础语法第10关作业-【python基础语法】第11天作业练习题
  3. python程序员在公司都是做什么的-程序员是做什么的?工资待遇怎么样?
  4. python3创建定时任务
  5. LeetCode Single Number III(位操作)
  6. (一)swoole服务启动流程
  7. LeetCode Merge k Sorted Lists(有序单链表数组的合并)
  8. start_requests
  9. 14. Java基础之泛型
  10. zbb20180929 thread java并发编程之Condition