在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. 用hibernate tools生成对应的sql应用代码

    参考资料: eclipse在线配置hibernate tools http://jingyan.baidu.com/article/db55b609959d154ba20a2f5d.html [图]H ...

  2. 深入浅出 Redis client/server交互流程

    综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...

  3. 了解PHP中的register_shutdown_funcion

    (PHP 4, PHP 5, PHP 7) register_shutdown_function - Register a function for execution on shutdown 执行P ...

  4. Fixing DSDT

    https://clover-wiki.zetam.org/Fixing-DSDT#dsdt-mask_fixdisplay_0100-bit-8

  5. Struts2--属性设置方式

    Struts2自动获取/设置数据的方式一共分为两种 属性驱动(FieldDriven) 模型驱动(ModelDriven) 属性驱动 属性又分为两种: |- 基本数据类型 |- JavaBean属性类 ...

  6. linux下, 再次遇到使用thinkphp的模板标签时,报错used undefined function \Think\Template\simplexml_load_string() 是因为没有安装 php-xml包

    linux下, 使用thinkphp的模板标签,如 eq, gt, volist defined, present , empty等 标签时, 报错: used undefined function ...

  7. js 也来 - 【拉勾专场】抛弃简历!让代码说话!

    前些日子谢亮兄弟丢了一个链接在群里,我当时看了下,觉得这种装逼题目没什么意思,因为每种语言都有不同的实现方法,你怎么能说你的方法一定比其他语言的好,所以要好的思路 + 好的语言特性运用才能让代码升华. ...

  8. 解决qq互联回调地址错误redirect uri is illegal(100010)的方法,不同于网上大部分方法

    我是在用ecshop自己搭建的一个网店系统安装了第三方登录的插件,包括qq登录插件.网上大部分情况都是discuz论坛的这个回调地址出错及解决办法.所以在我出错的时候参考他们的办法并不管用.但是在后面 ...

  9. 【JSP错误总结】无法访问jsp页面

    运行环境:window 7 64位  JSP服务器 tomcat 7 现象:无法访问JSP页面,如下图所示:

  10. Java 压缩/ 解压 .Z 文件

    1.问题描述 公司项目有需要用 JAVA 解压 .z文件. .z 是 unix 系统常见的压缩文件. 2.源码 import com.chilkatsoft.CkUnixCompress; impor ...