现实中的三维物体要画到纸上,二维平面画图,就是点和线,三维是点线面,需要把三维的每个位置的空间坐标(x,y,z)映射到二维平面坐标(x,y),这可以通过线性代数知识解决。
openGL变换
OpenGL通过各种变换实现,都是矩阵运算实现的
几种变换简介(参见OpenGL超级宝典第5章)
变换 | 用途 |
视图 | 指定观察点的位置 |
模型 | 在场景中移动,缩放,选择对象 |
模型视图 | 描述视图变换和模型变换的对偶性 |
投影 | 对可见空间进行剪裁和改变大小 |
视见区 | 对窗口的最终输出进行缩放 |
矩阵 矩阵堆栈
参考
void glPushMatrix(void);
该函数表示将所有矩阵依次压入堆栈中,顶部矩阵是第二个矩阵的备份;压入的矩阵数不能太多,否则出错。
另一种理解:复制当前桟顶,并把复制内容再次放到桟顶,以保护桟上之前的内容
void glPopMatrix(void);
该函数表示弹出堆栈顶部的矩阵,令原第二个矩阵成为顶部矩阵,接受当前操作,故原顶部矩阵被破坏;当堆栈中仅存一个矩阵时,不能进行弹出操作,否则出错。
变换过程中常用的函数
void glMatrixMode(GLenum mode):
mode 告诉计算机哪一个矩阵堆栈将是下面矩阵操作的目标,即将什么矩阵设置为当前矩阵,他的可选值有: GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.
- GL_MODELVIEW
应用这个参数后,表示接下来的矩阵操作都是针对模型视景矩阵堆栈 ,直到下一次调用这个函数并更改参数为止。 - GL_PROJECTION
应用这个参数后,表示接下来的矩阵操作都是针对投影矩阵堆栈 ,直到下一次调用这个函数并更改参数为止。
通常使用gluPerspective 函数接着操作,此函数不能作用在GL_MODELVIEW上,例如
gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);//对图像进行透视投影,以将三维物体显示在二维平面上
- GL_TEXTURE
应用这个参数后,表示接下来的矩阵操作都是针对纹理矩阵堆栈 , 直到下一次调用这个函数并更改参数为止。
void glLoadIdentity(void)
OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令。该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。
当调用glLoadIdentity()之后,实际上将当前点移到了屏幕中心:类似于一个复位操作
- X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
- OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
- 中心左面的坐标值是负值,右面是正值。
移向屏幕顶端是正值,移向屏幕底端是负值。
移入屏幕深处是负值,移出屏幕则是正值。
gluLookAt
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,
GLdouble centerx,GLdouble centery,GLdouble centerz,
GLdouble upx,GLdouble upy,GLdouble upz);
该函数定义一个视图矩阵,并与当前矩阵相乘。
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。
参考:
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)
把视景体截取的图像按照怎样的高和宽显示到屏幕上