OpenGL基础知识
2013-03-04 21:41
399 查看
原帖http://blog.csdn.net/sunqunsunqun/article/details/7182546
1.相机的位置就是视点。
2.OpenGL绕坐标轴旋转一个正的角度,就是从坐标轴的正半轴看向负半轴,逆时针旋转。
3.默认情况下,OpenGL视点的初始位置就是世界坐标系的原点,默认情况下:
a.视点的初始位置位于世界坐标系的原点;
b.OpenGL是右手坐标系,视点的初始方向和世界坐标系的Z轴负方向一致,初始视方向垂直于屏幕指向屏幕的内部;
c.视点的初始向上方向(UpDirection)和Y轴的正方一致;
d.视点的初始X方向和X轴的正方向一致
4.在调用gl.LookAt()方法前,必须先调用gl.LoadIdentity(),如下所示:
gl.LoadIdentity();
gl.LookAt(EyeX,EyeY,EyeZ,TargetX,TargetY,TargetZ,UpX,UpY,UpZ);
只有在之前调用了gl.LoadIdentity(),将模型视点矩阵重置,才能保证gl.LookAt()中的坐标参数都是世界坐标系中的坐标,如果未调用gl.LoadIdentity(),则gl.LookAt()很有可能出现问题, 达不到需要的效果。
5.在OpenGL使用的过程中,需要了解多个坐标系,其中最最常用的有三个:世界坐标系、模型的局部坐标系、Camera的视坐标系。
世界坐标系:这个坐标系模拟我们生活的真是的3D场景,在OpenGL中有且只有一个世界坐标系;
模型的局部坐标系:也称为本地坐标系(local coordinate)在进行了glLoadIdentity()之后,模型的局部坐标系和世界坐标系是重合 的,但是如果调用了glTranslate()或者glRotate(),模型的局部坐标系就会进行相应的平移和旋转。该坐标系以物体的中心为坐标原点,物体的旋转、平移等操作都是以局部坐标系进行的。这时当物体模型进行旋
转、平移等操作时,局部坐标系也执行相 应的旋转、平移等操作。局部坐标系是一个假想的坐标系,该坐标系与物体的相对位置始终是不变的。在OpenGL中绘图时,都是 首先通过glTranslate、glRotate等来改变局部坐标系与世界坐标系的相对位置,然后在局部坐标系中用glVertexf等绘图,比如绘 制了一个点glVertexf(1,2,3),那么坐标(1,2,3)是局部坐标系中的坐标,而不是世界坐标系中的坐标。这里自己举个例子。glLoadIdentity();glTranslatef(50,0,0);glVertexf(1,2,3);首先世界坐标系与Local坐标系重合,translate将Local坐标系的原点移至世界坐标系的(50,0,0)位置,接着在Local坐标系(1,2,3)画点,这时,点在世界坐标系的位置是(51,2,3)。
Camera的视坐标系:我们绘制的图形最终要呈现在视坐标系中,视坐标系是右手坐标系的。现在打个比 方,你站在世界坐标系中,你的眼睛就是Camera,你的眼睛平视前方,并且保持视线方向与头顶的朝向互相垂直。现在你的眼睛就是视坐标系的坐标原点,你的视线方向就是Z轴的负半轴,你的头顶的朝向就是视坐标系的Y轴正半
轴方向,与YOZ相互垂直向右的指向就是X轴正半轴的方向,X轴正半轴可由Y与Z叉乘得到,Camera的视坐标系也可以称为uvn坐标系,对应着世界坐标系的XYZ三个轴。默认情况下,视坐标系与世界坐标系是重合的,都是右手坐标系。
6.视点变换模型变换
在OpenGL中,视点变换和模型变换被当做一种变换来看待。改变视点的位置和改变模型的位置是一个相对的过程,例如将物体从(0.0, 0.0, 0.0)移至(0.0, 0.0, -1.0)相当于将相机从(0.0, 0.0, 0.0)移至(0.0, 0.0, 1.0)。视点变换、模型变换将被合并,形成模型视点矩阵。可以使用函数glMatrixMode(GL_MODELVIEW)来指定当前矩阵模式为模型视点变换。在代码中,视点变换在模型变换之前指定,但投影变换和视口变换可以在绘图之前的任意时候指定。(注意,指定视点变换在模型变换之前是因为OpenGL是逆序处理矩阵,即glMultMatrix(M);glMultMatrix(N),那么对于在Local模型中的点v,是M*N*v,所以先视点,后模型。设置完视点后不能紧接着LoadIdentity,因为LookAt已经改变了ModelView矩阵(可以通过glGetfloatv进行查询)。LookAt之后可以通过PushMatrix来储存当前矩阵,以便于模型变换)。
一些建议:
(1)视点变换采用gluLookAt来改变相机的位置,朝向以及向上方向。
(2)模型变换使用glTranslate, glRotate, glScale来进行平移,旋转,缩放反射,从而改变物体在场景中位置。
7.模型视点矩阵(ModelView Matrix)
模型视点矩阵其实是由视点矩阵乘以模型矩阵得到的。要想弄明白这两个矩阵的作用,首先要理解世界坐标系、模型的局部坐标系以及Camera的视坐标系。下面介绍一下这两个矩阵的作用:
模型矩阵:模型的绘制采用的是模型的局部坐标系,模型矩阵的作用是把模型在局部坐标系中的坐标转变成世界坐标系中的坐标。
视点矩阵:我们所看到的三维物体都是在Camera的视坐标系中显示的,视点矩阵的作用就是把模型在世界坐标系中的坐标转变成视坐标系中的三维坐标,以便于后期用于进行投影显示。
1.相机的位置就是视点。
2.OpenGL绕坐标轴旋转一个正的角度,就是从坐标轴的正半轴看向负半轴,逆时针旋转。
3.默认情况下,OpenGL视点的初始位置就是世界坐标系的原点,默认情况下:
a.视点的初始位置位于世界坐标系的原点;
b.OpenGL是右手坐标系,视点的初始方向和世界坐标系的Z轴负方向一致,初始视方向垂直于屏幕指向屏幕的内部;
c.视点的初始向上方向(UpDirection)和Y轴的正方一致;
d.视点的初始X方向和X轴的正方向一致
4.在调用gl.LookAt()方法前,必须先调用gl.LoadIdentity(),如下所示:
gl.LoadIdentity();
gl.LookAt(EyeX,EyeY,EyeZ,TargetX,TargetY,TargetZ,UpX,UpY,UpZ);
只有在之前调用了gl.LoadIdentity(),将模型视点矩阵重置,才能保证gl.LookAt()中的坐标参数都是世界坐标系中的坐标,如果未调用gl.LoadIdentity(),则gl.LookAt()很有可能出现问题, 达不到需要的效果。
5.在OpenGL使用的过程中,需要了解多个坐标系,其中最最常用的有三个:世界坐标系、模型的局部坐标系、Camera的视坐标系。
世界坐标系:这个坐标系模拟我们生活的真是的3D场景,在OpenGL中有且只有一个世界坐标系;
模型的局部坐标系:也称为本地坐标系(local coordinate)在进行了glLoadIdentity()之后,模型的局部坐标系和世界坐标系是重合 的,但是如果调用了glTranslate()或者glRotate(),模型的局部坐标系就会进行相应的平移和旋转。该坐标系以物体的中心为坐标原点,物体的旋转、平移等操作都是以局部坐标系进行的。这时当物体模型进行旋
转、平移等操作时,局部坐标系也执行相 应的旋转、平移等操作。局部坐标系是一个假想的坐标系,该坐标系与物体的相对位置始终是不变的。在OpenGL中绘图时,都是 首先通过glTranslate、glRotate等来改变局部坐标系与世界坐标系的相对位置,然后在局部坐标系中用glVertexf等绘图,比如绘 制了一个点glVertexf(1,2,3),那么坐标(1,2,3)是局部坐标系中的坐标,而不是世界坐标系中的坐标。这里自己举个例子。glLoadIdentity();glTranslatef(50,0,0);glVertexf(1,2,3);首先世界坐标系与Local坐标系重合,translate将Local坐标系的原点移至世界坐标系的(50,0,0)位置,接着在Local坐标系(1,2,3)画点,这时,点在世界坐标系的位置是(51,2,3)。
Camera的视坐标系:我们绘制的图形最终要呈现在视坐标系中,视坐标系是右手坐标系的。现在打个比 方,你站在世界坐标系中,你的眼睛就是Camera,你的眼睛平视前方,并且保持视线方向与头顶的朝向互相垂直。现在你的眼睛就是视坐标系的坐标原点,你的视线方向就是Z轴的负半轴,你的头顶的朝向就是视坐标系的Y轴正半
轴方向,与YOZ相互垂直向右的指向就是X轴正半轴的方向,X轴正半轴可由Y与Z叉乘得到,Camera的视坐标系也可以称为uvn坐标系,对应着世界坐标系的XYZ三个轴。默认情况下,视坐标系与世界坐标系是重合的,都是右手坐标系。
6.视点变换模型变换
在OpenGL中,视点变换和模型变换被当做一种变换来看待。改变视点的位置和改变模型的位置是一个相对的过程,例如将物体从(0.0, 0.0, 0.0)移至(0.0, 0.0, -1.0)相当于将相机从(0.0, 0.0, 0.0)移至(0.0, 0.0, 1.0)。视点变换、模型变换将被合并,形成模型视点矩阵。可以使用函数glMatrixMode(GL_MODELVIEW)来指定当前矩阵模式为模型视点变换。在代码中,视点变换在模型变换之前指定,但投影变换和视口变换可以在绘图之前的任意时候指定。(注意,指定视点变换在模型变换之前是因为OpenGL是逆序处理矩阵,即glMultMatrix(M);glMultMatrix(N),那么对于在Local模型中的点v,是M*N*v,所以先视点,后模型。设置完视点后不能紧接着LoadIdentity,因为LookAt已经改变了ModelView矩阵(可以通过glGetfloatv进行查询)。LookAt之后可以通过PushMatrix来储存当前矩阵,以便于模型变换)。
一些建议:
(1)视点变换采用gluLookAt来改变相机的位置,朝向以及向上方向。
(2)模型变换使用glTranslate, glRotate, glScale来进行平移,旋转,缩放反射,从而改变物体在场景中位置。
7.模型视点矩阵(ModelView Matrix)
模型视点矩阵其实是由视点矩阵乘以模型矩阵得到的。要想弄明白这两个矩阵的作用,首先要理解世界坐标系、模型的局部坐标系以及Camera的视坐标系。下面介绍一下这两个矩阵的作用:
模型矩阵:模型的绘制采用的是模型的局部坐标系,模型矩阵的作用是把模型在局部坐标系中的坐标转变成世界坐标系中的坐标。
视点矩阵:我们所看到的三维物体都是在Camera的视坐标系中显示的,视点矩阵的作用就是把模型在世界坐标系中的坐标转变成视坐标系中的三维坐标,以便于后期用于进行投影显示。
相关文章推荐
- Android opengl基础知识
- OpenGL基础知识
- OpenGL_01_基础和数学知识(上)
- OpenGL开发 颜色、材料和光照:基础知识
- opengl基础知识 关于四个变换的顺序
- OpenGL基础知识
- OpenGL基础知识
- OpenGL基础知识
- OpenGl入门基础知识-叩开3D的心扉
- OpenGL基础知识
- OpenGL基础知识扫盲
- OpenGL学习二--基础知识
- 光栅化基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- OpenGL基础知识(二)
- OpenGL中投影矩阵基础知识
- openGL基础知识
- android开发基础知识:OpenGL纹理本质
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——1.1 OpenGL ES 2.0基础知识
- 基础OpenGL知识结构图
- OpenGL蓝宝书学习系列(一):3D图像的基础知识