参考资料:

https://jsantell.com/3d-projection/

http://www.songho.ca/opengl/gl_projectionmatrix.html

说明:

投影矩阵用于投影变换,投影变换是三维场景中的物体正确渲染到二维屏幕的重要过程之一。在透视矩阵中,有几个重要元素:视场角、成像设备的宽高比、场景中能看到的最近距离以及最远距离,通过这几个参数可以定义一个视锥体对象,从而模拟人眼或者相机的在三维空间中的成像原理,通常有这个几个值就可以构造一个4x4的矩阵,通过OpenGL提供的接口设置即可。

上图是标准的OpenGL 透视投影矩阵,对于我们普通应用程序的视锥体是左右对称的,这样的话就存在以下几个等式:
r+l=0
t+b=0
r-l=2r=w
t-b=2t=h
所以我们更常见到的投影矩阵形式应该是这样的:

使用方式:

在实际开发场景中,我们可以利用现有的库生成矩阵,也可以利用透视投影的基础原理计算出矩阵。

这里列出前面提到的几个重要参数:
视场角:fov;
成像设备的宽高比:aspect;
近裁剪面距离:znear;
远裁剪面距离:zfar。

方式1:glFrustum

函数原型:

glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);

计算方法:

示例代码:

     glViewport(0, 0, args.width, args.height);float tanx = tan(fov * 3.14159265f / 180.0f * 0.5f);float top = args.znear * tanx;float bottom = -top;float right = top * (args.width / args.height);float left = -right;glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(left, right, bottom, top, args.znear, args.zfar);glMatrixMode(GL_MODELVIEW);glLoadIdentity();

方式2:自己构造矩阵

构造方式:
参考上面的矩阵形式图,我们可以自己定义一个长度16的浮点数组,然后对应的填充对应下标的值,要注意的是OpenGL中投影矩阵是以列为主序的。

void xPerspective(float fov, float aspect, float znear, float zfar, float proj[16]){float fov_rad = fov * 3.14159265f / 180.0f;float tan_fov = tan(fov_rad / 2);proj[0] = 1.f / (tan_fov * aspect);proj[1] = 0.0f;proj[2] = 0.0f;proj[3] = 0.0f;proj[4] = 0.0f;proj[5] = 1.f / tan_fov;proj[6] = 0.0f;proj[7] = 0.0f;proj[8] = 0.0f;proj[9] = 0.0f;proj[10] = (-zfar - znear) / (zfar - znear);proj[11] = -1.0f;proj[12] = 0.0f;proj[13] = 0.0f;proj[14] = -2.0f * zfar * znear / (zfar - znear);proj[15] = 0.0f;}

示例代码:

     float proj[16] = { 0 };xPerspective(args.fovy, args.width/args.height, args.znear, args.zfar, proj);glViewport(0, 0, args.width, args.height);glMatrixMode(GL_PROJECTION);glLoadIdentity();glLoadMatrixf(proj);glMatrixMode(GL_MODELVIEW);glLoadIdentity();

方式3:使用第三方库

直接利用glu或者glm提供的函数,把fov、aspect、znear、zfar这几个参数传入即可。
glu函数原型:

void APIENTRY gluPerspective (
GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar);

glu代码示例:

     glViewport(0, 0, args.width, args.height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(args.fovy, args.width/args.height, args.znear, args.zfar);glMatrixMode(GL_MODELVIEW);glLoadIdentity();

glm函数原型:

template
GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> perspective
(
T const & fovy,
T const & aspect,
T const & zNear,
T const & zFar
)

glm代码示例:

     glm::mat4 proj = glm::perspective(args.fovy, args.width / args.height, args.znear, args.zfar);glViewport(0, 0, args.width, args.height);glMatrixMode(GL_PROJECTION);glLoadIdentity();glLoadMatrixf(glm::value_ptr(proj));glMatrixMode(GL_MODELVIEW);glLoadIdentity();

【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解相关推荐

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

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

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

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

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

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

  4. 【脚下生根】之深度探索安卓OpenGL投影矩阵

    世界变化真快,前段时间windows开发技术热还在如火如荼,web技术就开始来势汹汹,正当web呈现欣欣向荣之际,安卓小机器人,咬过一口的苹果,winPhone开发平台又如闪电般划破了混沌的web世界 ...

  5. OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

    出处:http://oliver.zheng.blog.163.com/blog/static/1424115952013349234838/ (转载自"结冰的雪"百度空间) 目的 ...

  6. 模型矩阵、视图矩阵、投影矩阵

    模型视图投影矩阵的作用,就是将顶点从局部坐标系转化到规范立方体(Canonical View Volnme)中.总而言之,模型视图投影矩阵=投影矩阵×视图矩阵×模型矩阵,模型矩阵将顶点从局部坐标系转化 ...

  7. 矩阵论(七):投影矩阵

    矩阵论专栏:专栏(文章按照顺序排序) 参考资料: 线性代数基础知识系列:1.2.3.4.5 广义逆矩阵(上) 广义逆矩阵(下) 投影矩阵 投影的定义 投影矩阵 求法 性质 正交投影的性质 投影定理 投 ...

  8. 线性代数之 投影矩阵

    上一篇讲了伪逆矩阵,本篇我们讲投影矩阵. 上一篇线性代数之 伪逆矩阵_水w的博客-CSDN博客 目录 二.投影矩阵 ◼ 投影矩阵 ◼ 举例 参考投影矩阵的奥秘_哔哩哔哩_bilibili 二.投影矩阵 ...

  9. 【线性代数】——投影矩阵

    About 投影矩阵   一个矩阵AAA既可以表示一种线性变换,又可以是一个子空间(由基张开的),还可以是一组坐标,甚是神奇. 文章目录 About 投影矩阵 一维空间的投影矩阵 投影矩阵的多维推广 ...

最新文章

  1. 可以在手机里运行的Detectron2来了:Facebook官方出品,支持端到端模型训练、量化和部署...
  2. 无锡市中级人民法院数据复制灾备软件采购
  3. 常考数据结构与算法:反转链表
  4. Ubuntu通过windows代理上网
  5. OPPO尝鲜android版本更新,安卓11迎来四大贴心升级,OPPO小米率先尝鲜
  6. python下sqlite增删查改方法(转)
  7. 初识ABP vNext(8):ABP特征管理
  8. 栈windows linux,Linux+Windows: 程序崩溃时,在 C++ 代码中,如何获取函数调用栈信息...
  9. svn冲突怎么解决_管理者怎么处理员工冲突?解决下属冲突的6个方法
  10. Java基础——Arrays工具类的使用
  11. 支付宝上线AR扫识别垃圾功能,十大“拎不清”垃圾令小姐姐捂脸
  12. 什么不用 iframe 做微前端
  13. 2022年深圳市集成电路专项资助计划项目申报条件及材料,补贴3000万
  14. HTPPS加密对网站有什么好处
  15. 安卓开机画面_为了安卓系统,入手文石BOOX Poke Pro电子书阅读器
  16. 真传丹道小周天功.txt
  17. android+下落+动画,完美起航-Android面试题之动画+事件处理篇
  18. 《十》浏览器基础及渲染引擎解析一个网页的过程、JavaScript 引擎解析 JavaScript 代码的过程
  19. 最新微信合成大西瓜小游戏(合成版)源码+附带流量主功能
  20. 如何获取大量廉价可靠代理IP地址?

热门文章

  1. 现货黄金软件屏幕大小怎么调?
  2. android expandablelist 自动滚动,android-图像和ExpandableListView在同一滚动视图中
  3. 电子闹钟(atmega16)
  4. oracle REPLACE函数语法
  5. TDW千台Spark千亿节点对相似度计算
  6. python+django口腔牙诊所管理系统nodejs+vue+elementui
  7. 智慧地球:奥巴马的新战略?
  8. 如何将PPT某一页幻灯片导出为高清图片
  9. ORA-28112: 无法执行策略函数 问题解决
  10. 几乎没有人知道的ArcGIS实用包工具!——包工具之GPK