OpenGL中使用的矩阵全为列向量为主的矩阵。

参考OpenGL变换网站为  http://www.songho.ca/opengl/gl_transform.html

1.什么是GL_MODELVIEW矩阵?

GL_MODELVIEW矩阵是Model矩阵和View矩阵的乘积,即M_modelview = M_view * M_model。

model矩阵用于从物体坐标系到世界坐标系的转换,一般是通过旋转、平移或缩放得到。

view矩阵用于从世界坐标系到摄像机坐标系的转换。

顶点的矩阵变换如下所示:

OpenGL中的modelview矩阵(列向量为主):

2.法向量的坐标转化

与图1中顶点变换不同,法向量从物体坐标系变换到摄像机坐标系是通过M_modelview逆矩阵的转置实现的。

法向量的矩阵变换如下所示:

到此为止,很多人会有疑问:法向量的变换公式是如何得到呢?

其实法向量变换的公式是根据平面方程的得到,具体推导过程如下:

已知法向量n(nx,ny,nz,nw),假设平面上的一点为v(x,y,z,w),则平面方程为nx * x + ny * y + nz * z + nw * w = 0;

将法向量与点的关系转化为矩阵表达形式为:

通过GL_MODELVIEW矩阵转换得到:

右边的部分是将顶点从物体坐标系转换到摄像机坐标系,而左边的部分是将法向量转换到摄像机坐标系的表达式,因此

即:

参考网站为  http://www.songho.ca/opengl/gl_normaltransform.html

3.标准设备空间,英文为Normalized Device Coordinates(Or NDC),它是在投影坐标系(剪裁空间)中经过透视除法得到的,其x,y,z的范围均为[-1,1]。

透视除法英文为perspective division。

4.glViewport(x,y,w,h) command is used to define the rectangle of the rendering area where the final image is mapped.

glViewport方法用于定于渲染区域的矩形。

5.glDepthRange(n,f) command is used to determine the z value of the window coordinates.

glDepthRange方法用于定义屏幕坐标的z值。

6.根据4,5可以得到屏幕坐标(screen coordinates):

7.当多个矩阵共同起作用时,一定要注意矩阵乘法的先后顺序,不同的顺序得到的结果也不同,例如:

顶点V先进行矩阵M1变换,再经过矩阵M2变换得到顶点V',则在OpenGL中的表达形式为:

V' = M2 * M1 * V

 // 注意:物体实际的顺序为先进性平移再进行旋转
glRotatef(angle, 1, 0, 0); // 将物体绕X轴旋转anlge
glTranslatef(x, y, z); // 将物体平移到(x, y, z)
drawObject();

8.投影矩阵

OpenGL中的投影方式分为两种:透视投影和平行投影(也叫正交投影),是通过left,right,bottom,top,near,far六个参数计算得到的。

具体内容可参见下一篇博客,未完待续.....

浅谈OpenGL变换矩阵的更多相关文章

  1. 浅谈 OpenGL 中相关阻塞问题

    昨天我遇到一个问题,问题如下: 我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2 CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在G ...

  2. 浅谈OpenGL之DSA

    今天准备写一篇文章简单介绍一下OpenGL4.5引入的一个新的扩展ARB_direct_state_access,这个扩展为OpenGL引入了一个新的特性就是Direct State Acess,下文 ...

  3. 【转载】浅谈游戏开发之2D手游工具

    浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK ...

  4. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  5. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  6. Qt3升至Qt4需要注意的几件事项浅谈

    Qt3升至Qt4需要注意的几件事项浅谈 公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先 ...

  7. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  8. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  9. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

随机推荐

  1. 修改crontab默认的编辑器

    1.crontab默认的编辑器为nano; 2.修改为vi或其他编辑器 export EDITOR="/usr/bin/vim" ; crontab -e

  2. fastcoloredtextbox 中文不重叠

    DrawLineChars方法: private void DrawLineChars(PaintEventArgs e, int firstChar, int lastChar, int iLine ...

  3. JSP基础总结 脚本元素

    JSP脚本元素 1.  JSP声明语句 JSP声明语句以<%!开始,以%>结束,其语法格式为:<%! 声明语句 %> 使用声明语句的变量为全局变量,也就是说,当有多个用户在执行 ...

  4. 解决 Redis Cluster 扩容故障

    双11啦,为了给商品详细redis进行扩容,扩容动作就放在了今天晚上进行,很不巧,今天晚上是个多事之秋: 做了次数据恢复,做了次集群迁移,在迁移的时候还踩了个坑! 集群中有个节点挂掉了,并且报错信息如 ...

  5. Scramble String

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  6. 在yii中使用多个数据库

    背景: 对于一个大公司拥有多个分公司的应用场景下,我们通常需要配置多个sub-database(子数据库)来存储不同的数据纪录. 配置步骤: 1.在application骨架里面的主配置文件main. ...

  7. 将数据集做成VOC2007格式用于Faster-RCNN训练

    1.命名 文件夹名VOC2007.图片名六位数字.将数据集相应的替换掉VOC2007中的数据. (Updated development kit, annotated test data )   2. ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(二):所有脚本组件的基类 -- MonoBehaviour的前世今生

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了GameObject,C ...

  9. Mysql分区简述

    1. 数据量大的时候 mysql分表非常常用,但是mysql还可以分区. 2. 分区就是把同一张表放在不同的磁盘文件上, 当查询的时候首先定位是哪个分区(查询的时候一定要用到分区的key) 3. 分区 ...

  10. python检测字符串的字母

    python3判断字符串内是否含有字母,并打印字母出来 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import re a = "8a2656 ...