浅谈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异常 以前虽然知道一 ...
随机推荐
- ubuntu下搭建samba服务器
samba是用于linux和windows下文件共享的协议 首先,更新源并安装samba sudo apt-get update sudo apt-get install samba 然后创建一个共享 ...
- php 无法连接mysql
sql_connect,sqli_connect, 或new sqli() 无法建立mysql连接 1. php.ini 中 ; extension=php_mysql.dll 和 ; extensi ...
- HDU 3555 Bomb
RT. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- React Native组件之Switch和Picker和Slide
React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性 ...
- phalcon:跟踪sql语句
在phalcon里有一个\Phalcon\Db\Profiler 类,这个类可以用来记录sql语句并计算消耗的时间.那么如何使用它呢? 手册里其实已经提供了方法,总结如下: 1.向$di里注册prof ...
- C++ 文件读取
#include <iostream> #include <fstream> #include <string> using namespace std; int ...
- LintCode Binary Tree Inorder Traversal
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- cf340D Bubble Sort Graph
link:http://codeforces.com/problemset/problem/340/D 感觉很好的一道题目. 认真思考,发现,逆序的数字对一定有边相连.所以,题目要求没有边相连的最大的 ...
- js中的this指针(二)
在 js 中声明并定义一个函数后,除了定义时传入的形式参数,函数还会接收到 2 个附加的参数:this 和 arguments. this 指针的值取决于调用时的模式. 当这个函数被保存为对象的一个属 ...
- SQL 表 和字符串 互转 (行列互转)
-- 表转字符串 )) ,,'') --字符串转表 ),)) ,) )) AS BEGIN DECLARE @StartIndex INT --开始查找的位置 DECLARE @FindIndex I ...