位置: 编程技术 - 正文

OpenGL 矩阵变换(讲的太好了~!)(opengl 旋转矩阵)

编辑:rootadmin

推荐整理分享OpenGL 矩阵变换(讲的太好了~!)(opengl 旋转矩阵),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl图形变换,opengl view矩阵,opengl view矩阵,opengl 旋转矩阵,opengl 旋转矩阵,opengl矩阵变换,opengl view矩阵,opengl模型变换矩阵,内容如对您有帮助,希望把文章链接给更多的朋友!

Overview

几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组合操作改变这些数据。

Object Coordinates

对象的本地坐标系——任何变换之前的最初位置.为了变换(transformation)这些对象,可以调用glRotate(),glTranslatef(),glScalef()这些方法。

Eye Coordinates

使用GL_MODELVIEW矩阵和Object 坐标相乘所得。在OpenGL中用GL_MODELVIEW将对象对象空间(Object Space)变换到视觉空间(eye space)。GL_MODELVIEW

矩阵是模型矩阵(Model Matrix)和视觉矩阵(View Matrix)的组合 ()。其中,Model 变换指的是将Object Space转换到World Space

(译注:World Space&#;得是OpenGL中的三维空间),而View 变换是将World space变换到eye space。

注意:在OpenGL中没有单独的camera(view) matrix。因此,为了模拟camera或者view的变换,其中的场景(3D物体和光照)必须通过和view相反的方向变换。也就是说,OpenGL总是将camera定义在(0,0,0)点,并且强制在eye space坐标系的-Z轴方向,而且不能变换。关于GL_MODELVIEW Matrix的详细资料可以查看此处: vectors)——从对象坐标系(Object coordinates)变换到视觉坐标系(eye coordinates),它是用来计算光照(lighting calculation)的.注意标准向量(Normal vectors)的变换和顶点的不同。其中视觉矩阵(view matrix)是GL_MODELVIEW逆矩阵的转置矩阵和标准向量(Normal vector是)相乘所得,即:

更多关于标准向量变换(Normal Vector Transformation)的资料可连接到此处: Coordinates)

视觉坐标系和GL_PROJECTION矩阵相乘,得到剪切面坐标系。GL_PROJECTION矩阵定义了可视的空间(截头锥体)(译注:关于什么是截头锥体,我还查了下资料,发现它是这个样子的:

,这个就是投影的效果啦)以及顶点数据如何投影到屏幕上(视角或者正交化(orthogonal)),它被称为剪切面坐标系的原因是(x,y,z)变换之后

要和±w比较。更多关于GL_PROJECTION矩阵的资料可见: division)

.它更像是窗口坐标系,只是还没有转换或者缩小到屏幕像素。其中它取&#;范围在3个轴向从-1到1标准化了。

窗口坐标系(Window Coordinates)/屏幕坐标系(Screen Coordinates)

将标准化设备坐标系(NDC)应用于视口转换。NDC将缩小和平移以便适应屏幕的透视。窗口坐标系最终传递给OpenGL的管道处理变成了fragment。glViewPort()函数

用来定义最终图片映射的投影区域。同样,glDepthRange()用来决定窗口坐标系的z坐标。窗口坐标系由下面两个方法给出的参数计算出来

glViewPort(x,y,w,h);

glDepthRange(n,f);

视口转换公式很简单,通过NDC和窗口坐标系的线性关系得到:

OpenGL 转换矩阵

OpenGL使用4x4矩阵变换。注意,这个元素存储在1D数组中,这些元素按列顺序排列。假如你想以行为顺序排列,你需要转置该矩阵。

OpenGL有4中不用的矩阵:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE和GL_COLOR.你可以在

代码中使用glMatrixMode()函数改变当前的类型。例如,为了选择GL_MODELVIEW矩阵,可以这样:

glMatrixMode(GL_MODELVIEW);

---------------------------------------------------------------------------------------------------------------------------------------------

Model-View 矩阵(GL_MODELVIEW)

GL_MODELVIEW矩阵在一个矩阵中包含view矩阵和model 矩阵,为了变换view(camera),你需要将整个

场景施以逆变换。gluLookAt()用来设置viewing变换。

最右边的三个矩阵元素 (m, m, m) 是用作位移变换的。m元素是齐次坐标。(何为齐次坐标,参见: m1, m2),(m4, m5, m6)和(m8, m9, m) 是用作欧拉变换和仿射变换,例如glRotate(),缩放glScalef().

注意这三个元素集实际上指得是3个正交坐标系:

(m0, m1, m2): &#;X 轴,向左的向量(left vector)(估计是相对屏幕自己来说),默认为(1,0,0)

(m4, m5, m6) : &#;Y轴,向上的向量(up vector),默认为(0,1,0)

(m8, m9, m): &#;Z轴,向前的向量,默认为(0,0,1).

4 columns of GL_MODELVIEW matrix

我们能够不使用OpenGL变换函数,直接构造GL_MODELVIEW矩阵。下面有一些有用的代码构建

GL_MODELVIEW矩阵

1. Angles to Axes

2. Lookat to Axes

3. Matrix4 class

OpenGL 矩阵变换(讲的太好了~!)(opengl 旋转矩阵)

注意,OpenGL在多种变换同时施加到顶点上时以相反的顺序矩阵相乘。例如,假如一个顶点先以MA

进行变换。OpenGL首先在乘以顶点之前运用MB x MA 。故最后的变换出现在矩阵相乘之前,最先的变换在最后出现。

投影矩阵Projection Matrix(GL_PROJECTION)

GL_PROJECTION矩阵用来定义截锥体。该截锥体决定了那些对象或者对象的哪些部分将会被裁剪掉。同样,它也决定着3D场景怎样投影到屏幕中

(关于怎样构建投影矩阵,请查看

right, bottom, top, near, 和far 平面。截锥体的8个顶点如下所示:

OpenGL Perspective Viewing Frustum

远端平面(后面)的顶点能够简单地通过相&#;三角形的比率计算出来。例如,远端平面的左侧可以如下计算:

对于正交投影,ratio为1,所以远端平面的left,right,bottom和top&#;都与近端平面的&#;相同。

同样,你也可以使用gluPerspective()和gluOrtho2D()函数,但是传递更少的参数。gluPerspective()只需要4个参数:视图的垂直区域(vertical field of view(FOV)),

width/height的ratio,还有近端平面和远端平面的距离。下面代码使用gluPerspective()和glFrustum()实现同样的功能:

OpenGL正交的截锥体

OpenGL Orthographic Frustum

然而,假如你想要一个非对称的视觉空间,你可以直接使用glFrustum()。例如,

假如你想要呈现一个大的场景到2个相邻的屏幕,你可以截断截锥体变成2个不对称的截锥体(左和右)。然后,

呈现每个截锥体场景。

(这句话太不好翻译了,原位如下:

For example, if you want to render a wide scene into 2 adjoining screens, you can break down the frustum into 2 asymmetric frustums (left and right). Then, render the scene with each frustum.

An example of an asymmetric frustum

纹理矩阵(GL_TEXTURE)

纹理坐标(s,t,r,q)在任何纹理映射之前乘以GL_TEXTURE矩阵所得,默认是恒等的。所以纹理映射到物体的位置将正好是你赋&#;给纹理坐标的位置。

通过改变GL_TEXTURE,你可以滑动,旋转,拉伸或者伸缩纹理。

颜色矩阵(GL_COLOR)

颜色部分是通过乘以GL_COLOR矩阵所得。该矩阵用于颜色空间和颜色组件的变换。(原位如下:It can be used for color space conversion and color component swaping)

颜色矩阵并不是通用的,需要GL_ARB_imaging扩展(什么是GL_ARB_imaging扩展?求解)

其他矩阵例子

glPushMatrix()——将当前的矩阵压入矩阵栈

glPopMatrix()——从当前的矩阵栈中弹出当前的矩阵

glLoadIdentity()——设置当前矩阵为等同矩阵

glLoadMatrix{fd}(m)——将当前矩阵替换成矩阵m

glLoadTransposeMatrix{fd}(m)——将当前矩阵换成其转置矩阵

glMultMatrix{fd}(m)——将当前矩阵乘以矩阵m,并且更新当前矩阵

glMultTransposeMatrix{fd}(m)——将当前矩阵乘以其转置矩阵,并且更新当前矩阵

glGetFloatv(GL_MODELVIEW_MATRIX, m) ——将GL_MODELVIEW矩阵的个&#;加载到m中

例子1:ModelView Matrix

这个demo应用显示怎样使用glTranslatef()和glRotatef()操作GL_MODELVIEW

下载链接:

matrixModelView.zip:

X .6&#;) matrixModelView_mac.zip: demo应用显示了如何使用glFrustum()和glOrtho()函数操作投影变换。

源码和二进制文件下载的链接:

matrixProjection.zip: X .6&#;):

4.3 投影变换 投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。投影也是使用矩阵来实现的。计算一个用

shader之旅-7-平面阴影(planar shadow) 根据《real-timeshadow》这本书第二章中的推导,实现了最简单的阴影技术。planarshadow通过一个投影矩阵将被灯光照射的物体的顶点沿着光线方向投影到接

OpenGL三角形的双面不同颜色的绘制 对于一个三角形,我要给它正反面不同的颜色。然后通过旋转,看出它的效果。我只想到了2种方法,下面我来写一下这两种方法。第一种方法,通过角

标签: opengl 旋转矩阵

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

上一篇:opengl 投影 glOrtho gluPerspective gluLookAt 转载不同作者的理解(opengl 投影矩阵)

下一篇:4.3 投影变换(投影变换的使用方法)

  • 附列资料第8栏
  • 年度企业所得税会计分录怎么做
  • 中级会计实务主观题
  • 应收账款的期末余额在借方表示什么意思
  • 税务处理决定书与税务处罚决定书
  • 固定资产一次性计入费用的账务处理
  • 养殖企业如何做销售
  • 企业租给企业房产税税率
  • 计提存货减值准备怎么算
  • 耕地占用税的账务处理
  • 无形资产摊销以前年度摊多了
  • 企业租入固定资产发生的改良支出计入什么科目
  • 多计费用以前年度损益调整
  • 开发票时税点开里怎么算?
  • 进项税额转出需要发票吗
  • 个人所得税变动率计算公式为多少
  • 个体工商户的税收优惠政策有哪些
  • 员工因公负伤期间公司怎么开工资
  • 医保断缴多久后余额不能用
  • 销售购物卡如何开票
  • 资产负债表中的预付款项目应根据什么填列
  • 小规模企业税务简易注销
  • 外出经营地预交税金归主管税务所管吗
  • 发票未到的费用怎么处理
  • 公司生产的产品
  • vmware10虚拟机安装
  • 仓储费用结算方式有哪些
  • php技巧
  • 取得增值税发票丢了怎么是好
  • php中imagecreatefromjpeg
  • 加里西亚省
  • 留抵税额进项构成比例
  • 税金及附加的含义
  • thinkphp5框架介绍
  • 非常好看的头像
  • 视觉slam十四讲笔记
  • 三方债权债务抵销
  • 固定资产多少可以一次摊销
  • 预收账款的账务处理摘要
  • 进项税额转出会影响当期纳税吗?
  • 帝国cms模型
  • protobuf 文档
  • 会务费如何入账
  • 无偿提供建筑服务缴纳增值税
  • 销售退回如何做账务处理
  • 纳税人未抄报税怎么办
  • 股权支付会计处理
  • 小规模企业与一般纳税人企业最新划分标准及税率
  • 残疾人保障金的工资按实发还是应发
  • 收到技术服务费计入什么科目
  • 什么是现金等价物列举
  • 房地产企业资产负债率的正常范围
  • mysql 5.7.21安装教程
  • win7怎么把桌面图标显示出来
  • intel x86 arm
  • 重装系统东西
  • winxp和win7之间的系统
  • win7怎么翻转桌面
  • WebProxy.exe - WebProxy是什么进程
  • win10系统如何关闭屏保功能
  • Ubuntu安装VMware tools
  • win7复制文件到system32没有权限
  • 4G内存时linux的mtrr表不正确的解决
  • win10ldac怎么开启
  • python中的json
  • cocos2dx 2.2.2
  • jQuery Password Validation密码验证
  • 编写一个bash脚本程序,用for循环实现
  • Emeditor与dos(cmd)经典使用技巧之批量生成网页
  • shell脚本实现文件管理
  • vuex按需加载
  • python的设置
  • jquery自定义函数
  • jq获取table元素
  • 税务咨询电话是什么
  • 重庆沙坪坝区沙磁巷幼儿园
  • 关于地税代收工会经费工作实施办法
  • 个人所得税全员申报什么时候开始的
  • 自然人电子税务局
  • 消费税的税率只有比例税率和定额税率两种判断题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设