专栏首页王肖的UTOpenGL中投影变换矩阵的反向推导

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

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

推导的思路

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

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

正交投影

变换效果

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

矩阵定义

下图是正交投影矩阵。

参数解释如下:

只考虑x轴和y轴,则:

在定义物体的坐标的时候,坐标范围为: \left\{\begin{matrix}x\in [left,right] \\ y\in [top,bottom] \end{matrix}\right.

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

数学推导

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

则,矩阵*向量

即,x1=\frac{2x-left-right}{right-left} ,y1=\frac{2y-top-bottom}{bottom-left} ,z1=\frac{2z-near-far}{far-near} ,w1=1

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

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

很明显,x1是关于x的一元一次线性函数。x1=f(x)=\frac{2*x-left-right}{right-left}

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

代入方程,得到:f(x)=\left\{\begin{matrix}f(x)=-1, x=left \\ f(x)=1, x=right \end{matrix}\right.

③ 所以x1=f(x) \in [-1, +1]

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

证明结束。

小结

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

变换前的范围为:\left\{\begin{matrix}x \in [left,right] \\y \in [bottom,top] \\z \in [near,far] \end{matrix}\right.

变换后的范围为: \left\{\begin{matrix}x \in [-1,1] \\y \in [-1,1] \\z \in [-1,1] \end{matrix}\right.

透视投影

变换效果

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

矩阵定义

参数解释如下:

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

数学推导

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

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

即,

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

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

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

x2=f(x)=\frac{-ax}{aspect*z}

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

x=\left\{\begin{matrix}\frac{aspect*z}{a},f(x)=-1 \\ -\frac{aspect*z}{a},f(x)=1 \end{matrix}\right.

所以,x的范围为[\frac{aspect*z}{a},-\frac{aspect*z}{a}]

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

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

因为,y2=f(y)=-\frac{ay}{z}

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

y=\left\{\begin{matrix}\frac{z}{a},f(y)=-1 \\ -\frac{z}{a},f(y)=1 \end{matrix}\right.

所以,y的范围为[\frac{z}{a},-\frac{z}{a}]

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

因为,

-1<=f(z)<=1

则有,

解方程得,-1<=f(z)<=1

所以,n<=z<=f

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

证明结束。

小结

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

变换前的范围为:

变换后的范围为:

附上透视椎体的图解:

总结

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenGL矩阵变换的数学推导

    说起OpenGL的矩阵变换,我是之前在我们的项目天天P图、布丁相机中开发3D效果时才比较深入地研究了其中的原理,当时一开始时,也只是知道怎么去用这些矩阵,却不知...

    腾讯Bugly
  • OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换

    通过模型矩阵,观察者矩阵(View Matrix),投影矩阵(Projection Matrix)三步矩阵变换后最终确定该展示怎样的图像。要注意的是矩阵的计算时...

    用户8893176
  • OpenGL ---渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵

    https://blog.csdn.net/qq_29523119/article/details/78577246

    用户1148525
  • OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148525
  • 「音视频直播技术」OpenGL渲染之距阵变换

    在Android下进行视频渲染使用的是 OpenGLES。OpenGLES(OpenGL for Embedded Systems)就是用在嵌入式系统中的 Op...

    音视频_李超
  • iOS开发-OpenGL ES入门教程3

    教程 OpenGL ES入门教程1-Tutorial01-GLKit OpenGL ES入门教程2-Tutorial02-shader入门 这次是三维图形变...

    落影
  • 实验6 OpenGL模型视图变换

      (1)阅读教材有关三维图形变换原理,运行示范实验代码,掌握OPENGL程序三维图形变换的方法;   (2)阅读实验原理,运行示范实验代码,理解掌握Open...

    步行者08
  • ​OpenGL 学习系列---坐标系统

    在前面绘制基本图形中,遇到了很明显的问题,圆形不像圆形,正多边形不像正多边形?就像下面图形一样:

    音视频开发进阶
  • 附加实验2 OpenGL变换综合练习

    理解掌握OpenGL程序的投影变换,能正确使用投影变换函数,实现正投影与透视投影。

    步行者08
  • OPengl、DirectX、OPenCV、OpenCL

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    sofu456
  • OpenGL ES 投影和坐标[转]

    http://blog.csdn.net/liyuanjinglyj/article/details/46624901

    jerrypxiao
  • OpenGL ES 2.0 (iOS)[02]:修复三角形的显示

    从图可以看出,这三个数据形成的其实是一个等边直角三角形,而在 iOS 模拟器中通过 OpenGL ES 绘制出来的是直角三角形,所以是有问题的,三角形被拉伸了。

    半纸渊
  • OpenGL API 简介

    开发基于 OpenGL 的应用程序,必须先了解 OpenGL 的库函数。它采用 C 语言风格,提供大量的函数来进行图形的处理和显示。OpenGL 库函数的命名方...

    用户2930595
  • [译]OpenGL投影矩阵

    电脑显示屏是一个2D平面,为了能够在这个2D平面上显示OpenGL渲染的3D场景,我们必须将3D场景当作2D图像投影到这个2D平面(计算机屏幕)上.GL_PRO...

    用户2615200
  • 实验5 OpenGL二维几何变换

    (1)阅读实验原理,掌握OpenGL程序平移、旋转、缩放变换的方法。 (2)根据示范代码,完成实验作业。

    步行者08
  • [OpenGL]OpenGL坐标系及坐标转换

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    用户1148525
  • 终端图像处理系列 - OpenGL ES 2.0 - 3D基础(矩阵投影)

    Overview 移动设备的屏幕是二维平面,要想把一个三维场景渲染在手机二维屏幕上,需要利用OpenGL中的矩阵投射,将三维空间中的点映射到二维平面上。三维矩阵...

    天天P图攻城狮
  • OpenGL开发库的详细介绍zz

    开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律...

    步行者08
  • three.js中的矩阵变换(模型视图投影变换)

    我在《WebGL简易教程(五):图形变换(模型、视图、投影变换)》这篇博文里详细讲解了OpenGL\WebGL关于绘制场景的图形变换过程,并推导了相应的模型变换...

    charlee44

扫码关注云+社区

领取腾讯云代金券