【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解

这篇具有很好参考价值的文章主要介绍了【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料:

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

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

说明:

投影矩阵用于投影变换,投影变换是三维场景中的物体正确渲染到二维屏幕的重要过程之一。在透视矩阵中,有几个重要元素:视场角、成像设备的宽高比、场景中能看到的最近距离以及最远距离,通过这几个参数可以定义一个视锥体对象,从而模拟人眼或者相机的在三维空间中的成像原理,通常有这个几个值就可以构造一个4x4的矩阵,通过OpenGL提供的接口设置即可。
【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解
上图是标准的OpenGL 透视投影矩阵,对于我们普通应用程序的视锥体是左右对称的,这样的话就存在以下几个等式:
r+l=0
t+b=0
r-l=2r=w
t-b=2t=h
所以我们更常见到的投影矩阵形式应该是这样的:
【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解

使用方式:

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

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

方式1:glFrustum

函数原型:

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

计算方法:
【OpenGL-矩阵】投影矩阵(ProjectionMatrix)理解
示例代码:

		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代码示例:文章来源地址https://www.toymoban.com/news/detail-432067.html

		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)理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter参考资料

    Flutter 官网 : https://flutter.dev/ Flutter 插件下载地址 : https://pub.dev/packages Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 ) 官方 GitHub 地址 : https://github.com/flutter Flutter 中文社区 : https://flutter.cn/ Flutter 实用教程 : https://flutter.cn/docs/cookbook Flutter CodeLab : https://codelabs.flutter-io.cn/ Dart 中

    2024年02月13日
    浏览(31)
  • STM32重要参考资料

    stm32f103c8t6 (有时候不小心短接VCC和GND,芯片会锁住,可以BOOT0拉高试试(用跳线帽接)) 可用于PCB设计 1.RCC开启时钟错误,例如    RCC_ APB2 PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 写成    RCC_ APB1 PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 这个函数是有说明的,可以看看vscode显示的函

    2024年04月11日
    浏览(30)
  • 资料与参考

    资料: 本书(《Python神经网络编程》)的资料是使用Jupyter notebooks写的,本人并不擅长使用Jupyter,所以用传统py重写了一遍,并附加了新功能(即多数字识别),现将Jupyter版和py版连带本书pdf一并上传至gitee,地址:python-neuralNetwork-coding: 《Python神经网络编程》pdf和随书源码,

    2024年02月11日
    浏览(42)
  • Fast Planner——代码解读参考资料整理

    参数解读 主要函数解读 概率栅格地图,概率更新过程的公式推导过程 全概率公式、贝叶斯公式 一. kinodynamic a_star(前端hybrid A_star动力学路径搜索) 1.1启发函数的计算 1.2 Compute shot Traj 1.3 节点扩张 1.4 节点剪枝 1.5 返回kinopath与 getsamples 二、B样条曲线设置 2.1 均匀B样条设置

    2024年02月05日
    浏览(77)
  • 第八章 OpenGL ES 基础-MVP矩阵理解

    第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵 第六章 OpenGL ES 基础-FBO、VBO理解与运用 第七章 OpenGL ES 基础-输入

    2024年04月26日
    浏览(25)
  • 【Python NLTK】零基础也能轻松掌握的学习路线与参考资料

    Python 自然语言处理工具包(Natural Language Toolkit,简称 NLTK)是一款 Python 的库,主要用于处理自然语言的相关问题,如文本清洗、标记化、分词、语义分析、词性标注、文本分类等功能,是数据科学家和机器学习工程师不可或缺的工具之一。 本文将介绍学习 Python NLTK 的路线,

    2024年02月07日
    浏览(46)
  • [渝粤教育] 中国人民警察大学 工业企业防火 参考 资料

    教育 -工业企业防火-章节资料考试资料-中国人民警察大学【】 随堂测验 1、【判断题】工业企业的火灾特点是涉及行业种类繁多,涉及到社会生活的方方面面。 A、正确 B、错误 参考资料【 】 2、【判断题】工业企业的火灾特点是物资集中,存在各种形式的点火源,发生火灾

    2024年02月02日
    浏览(49)
  • [渝粤教育] 辽宁对外经贸学院 数字新技术 参考 资料

    教育 -数字新技术-4-章节资料考试资料-辽宁对外经贸学院【】 第一单元测验 1、【单选题】1. 云计算是对(D)技术的发展与运用 云计算是对( )技术的发展与运用。 A、并行计算 B、网格计算 C、分布式计算 D、三个选项都是 参考资料【 】 2、【单选题】从研究现状上看,下

    2023年04月25日
    浏览(51)
  • 【Python psycopg2】零基础也能轻松掌握的学习路线与参考资料

    Python psycopg2是一个Python库,在Python中提供了一个连接PostgreSQL数据库的接口。它可以让Python应用程序和PostgreSQL数据库之间进行通信和数据传输。学习Python psycopg2的路线和教程可以在查阅资料和实践中快速入门。 一、学习前置知识 学习Python psycopg2需要一定的前置知识,如Pytho

    2024年02月05日
    浏览(39)
  • 【Python Cookie 和代理 IP】零基础也能轻松掌握的学习路线与参考资料

    一、Python Cookie 1、什么是Cookie? Cookie是一种在客户端保存数据的机制,服务器通过在HTTP响应头中添加Set-Cookie头实现。浏览器在接收到响应头中的Set-Cookie后,会将这个Cookie保存在本地。之后每次请求都会将本地保存的Cookie自动添加到请求头中,发送给服务器。 2、为什么需要

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包