【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解
参考资料:
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)理解相关推荐
- 深入理解OpenGL之投影矩阵推导
深入理解OpenGL之投影矩阵推导 OpenGL流水线中的投影矩阵以及坐标变换 OpenGL中,投影矩阵在Vertex shader中使用,用于变换顶点.一般和Model, View矩阵结合成MVP矩 ...
- OpenGL学习: 投影矩阵和视口变换矩阵(math-projection and viewport matrix)
转自:https://blog.csdn.net/wangdingqiaoit/article/details/51589825 本文主要翻译并整理自 songho OpenGL Projection ...
- OpenGL中投影矩阵(Projection Matrix)详解
在游戏开发中,一个物体模型从它自身的坐标系转换至我们在屏幕上所见的样子,需要进行一系列的坐标变换以及其他的操作.该过程称为渲染管线.以OpenGL为例: 该过程在以前是被封装的,不能访问.但是现在我们 ...
- 【脚下生根】之深度探索安卓OpenGL投影矩阵
世界变化真快,前段时间windows开发技术热还在如火如荼,web技术就开始来势汹汹,正当web呈现欣欣向荣之际,安卓小机器人,咬过一口的苹果,winPhone开发平台又如闪电般划破了混沌的web世界 ...
- OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)
出处:http://oliver.zheng.blog.163.com/blog/static/1424115952013349234838/ (转载自"结冰的雪"百度空间) 目的 ...
- 模型矩阵、视图矩阵、投影矩阵
模型视图投影矩阵的作用,就是将顶点从局部坐标系转化到规范立方体(Canonical View Volnme)中.总而言之,模型视图投影矩阵=投影矩阵×视图矩阵×模型矩阵,模型矩阵将顶点从局部坐标系转化 ...
- 矩阵论(七):投影矩阵
矩阵论专栏:专栏(文章按照顺序排序) 参考资料: 线性代数基础知识系列:1.2.3.4.5 广义逆矩阵(上) 广义逆矩阵(下) 投影矩阵 投影的定义 投影矩阵 求法 性质 正交投影的性质 投影定理 投 ...
- 线性代数之 投影矩阵
上一篇讲了伪逆矩阵,本篇我们讲投影矩阵. 上一篇线性代数之 伪逆矩阵_水w的博客-CSDN博客 目录 二.投影矩阵 ◼ 投影矩阵 ◼ 举例 参考投影矩阵的奥秘_哔哩哔哩_bilibili 二.投影矩阵 ...
- 【线性代数】——投影矩阵
About 投影矩阵 一个矩阵AAA既可以表示一种线性变换,又可以是一个子空间(由基张开的),还可以是一组坐标,甚是神奇. 文章目录 About 投影矩阵 一维空间的投影矩阵 投影矩阵的多维推广 ...
最新文章
- 可以在手机里运行的Detectron2来了:Facebook官方出品,支持端到端模型训练、量化和部署...
- 无锡市中级人民法院数据复制灾备软件采购
- 常考数据结构与算法:反转链表
- Ubuntu通过windows代理上网
- OPPO尝鲜android版本更新,安卓11迎来四大贴心升级,OPPO小米率先尝鲜
- python下sqlite增删查改方法(转)
- 初识ABP vNext(8):ABP特征管理
- 栈windows linux,Linux+Windows: 程序崩溃时,在 C++ 代码中,如何获取函数调用栈信息...
- svn冲突怎么解决_管理者怎么处理员工冲突?解决下属冲突的6个方法
- Java基础——Arrays工具类的使用
- 支付宝上线AR扫识别垃圾功能,十大“拎不清”垃圾令小姐姐捂脸
- 什么不用 iframe 做微前端
- 2022年深圳市集成电路专项资助计划项目申报条件及材料,补贴3000万
- HTPPS加密对网站有什么好处
- 安卓开机画面_为了安卓系统,入手文石BOOX Poke Pro电子书阅读器
- 真传丹道小周天功.txt
- android+下落+动画,完美起航-Android面试题之动画+事件处理篇
- 《十》浏览器基础及渲染引擎解析一个网页的过程、JavaScript 引擎解析 JavaScript 代码的过程
- 最新微信合成大西瓜小游戏(合成版)源码+附带流量主功能
- 如何获取大量廉价可靠代理IP地址?