在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE。

以下主要描述GL_MODELVIEW(模型视图矩阵)的个人理解。

在OpenGL中空间中点的三维坐标是使用行向量表示的,虽然与列向量相比存储结构并没有发生变化,但在坐标变换(即矩阵乘法)中会有很大不同。大家都知道一个4X4的矩阵可以表示三维坐标的平移,旋转变换。例如一矩阵R表示一个旋转加平移变换,空间中一点P(x, y, z),如果坐标使用列向量表示,则变换过程为

如果坐标使用行向量表示,则变换过程为上述矩阵的转置

因此,OpenGL中变换矩阵采用的是右乘的方式,并且其需要的变换矩阵其实是真正变换矩阵的转置(前提是矩阵在数组中采取的是以行为主的形式,即先存储完矩阵的一行,接下来再存储矩阵的下一行)。

函数glLoadMatrixf(const GLfloat *m)输入的矩阵其实是变换矩阵R的转置

如果先后对空间中一点P(x, y, z)作多次变换,设先后的变换矩阵分别为A,B,C,则在OpenGL中应当如何输入变换矩阵呢?当坐标使用列向量表示时,变换过程为

当坐标使用行向量表示时,变换过程为

因此,OpenGL中,最先变换的矩阵应当最后与当前矩阵相乘,并且乘的是变换矩阵的转置。下面我以一个例子来说明上述变换。注意下面描述中的x,y,z轴实际上指的是相机坐标系中的U,V,N轴。OpenGL中,屏幕中所呈现的视平面其实是UOV平面,屏幕上方为V轴正方向,屏幕右方为U轴正方向,屏幕由里到外为N轴正方向。因此视线方向总是沿N轴负方向。

函数rotate(float angle, float x, float y, float z)是让坐标点绕向量(x, y, z)旋转angle角度,旋转方向符合右手螺旋定则。函数translate(float x, float y, float z)是让坐标点沿向量(x, y, z)平移其模长的距离。上述两个函数生成的都是变换矩阵的转置,并且实现的都是,其中M是当前矩阵,R是变换矩阵。

 matrixView.identity();              //transform matrixView to an identity
matrixView.translate(, , -r);
glLoadMatrixf(matrixView.get());

上述矩阵是由一个单位阵加沿负N轴的平移转换而成,假设在世界坐标系中有一茶壶,其中心位于世界坐标系的原点,在上述变换矩阵下如下图:

图中,红,绿,蓝箭头分别为世界坐标系的x,y,z轴。下面是让该茶壶先后沿x,y,z轴旋转90度的代码和结果截图

 matrixView.identity();              //transform matrixView to an identity
matrixView.rotate(, , , ); //cameraAngleX
matrixView.translate(, , -r);
glLoadMatrixf(matrixView.get());

 matrixView.identity();              //transform matrixView to an identity
matrixView.rotate(, , , ); //cameraAngleX
matrixView.rotate(, , , ); //cameraAngleY
matrixView.translate(, , -r);
glLoadMatrixf(matrixView.get());

 matrixView.identity();              //transform matrixView to an identity
matrixView.rotate(, , , ); //cameraAngleX
matrixView.rotate(, , , ); //cameraAngleY
matrixView.rotate(, , , ); //cameraAngleZ
matrixView.translate(, , -r);
glLoadMatrixf(matrixView.get());







OpenGL中坐标系的理解(一)的更多相关文章

  1. openGL中的原理理解1---一个视图需要支持OGL需要配置,GLenbalView的理解

    OpenGL的绘图机制是 OpenGL的绘图方式与Windows一般的绘图方式是不同的,主要区别如下: (1)Windows采用的是GDI(Graphy Device Interface 图形设备接口 ...

  2. OpenGL中各种坐标系的理解[转]

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

  3. OpenGL中各种坐标系的理解

    转载:https://blog.csdn.net/meegomeego/article/details/8686816 OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系以屏幕中心为原 ...

  4. 关于opengl中的矩阵平移,矩阵旋转,推导过程理解 OpenGL计算机图形学的一些必要矩阵运算知识

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12166896.html 为什么引入齐次坐标的变换矩阵可以表示平移呢? - Yu Mao的回答 ...

  5. OpenGL中的像素包装理解

    OpenGL中的像素包装理解 像素包装 位图和像素图很少会被紧密包装到内存中.在许多硬件平台上,考虑到性能的原因位图和像素图的每一行的数据会从特殊的字节对齐地址开始.绝大多数编译 器会自动把变量和缓冲 ...

  6. (原)关于OpenGL中的几个坐标系统的理解

    在我们使用opengl做图像处理的过程中,其中必不可少的基本都会用到顶点着色器和片元着色器. 完整的渲染管线图: 那么在这两个着色器程序中,我们需要绘制我们的图像的时候,他们的坐标和位置对应关系是如何 ...

  7. CSharpGL(6)在OpenGL中绘制UI元素

    CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...

  8. OPenGL中三维图形的矩阵变换

    对于二维的图形开发,拿简单的图片显示来说,我们主要的目的:就是在一块显示buffer中,不停的把每个像素进行着色,然后就可以绘制出来了.为了速度,很多其他的加速方法,但原理基本上就是这样了. 很直观, ...

  9. OpenGL中glPushMatrix和glPopMatrix的原理

    glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...

随机推荐

  1. oracle Entity db.Database.SqlQuery ORA-01843: 无效的月份

    原因是oracle的日期格式化格式和本地语言环境的日期格式不一致导致的. 一般情景为oralce格式为英文格式 本地服务器或者开发机的环境为中文环境. 使用Dbcontext 实例一般不会有问题. 但 ...

  2. 【codeforces 749E】 Inversions After Shuffle

    http://codeforces.com/problemset/problem/749/E (题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ...

  3. Python学习总结 03 Plotly 学习总结

    一 Plotly 简介 Plotly是另一个免费进行数据分析和绘制图表的APP,建立在d3.js上. Plotly图可下载为SVG,EPS或PNG格式,并简单地导入到Illustrator或者Phot ...

  4. C#基础强化-进程操作

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  5. HTML基础标签入门

    HTML基础标签 昨天学习了一些HTML的基本标签以及基本属性: HTML是一种超文本标记语言,其中PHP是世界上最好的语言(增加学习的动力荣誉感). HTML文档里包含三部分: <html&g ...

  6. 了不起的全能MAC系统监测工具iStat Menus 5下载

    iStat Menus 5 是一款由软件开发商 Bjango 制作的 System Monitor (工具,也是笔者电脑里的必装应用之一,它能让用户最快速.最直观地了解到几乎各硬件所有的运行状态,其中 ...

  7. Php compiler for .NET framework

    https://phalanger.codeplex.com http://tomasp.net/blog/ducktyping-in-phalaner.aspx/ https://visualstu ...

  8. 第一章 Part 2/2 Git 一览

    被跟踪文件(Tracked files) 被跟踪文件是 Git 管理的工作目录 (存储库) 中的文件.当你添加新文件或使更新现有文件时,Git都会跟踪这些文件变化.在某个时间点,你将通过命令将这些文件 ...

  9. Eclipse中的搜索快捷键

    Ctrl+H 全文搜索Ctrl+F 当前文件Ctrl+Shift+T 类文件Ctrl+Shift+R 资源文件

  10. 盒子 offsetLeft、offsetTop、offsetWidth、getBoundingClientRect等属性解释

    offsetLeft 获取的是忽略 margin 当前元素距离上一级父节点(有没有设置position,有的话依据父节点,没有的话依据页面最左端这时候不管滚动条移到哪) 当前元素向左的位置 记住它会将 ...