【OpenGL】03 - OpenGL 坐标变换中的各种矩阵
2014-12-07 23:33
330 查看
基本都是shader 中的矩阵,这里分别列出来,简单说明一下, 作为一个小小的总结。
后续随着学习的深入,应该会持续的在本文章中增加新内容(大概吧)。
一、gl_ModelViewMatrix
OpenGL中的坐标变换,简单来说是这样四个坐标系间的三次变换:
1、局部坐标系(所谓的“对象空间” Object Space,也称为模型空间Model Space),我们设置的glVertex,就是这个坐标系下的值。
2、世界坐标系(World Space)。通过 glTransfer、glRotate等,会将局部的点放置到世界中来。这个过程称之为 “模型变换” Model Transfer
3、视点坐标系(或者"眼睛空间" Eye Space)。通过 gluLoockAt,将世界上的物品,放置到以观察者为原点的镜头中来。这个过程称之为“视图变换”,Viewing Transfer
4、投影坐标系(或者“裁减空间” Clip Space)。通过glOrtho、glFrustum、gluPerspective等,将镜头中的物体,映射到照片上来。这个过程称之为"投影变换" Projection Transfer。
(具体的数学推导可见本人另一篇文章 /article/8178553.html ,需要注意的是,直到视点坐标系,都是 “没有” 所谓近大远小的透视效果的。)
这里想要说明的是,为什么会有这样一个矩阵?为什么要将View 和 Model 变换合并,却又不合并 Projection?
最直接的好处是:方便光照的计算。
这两步变换,都不会改变坐标的 w 值,且其第四行总是为[0, 0, 0, 1]。但是在投影变换中,如果是透视投影,要复杂的多得多。
因此,在这个阶段,法向量矩阵是比较容易获取的。所以OpenGL运算中,是在模型视图变换之后,进行光照计算的。
而由于光照在shader中的重要性,提供这样一个矩阵也是理所当然的。
二、gl_ProjectionMatrix
这个真心没什么好说的。
三、gl_ModelViewProjectionMatrix
gl_ProjectionMatrix * gl_ModelViewMatrix (矩阵乘法不满足交换律,注意左右)。 一般更经常使用 ftransfer()。
四、gl_NormalMatrix
“gl_ModelViewMatrix左上角的3*3子集的逆转置”。
可以参考
《GLSL学习 -- gl_NormalMatrix》,已经说明的非常清楚。这里只补充一点,即为什么只需要取左上角的 3*3 子集。
这就需要知道gl_ModelViewMatrix 中,左上角3*3以外的部分是做什么用的呢?其实只标明了 glTransfer 的效果。而 glTransfer 对于法向量显然是没有影响的。所以当然可以忽略这一部分。
后续随着学习的深入,应该会持续的在本文章中增加新内容(大概吧)。
一、gl_ModelViewMatrix
OpenGL中的坐标变换,简单来说是这样四个坐标系间的三次变换:
1、局部坐标系(所谓的“对象空间” Object Space,也称为模型空间Model Space),我们设置的glVertex,就是这个坐标系下的值。
2、世界坐标系(World Space)。通过 glTransfer、glRotate等,会将局部的点放置到世界中来。这个过程称之为 “模型变换” Model Transfer
3、视点坐标系(或者"眼睛空间" Eye Space)。通过 gluLoockAt,将世界上的物品,放置到以观察者为原点的镜头中来。这个过程称之为“视图变换”,Viewing Transfer
4、投影坐标系(或者“裁减空间” Clip Space)。通过glOrtho、glFrustum、gluPerspective等,将镜头中的物体,映射到照片上来。这个过程称之为"投影变换" Projection Transfer。
(具体的数学推导可见本人另一篇文章 /article/8178553.html ,需要注意的是,直到视点坐标系,都是 “没有” 所谓近大远小的透视效果的。)
这里想要说明的是,为什么会有这样一个矩阵?为什么要将View 和 Model 变换合并,却又不合并 Projection?
最直接的好处是:方便光照的计算。
这两步变换,都不会改变坐标的 w 值,且其第四行总是为[0, 0, 0, 1]。但是在投影变换中,如果是透视投影,要复杂的多得多。
因此,在这个阶段,法向量矩阵是比较容易获取的。所以OpenGL运算中,是在模型视图变换之后,进行光照计算的。
而由于光照在shader中的重要性,提供这样一个矩阵也是理所当然的。
二、gl_ProjectionMatrix
这个真心没什么好说的。
三、gl_ModelViewProjectionMatrix
gl_ProjectionMatrix * gl_ModelViewMatrix (矩阵乘法不满足交换律,注意左右)。 一般更经常使用 ftransfer()。
四、gl_NormalMatrix
“gl_ModelViewMatrix左上角的3*3子集的逆转置”。
可以参考
《GLSL学习 -- gl_NormalMatrix》,已经说明的非常清楚。这里只补充一点,即为什么只需要取左上角的 3*3 子集。
这就需要知道gl_ModelViewMatrix 中,左上角3*3以外的部分是做什么用的呢?其实只标明了 glTransfer 的效果。而 glTransfer 对于法向量显然是没有影响的。所以当然可以忽略这一部分。
相关文章推荐
- 03 - OpenGL 坐标变换中的各种矩阵
- OpenGL中的坐标变换和矩阵
- 《OpenGL游戏程序设计》学习笔记---第五章坐标变换和OpenGL矩阵
- 《OpenGL游戏程序设计》学习笔记---第五章坐标变换和OpenGL矩阵
- 说说我对OpenGL坐标变换几个关键点的理解
- OpenGL中视口变换的矩阵求解
- 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)(二)——投影变换
- OPENGL坐标 变换
- opengl中GL_MODELVIEW下的变换矩阵的说明
- 基于VC++的OpenGL编程讲座之坐标变换
- 矩阵的坐标变换
- 矩阵的坐标变换(转)
- 矩阵的坐标变换(转)
- OpenGL 的空间变换(上):矩阵在空间几何中的应用
- OpenGL实验(二)桌子的坐标系变换 矩阵 视图
- 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)
- OpenGL 之 坐标变换
- OpenGL学习脚印: 坐标变换过程(vertex transformation)
- ogre, dx, opengl坐标矩阵
- (转)思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...