`
java-mans
  • 浏览: 11741382 次
文章分类
社区版块
存档分类
最新评论

OpenGL学习笔记-OpenGL的变换和矩阵

 
阅读更多

OpenGL的变换和矩阵

1)指定矩阵类型
OpenGL中使用glMatrixMode指定当前要设置的矩阵类型,常用的参数是GL_PROJECTION和GL_MODELVIEW,还有GL_TEXTURE。OpenGL将视点变换(即摄像机变换)和模型变换(即物体变换和世界变换)合二为一了。glMatrixMode指定的模式一但指定就不会变除非再次调用glMatrixMode,所以一般在reshpae里设定GL_PROJECTION之后再使用glMatrixMode指定当前矩阵类型为GL_MODELVIEW,那么以后设置的变换矩阵就都是模型视点矩阵。
2)模型视点矩阵设定顺序
在设定模型视点矩阵时,如果使用gluLookAt设定视点矩阵,必须先调用gluLookAt,然后再设定各个模型变换矩阵。而且由于每帧重新刷新,矩阵不会自动清除(矩阵设定都是右乘到栈顶),所以每帧一开始要使用glLoadIdentity将模型视点矩阵设成单位阵,然后用gluLookAt设定视点矩阵,然后是各模型变换矩阵。
3)变换矩阵设定和执行顺序
由于OpenGL使用的是向量右乘矩阵(向量是列向量,矩阵是列主矩阵),V'=M X V,而每次使用glTranslate*,glScale* ,glRotate*等的时候是将所指定的矩阵右乘到当前矩阵栈栈顶的矩阵上,比如原栈顶矩阵为I,使用glTranslate*指定矩阵T,那么当前变换矩阵就是IxT,如果再用glScale*指定一个缩放矩阵S,那么当前矩阵就是IxTxS,用来变换向量就变成 V' = IxTxSxV,效果就是先缩放再平移,可见指定矩阵的顺序是和矩阵变换向量的执行顺序相反的。如果这儿在代码中先调用glScale*,再调用glTranslate*,就会变成先平移再缩放,结果是很不一样的,因为缩放是针对中心点的坐标值变化,如果先平移,等于这些点离中心点远了,再放大就会更加偏离中心点。
示例代码:
glPushMatrix();
glTranslatef(10.0f,0.0f,0.0f);
glScalef(2.0f,2.0f,2.0f);
glutWireCube(1.0);
glPopMatrix();

glPushMatrix();
glScalef(2.0f,2.0f,2.0f);
glTranslatef(10.0f,0.0f,0.0f);
glutWireCube(1.0);
glPopMatrix();

同样对于视点变换和模型变换,由于是先指定视点变换(调用gluLookAt)后指定模型变换,所以实际效果是先模型变换再视点变换,这与一般图形学上的流水线顺序一致。

4)glLoadIdentity,glPushMatrix/glPopMatrix的使用
在使用glMatrixMode(GL_PROJECTION)后要立刻调用glLoadIdentity,glMatrixMode本身不会将栈顶矩阵清成单位阵。在每帧开始要调用glLoadIdentity将模型视点矩阵设成单位阵(否则会累积上一帧矩阵变换的最终效果)。在设定模型变换矩阵时,也可以使用glLoadIdentity,这会清除之前所有变换矩阵的累积效果重新开始矩阵设定,当然最方便的还是glPushMatrix/glPopMatrix组合,首先他的效率比glLoadIdentity高,执行glPushMatrix时复制当前的矩阵并入栈(新矩阵位于栈顶,原矩阵被压入栈中),这样之后所做的变换就可以累积原来的变换效果,之后调用glPopMatrix会将原变换矩阵弹出,这样就恢复了原来的变换矩阵,不受push/pop之间矩阵变换的影响。这种矩阵栈的结构特别适合层次关系,一般至少支持32层。(投影矩阵支持2层,但一般没用)

5)模型变换矩阵函数
即glTranslate*,glScale* ,glRotate*,使用这些函数速度比自己设置矩阵并调用glMultMatrix*快。
使用glScale*会对光照产生影响,必须再次归一化法线。(因为OpenGL会将模型变换应用到法线上)
连续旋转时应该是记录旋转角度并以之调用glRotate*,因为多次进行微小旋转会导致误差

6)视点变换矩阵
可以用gluLookAt指定,也可以自己封装函数实现功能

7)投影变换
投影矩阵一般是在reshape(屏幕尺寸设定或变化的时候)里调用,必须首先调用:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
投影变换定义视景体,OpenGL会根据视景体进行裁剪(应该是会生成一个齐次空间透视裁剪矩阵并进行裁剪)
使用glFrustum指定透视投影的视景体,他会生成一个透视矩阵并将其与当前矩阵相乘
也可以使用gluPerspective指定,注意他使用的是fovy和w/h
还可以自己封装类似函数(要使用glMultMatrix*)

8)视口变换,深度坐标
glViewport指定视口
glDepthRange设定深度值范围,默认为0.0~1.0(书中说这是在视口变换过程对z坐标编码的方式。这应该是OpenGL设定的齐次透视裁剪空间的z值范围吧)

分享到:
评论

相关推荐

    code__opengl学习笔记2-绘制矩形

    在"code__opengl学习笔记1-基本的运行框架"中,可能包含了如何设置OpenGL环境、编译和运行程序的基础知识。这通常包括安装必要的库、配置编译器、创建项目结构以及理解GLUT的基本用法。这些都是进行OpenGL编程的先决...

    NeHe OpenGL教程 学习笔记1

    这篇学习笔记1主要会探讨基础的OpenGL设置和渲染原理。 在OpenGL编程中,我们首先需要设置上下文环境,这通常通过窗口系统接口(如GLUT或SDL)完成。在"base.cpp"这个文件中,我们可能看到初始化OpenGL窗口的代码,...

    Opengl学习笔记

    ### OpenGL学习笔记关键知识点 #### 一、OpenGL坐标系与绘图函数 - **坐标系定义**:在OpenGL中,坐标系定义了三维空间中物体的位置。X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从观察者的视角由近及远(即从里至...

    opengl学习笔记

    总的来说,这份"opengl学习笔记"覆盖了OpenGL编程基础中的关键点,从图形管线到坐标变换,再到拾取模式和视口设置。通过深入学习并实践这些内容,读者将能够构建自己的3D应用程序,实现各种视觉效果。

    OpenGL初学笔记

    在"OpenGL学习笔记.doc"中,可能包含以下内容: 1. **基本概念**:介绍OpenGL的架构、管线模型以及主要的数据类型和函数。 2. **环境设置**:详述如何在Visual C++ 6.0中创建OpenGL项目,设置链接器选项,以及如何...

    openGL入门参考资料

    在配合的文章《OpenGL学习笔记——JNI篇》中,作者通过JNI(Java Native Interface)来演示如何在Java程序中调用OpenGL进行图形绘制。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互,这在需要高...

    OpenGL超级宝典 笔记15之前 清单3.12之前所有有关代码.rar

    总的来说,这个压缩包提供了一个全面的学习OpenGL的实践平台,通过这些代码,读者可以深入理解OpenGL的工作原理,掌握图形渲染、变换、光照和相机控制等核心概念,同时也能了解C++在图形编程中的应用。每个文件都是...

    Python-Opengl的练习作业.zip

    这个“Python学习笔记”可能包含了这些主题的代码示例和解释,帮助初学者逐步掌握OpenGL的使用。ljg_resource可能是一个包含资源文件的目录,如纹理图像、模型数据或辅助脚本,这些都是实际项目中常见的组成部分。 ...

    现代OpenGL+Qt:smooth和flat着色模式

    博文“现代OpenGL+Qt学习笔记之九:smooth和flat着色模式”应该包含了如何在Qt项目中实现这两种着色模式的具体代码示例。通过阅读这篇博文,你可以了解到如何编写GLSL着色器,并在Qt中集成它们来演示不同的着色效果...

    OpenGL动画演示(包含代码)

    总的来说,这个资源包提供了丰富的OpenGL动画编程实践,涵盖了从基本的几何变换到复杂的物理模拟,对于想要提升OpenGL技能的开发者来说,是一份不可多得的学习资料。通过深入研究这些代码,不仅可以理解OpenGL的工作...

    VS2017OpenGL 配置步骤

    同时,了解基本的几何变换和向量运算也是必要的。 通过这些实验项目,你不仅可以练习配置OpenGL环境,还能深入学习图形学的基本概念和技巧。记得每次更改代码后都重新编译运行,观察结果并逐步完善你的图形应用。在...

    opengl学习手记(三)旋转的三维立方体收集.pdf

    总之,这个OpenGL学习笔记展示了如何创建基本的3D立方体,包括设置图形环境、深度测试、视口和投影矩阵的配置,以及使用顶点数据绘制几何体。它是学习OpenGL基础和理解3D图形渲染流程的一个良好起点。

    OpenGL ES学习阶段性总结

    8. **视口和投影变换**:将3D空间的坐标转换为2D屏幕坐标,以及如何设置视口大小和投影矩阵。 9. **错误检查与调试**:使用`glGetError`函数检查错误,配合图形调试工具如GLES Trace、 RenderDoc等进行问题排查。 ...

    openGL头文件

    `gl.h`包含了基本的OpenGL函数,如绘制点、线和多边形,而`glu.h`提供了高级和辅助功能,如投影和模型视图矩阵操作,以及错误检查和调试工具。 在实际开发中,你还需要设置正确的链接器选项,以链接到OpenGL和GLUT...

    shader学习笔记1

    本篇Shader学习笔记主要介绍了Shader的基础概念、Hello World示例、Uniform关键字以及用算法进行绘画的方法。 1. Shader基础: - **什么是Shader**:Shader是运行在GPU上的小程序,用于处理图形渲染,随着分辨率...

    OPENGL.rar_visual c

    更进一步,你将接触到OpenGL的状态机模型,包括矩阵操作,如视口变换、投影变换和模型视图变换,这些都是控制图形在屏幕上显示方式的关键。还有纹理映射,用于给物体表面添加细节和真实感,以及光照和着色模型,它们...

    games101计算机图形学 学习笔记分享

    在"games101计算机图形学学习笔记分享"中,我们可以期待了解到一系列关于这个主题的基础概念、理论和技术。 首先,笔记可能会从基础的图形学原理开始讲解,包括二维和三维坐标系的概念,以及如何在笛卡尔坐标系中...

    WebGL学习笔记(一).rar

    WebGL是一种基于OpenGL标准的JavaScript API,用于在任何兼容的Web浏览器中进行2D...以上就是WebGL学习笔记(一)的主要内容,通过学习,你可以了解WebGL的基本概念和工作流程,为进一步深入WebGL编程打下坚实的基础。

    计算机图形学学习笔记.zip

    在这个学习笔记中,我们将重点关注使用WebGL这一Web上的3D图形库来实现彩色立方体的绘制及动态操作,包括旋转、平移和缩放。WebGL基于OpenGL标准,允许在浏览器环境中直接进行硬件加速的3D图形渲染。 首先,`...

    qix.rar_opengl_qix

    在学习或分析这个项目时,你需要熟悉OpenGL的基本概念和API,包括顶点坐标、颜色、模型视图投影矩阵、着色器语言GLSL等。你还需要了解如何在C语言环境中集成OpenGL库,并且熟悉Visual Studio或类似的IDE的使用。此外...

Global site tag (gtag.js) - Google Analytics