浅谈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

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

8.投影矩阵

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

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

时间: 2024-10-15 10:29:34

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

浅谈 OpenGL 中相关阻塞问题

昨天我遇到一个问题,问题如下: 我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2 CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在GPU端使用CUDA计算时发现纹理为空(数据全是0值),但是如果将两张纹理的数据传回CPU端,打印出来是有值的,且是正确的值.如果在CUDA并行计算之前先将纹理数据传回CPU,这时发现CUDA并行计算中纹理是正常有值的...这个现象很奇怪,我开始想了想会不会是阻塞啥原因,但我对OpenGL阻塞过程不了解,没看到

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

浅谈算法和数据结构(1):栈和队列

浅谈算法和数据结构(1):栈和队列 2014/11/03 ·  IT技术                                         · 2 评论                                      ·  数据结构, 栈, 算法, 队列 分享到: 60 SegmentFault D-Day 2015 北京:iOS 站 JDBC之“对岸的女孩走过来” CSS深入理解之relative HTML5+CSS3实现春节贺卡 原文出处: 寒江独钓   欢迎分享原创

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

浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK: 其它  全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,会走很多弯.独立工作室Sheado.net公司的Chad Ata在博客中分享了他们从一开始进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助.

COCOS2DX 与 UNITY3D 的发展浅谈

浅谈: 目前游戏界的发展趋势逐渐把游戏引擎当做一个比较成熟的中间件了,许多toolset和基础构建在不同游戏中是相通的,曾经有人比喻游戏引擎在不久的将来会像现在的操作系统一样,呈现出一种比较稳定的状态(比如现在比较活跃的操作系统只有Widnows和Linux了). 如果追求性能的话,实际上可以重写Unity或者其他引擎中的Renderer和Shader来进行改进,所以追求性能不能成为使用自研引擎的借口了. 而且,国内的许多公司的引擎,比如畅游. 也只是把ORGE啥的改一改, toolset和平台

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

浅谈html标签

浅谈html各常用标签用法 标题标签:<h1>-<h6>来表示,使标题字体变粗. <br />换行标记 <hr />水平分隔符 &nbsp空格符 &copy版权符 <a href>a标签超链接 href可接链接地址 <p>段落标签<blockquote>引用标签及可用做缩进 <table>表格中的<ul>无序列表<ol>有序列表<dl>自定义列表<row