浅谈OpenGL变换矩阵
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变换矩阵的更多相关文章
- 浅谈 OpenGL 中相关阻塞问题
昨天我遇到一个问题,问题如下: 我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2 CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在G ...
- 浅谈OpenGL之DSA
今天准备写一篇文章简单介绍一下OpenGL4.5引入的一个新的扩展ARB_direct_state_access,这个扩展为OpenGL引入了一个新的特性就是Direct State Acess,下文 ...
- 【转载】浅谈游戏开发之2D手游工具
浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android 程序设计: 其它 编程语言: 引擎/SDK ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...
- Qt3升至Qt4需要注意的几件事项浅谈
Qt3升至Qt4需要注意的几件事项浅谈 公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
随机推荐
- Android webservice的用法详细讲解
Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...
- easyui datagrid
function initData(){ //数据列表 yftjsy=$("#yftjsy").datagrid({ url: '', fit:true, showFooter:f ...
- Day9 summary
昨天又翻出收藏夹里一个叫“谷子粒”的bloghttp://1.guzili.sinaapp.com/?p=128#more-128,链接是博主整理的机器学习方面的热点微博,相当的干货.要说我是从知乎对 ...
- 实时刷新Winform中Label的Text
最直白的例子: private void btnStart_Click(object sender, EventArgs e) { ; ) { labelTime.Text = i.ToString( ...
- Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)
Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四) 在Android Priority Job Queue (Jo ...
- Android 开发错误信息001
Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessExceptio ...
- yii使用MongoDB作为数据库服务软件[win7环境下](2)
11.测试php连接并对mongodb进行简单的操作,下载RockMongo对应的数据库管理软件放到webserver软件相关的目录下,例如: 12.打开对应的url[你还可以接着对数据库进行相应的操 ...
- Qt 自定义 滚动条 样式
今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...
- jquery 中的几个函数方法
1.$.map(data,function(item,index){return XXX})处理每一个元素的函数.第一个参数是数组元素,第二个参数是该元素的索引值. 遍历data数组中的每个元素,并按 ...
- Sea.js学习2——Sea.js的API 快速参考
(7 个接口是最常用的) 一.seajs.config:用来对 Sea.js 进行配置. seajs.config({ // 设置路径,方便跨目录调用 paths: { 'arale': 'https ...