OpenGL中的投影变换
投影变换相当于选择相机的镜头或则说调整相机的焦距,并把确定的物体投影到胶片上
投影变换确定了视野的大小或视图体的大小
确定哪些物体在视野之内,以及它们的形状和大小
看到的结果投影到投影平面上
投影变换的分类
透视投影
类似于在现实生活中观察事物,越远的物体显示的越小。如观察一条比笔直的马路,边界在很远处近似于交汇于一点。
正交投影
这种方式平行地投影与屏幕,物体的大小不发生任何变化,不管被投影的物体是远还是近。
void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,
GLdouble near,GLdouble far);
它创建一个透视景体。其操作是创建一个投影矩阵,并且在这个矩阵乘以当前矩阵。这个函数只定义进裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far 是远裁剪平面的 Z 负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far 表示离视点的远近。它们总为正值。
void gluPerspective (GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);
它也创建了一个对称透视视景体,但它的参数定义于前面的不同,参数fovy定义视野在X-Z平面的角度,范围是【0.0,180.0】;参数aspect是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,
GLdouble near,GLdouble far)
它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点事(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行与Z轴,且视点朝向Z负轴。
OpenGL中的模型变换
视点变换
视点变换是在视点坐标系中进行的。视点坐标系与一般的物体所在的世界坐标系不同,它遵循左手法则,即左手大拇指指向Z正轴,与之垂直的四个手指
指向X正轴,四指弯曲90度的方向是Y正轴。而世界坐标系遵循右手法则。
当矩阵初始化glLoadIdenitity()后,调用glTranslatef()作视点转换。
函数参数(x,y,z)表示视点或相机视点坐标系中移动的位置,这里z=-5.0,意思是将相机初始化方向都指向Z负轴移动5个单位。
通常相机位置缺省值同场景中的物体一样,都在原点处,而且相机初始方向都指向Z轴负轴。
这里相机移走后,仍然对准立方体,如果相机需要指向另一方向,则调用glRotatef()可以改变
在OpenGL中,实质上只有模拟变换,视图变换只是一种模拟。
OpenGl中的视口变换
OpenGL视坐标变换中常用的函数
1)glMatrixMode(GLENUM mode)
常用的有二个参数:
GL_MODELVIEW
GL_PROJECT
2)glLoadIdentity(void)
把当前矩阵更改为单位矩阵
3)glTranslate{fd}(TYPEx,TYPEy,TYPEz)
平移
4)glRotate{fd}(TYPE andgle,TYPE x TYPE y,TYPE z)
旋转
5)gluLookAt(GLdouble eyes,GLdouble eyey,Ldouble eyez,
GLdouble centerx,GLdouble centery,GLdouble centerz,
GLdouble upx,GLdouble upy,GLdouble centerz)
含义:
选准一个位置(视野较好,eyex,eyey,eyez))
选准前面一个点(中心点centerx,centery,centerz)
然后偏头到一定的角度(upx,upy,upz).
OpenGL视坐标转换中常用的函数
6)glFrustum(GLdouble left,GLdouble right,
GLdouble bottom,GLdouble top,
GLdouble near, GLdouble far)
7)glPerspective(GLdouble fovy,GLdouble aspect,
GLdouble znear,GLdouble zfar)
aspect为视口的长宽比例
8)glOrtho(GLdouble left,GLdouble right,
GLdouble bottom,GLdouble top,
GLdouble near,GLdouble far)
9)glViewport(GLint x,GLint y
GLsizei width,GLsizei height)
定义视区(用来显示最终的图行)
10)glPushMatrix(void)
当前矩阵入栈
11)glPopMatrix(void)
当前矩阵出栈