位置: 编程技术 - 正文

OpenGL学习07-OpenGL矩阵(opengl learn)

编辑:rootadmin

推荐整理分享OpenGL学习07-OpenGL矩阵(opengl learn),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl教程48讲,opengl opengl,opengl入门教程(精),opengl使用教程,opengl入门视频教程,opengl入门教程(精),opengl教程48讲,opengl教程48讲,内容如对您有帮助,希望把文章链接给更多的朋友!

关于矩阵的概念和矩阵的计算本篇就不再多说了,不了解的同学可以翻一下大学数学了!

矩阵(Matrix)是一种很强大的数学工具,特别实在计算机图形处理中,它可以极大的简化变量之间的复杂关系的一个或多个方程式的求解。例如:空间中有一个点坐标x、y、z,如果当这个点围绕任意点以任意方向旋转一定的坐标之后,想知道它的新位置,就需要使用矩阵。

(1)变换管线

从原始顶点数据通往屏幕坐标的路是相当漫长的。图1提供了这个过程的流程图。

图1,来至OpenGL超级宝典

首先,把顶点转换成一个1 x 4的矩阵,前3个&#;分别是x、y、z,第4个是缩放因子,可以在接受4个参数的定制函数中手工使用这个&#;,这个&#;是w坐标,他在默认情况下为1.0,很少炫耀修改它。

接着,把顶点与模型视图矩阵相乘,产生经过变换的视觉坐标。

然后,将这个视觉坐标与投影矩阵相乘,产生裁剪坐标。这样就有效的清除了可视区域之外的所有数据。这个裁剪坐标随后除以w&#;,产生规范化的设备坐标。W&#;可能会被投影矩阵或者模型视图矩阵所修改,具体取决与顶点所发生的变换(OpenGL和高层矩阵函数隐藏了这些细节)。

最后,把这个坐标通过视口变换映射到一个2D平面上。

(2)模型视图矩阵

模型视图矩阵是一个4 x 4的矩阵,代表经过变换的坐标系统,我们可以用这个坐标系统放置物体并设置方向。为图元所提供的顶点按照单列单矩阵的形式使用,并与模型视图矩阵相乘,产生与视觉坐标相对应的经过变换的新坐标。

a)移动

使用Glut的函数库创建一个立方体,代码如下:

void glutWireCube(GLdouble size);

此时一个边长size个单位的立方体就会出现在原点居中的位置。如果希望在绘制这个立方体之前把它沿着y轴方向移动n个单位,可以把模型视图矩阵乘以一个表示沿y轴方向上移动n个单位的矩阵,然后执行绘制任务。

OpenGL提供了一个高层函数,可以实现这个操作,代码如下:

void glTranslatef (GLfloat x, GLfloat y, GLfloat z);

这个函数接受三个参数,分别是x、y、z方向的移动数量。然后,它创建一个适当的矩阵,并执行乘法操作。下面是上述操作的伪代码:

glTranslatef(0.0f, .0f, 0.0f);

glutWireCube(.0f);

图2为移动前后的效果(图形旋转):

图2

b)旋转

之前程序中一直在使用旋转功能,但我们仅仅只是会使用它,但还不知道旋转的原理。OpenGL高层提供了一个可以设置旋转矩阵的函数,如下:

void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

函数中接受4个参数,angle为旋转的角度,x、y、z为组成向量(x,y,z)为旋转围绕的轴。简单点来讲就是原点(0,0,0)和(x,y,z)组成一条直线,物理围绕这条直线旋转angle角度,下面是上述操作的伪代码:

glRotatef(.0f, 1.0f, 1.0f, 1.0f);

glutWireCube(.0f);

图3为旋转前后的效果:

图3

c)缩放

缩放变换根据指定的因子沿3个轴对物体的所有顶点惊醒拉伸或收缩,从而改变物体的大小。同样OpenGL高层提供了缩放的函数,如下:

void glScaled (GLdouble x, GLdouble y, GLdouble z);

函数接受3个参数,x、y、z分别为x、y、z方向的缩放比例因子,当缩放因子为1.0时,该方向大小不变;当缩放因子大于1.0时,该方向会被放大;当缩放因子小于1.0时,该方向会被缩小;下面是上述操作的伪代码:

glScaled(1.5f, 1.0f, 0.5f);

glutWireCube(.0f);

图4为缩放前后的效果(图形被旋转):

OpenGL学习07-OpenGL矩阵(opengl learn)

图4

(3)单位矩阵

模型视图矩阵变换是累积的,每次调用一个变换函数时,都会创建一个新矩阵,并把它与当前的模型视图矩阵相乘,得到一个新矩阵作为当前模型视图矩阵。

可以通过在模型视图矩阵中加载单位矩阵来实现把模型视图矩阵重置到原点目标。单位矩阵表示没有反生变换,加载单位矩阵的效果相当于在绘图时所指定额所有坐标都处于视觉坐标中。所谓的单位矩阵就是矩阵对角线元素均为1,其余元素为0的矩阵。当这种矩阵与任意的顶点矩阵相乘时,其结果就是顶点矩阵,不会发生任何变化。如图5所示:

图5,来至OpenGL超级宝典

下面代码为加载单位矩阵:

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

第一行代码指定了当前操作的矩阵是模型视图矩阵。在设置了当前操作矩阵之后,他就将一直保持为活动矩阵,知道对他进行修改。第二行代码在当前矩阵中加载单位矩阵。

(4)矩阵堆栈

在场景中放置每个物体时,并不一定都要使用单位矩阵对模型视图矩阵重置。常常需要保存当前变换状态,然后放置了一些物体之后再进行恢复到这个状态。当一开始就报模式视图变换为自己经常使用的视图变换矩阵时,这种方法非常方便。

为了方便这个过程,OpenGL中维护了一个矩阵堆栈,它既可以用于模型视图矩阵,也可以用于投影矩阵,矩阵堆栈的工作方式就像普通堆栈一样。我们可以把当前的矩阵压入矩阵堆栈中,对它进行保存,然后再修改当前矩阵。从矩阵堆栈中弹出相当于恢复原来的那个矩阵。

堆栈的深度最大&#;获取:

glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &stack_deep);

矩阵堆栈操作函数:

glPushMatrix();

glPopMatrix();

glPushMatrix函数会将当前使用的模型视图矩阵压入堆栈;glPopMatrix函数会将栈顶的矩阵弹出,作为当前模型视图矩阵使用。

(5)矩阵高级操作

这些对变换(移动、缩放、旋转)进行包装的OpenGL高层函数对于许多变换问题是极为简单的。但是,为了获得真正强大的功能和灵活性,必须花时间掌握直接使用矩阵。

OpenGL在表示一个4x4的矩阵是并没有使用浮点型的二维数组,而是使用了一个包含个浮点&#;的一维数组表示。这个方法和许多数学函数库使用的方法不同,后者常常使用二维数组来表示矩阵。例如,下面两个例子中,OpenGL更倾向于使用前者。

GLfloat matrix[];

GLfloat matrix[4][4];

OpenGL也可以使用第二种类型表示形式,但是第一种是更高效的表示方式。这个元素代表一个4x4的矩阵,如图6所示。当我们按列逐个遍历数组的元素是,就称之为列主序的矩阵顺序。在内存中,用二维数组表示4x4矩阵是以行主序存储的。

图6,来至OpenGL超级宝典

真正的奥秘在于这个&#;表示空间中一个特定的位置和三个轴的方向。这4个列的每个列都表示一个4元素的向量。为了简单期间,我们把注意力集中在前3个元素中。第4列的那个向量包含了经过变换的坐标系统的x、y、x&#;。当我们在单位矩阵上调用glTranslate函数时,他所完成的任务就是把我们提供的x、y、z&#;放在这个矩阵的底、、位置上。

前3列只是方向向量,便是空间中x、y、z轴的方向。在绝大多数情况下,这3个向量相互之间呈度垂直(正交),如图7所示;

最令人吃惊的事情是如果一个4x4的矩阵包含一个不同的坐标系统的位置和方向。那么,把一个顶点(以一个列矩阵或向量的形式)与这个矩阵相乘,其结果就是一个变换到该坐标的新顶点。这意味着空间中任何位置以及自己所需要的任何方向都可以通过一个4x4的矩阵进行唯一的定义,并且,如果把一个物体的所有顶点与这个矩阵相乘,就可以把整个物体变换到空间指定的位置和方向。

图7,来至OpenGL超级宝典

OpenGL提供了加载矩阵的方法:

Void glLoadMatrixd (const GLdouble *m);

Void glLoadMatrixf (const GLfloat *m);

绝大多数OpenGL实现使用float而不是double类型存储和操作管线数据。因此,如果在程序中使用double,可能会产生性能上的影响,因为位浮点数必须转换成单精度浮点数。下面代码显示把一个数组加载成单位矩阵;

GLfloat matrix[] = {1.0f, 0.0f, 0.0f, 0.0f,

0.0f, 1.0f, 0.0f, 0.0f,

0.0f, 0.0f, 1.0f, 0.0f,

0.0f, 0.0f, 0.0f, 1.0f};

glMatrixMode(GL_MODELVIEW);

glLoadMatrixf(matrix);

DrawPrimitive真是一个好类!!cocos的开发组干了好事。 如果每次在商业项目中使用opengl命令去绘制特效,工作效率真心低,所以官方包装了这个接口,真实好东西。draw函数的接口以及改了,新接口不允许重

QOpenGLWindow 、QOpenGLWidget 和 QPainter混合渲染方法初探 该方法不存在普遍性。别按照此方法了我用的是OpenGL3.3,Qt5.4.0先说QWindow和QPainter结合,这个Qt有现成的例子。就是那个openglWindow那个例子。这个基本直接

从头开始绘制一个圆锥体 opengl帮助库glu里有一个对象叫做二次几何体,可以用来给球体圆锥体建模,然而在opengles中不能使用glu库,那么我们只能自己写方法替代它了,上次给球体建

标签: opengl learn

本文链接地址:https://www.jiuchutong.com/biancheng/373225.html 转载请保留说明!

上一篇:How to embed a jframe in an eclipse view

下一篇:DrawPrimitive真是一个好类!!cocos的开发组干了好事。(prize draw是什么意思)

  • 已认证进项税额转出怎么做账务处理
  • 企业所得税税前扣除吗
  • 增值税专用发票电子版
  • 公司法人和经理承担责任一样吗
  • 不确认销售收入结转销售成本
  • 企业罚职工的钱违法吗?
  • 股东分红需要开股东会决定吗?
  • 不能收回的应收票据
  • 无形资产计税基础怎么算
  • 以前年度损益调整借贷方向
  • 数量金额式明细账模板
  • 事业基金转入哪个科目
  • 预算外收入计入什么科目
  • 公司收承兑贴现的会计分录
  • 月末结转各项费用支出479000
  • 以实物抵债账务协议
  • 社保上面的每月的缴费基数是什么意思?
  • 资产处置收益结转损益
  • 国外出差差旅费
  • 中秋员工福利费会计分录
  • 质量问题产生的影响
  • 印花税算错了可以补交吗
  • 财产租赁合同金额含税吗
  • 企业转增股本要交税吗
  • 铲车费属于劳务费吗
  • 小额贷款公司借钱容易吗
  • 企业公司报税流程
  • 承兑汇票延期托收证明
  • 个人公益性捐赠全额还是限额
  • 企业确定无法支付的
  • 印花税可以根据企业流水申报吗
  • 代账代税与自行核算申报应从哪几个角度考虑
  • 收到专用发票的会计分录
  • 已经折旧完的固定资产怎么处理
  • 租房税收缴款书在哪里打印
  • mac host is down
  • eml文件怎么打开方式
  • bios设置教程视频
  • 电子税务局变更办税人员怎么操作
  • 企业从政府取得的经济资源均应当
  • 出售固定资产增值税怎么处理
  • 销货方开具红票,购货方怎么入账
  • 资产负债表左方烈士的资产按什么排列
  • php的图片
  • php中session什么意思
  • bootstrap easyui结合
  • 房屋土地使用权到期后续费标准
  • 财务报销单据不能用圆珠笔写吗
  • 真实世界人工智能
  • python怎么将整数转化为字符串
  • 购买黄金会计分录怎么写
  • 织梦添加文章如何修改高级参数
  • 季度所得税资产总额填错了,会不会有影响
  • 其他应付款长期挂账几年必须转收入
  • 公司购买的家电怎么入账
  • 长期股权投资收回账务处理
  • 保险发票入账
  • mysql挂了怎么排查
  • 无法安装mysql数据库
  • Win10 64位系统下鼠标右键刷新没反应的解决方案
  • 配置windows server essentials出错
  • ubuntuiso
  • centos解压软件
  • win10rs2是哪个版本
  • ubuntu系统应用
  • win8计算机管理员权限
  • win8.1开机慢
  • win8免密码登录
  • windows8的ie浏览器在哪
  • shadersmod
  • nodejs bff
  • cocos2djs
  • unity 替代
  • nvm-windows
  • node js 前端
  • python3 random模块
  • javascript如何学
  • 飞机票其他税费包括什么内容
  • 小企业会计准则的印花税计入什么
  • 合并方为进行企业合并发生的佣金和手续费怎么处理?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设