(一)gl,glu,glut的区别
OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库,
gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数,而glu似乎对gl的辅助,如果算数好,不用glu的情况下,也是可以做出同样的效果。
glut是基本的窗口界面,是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替,但是glut是跨平台的,这就保证了我们编出的程序是跨平台的,如果用MFC或者Win32只能在windows操作系统上使用。选择OpenGL的一个很大原因就是因为它的跨平台性,所以我们可以尽量的使用glut库。
opengl 实用库 : 43个函数,以glu开头,包括纹理映射、坐标变换、多边形分化、绘制一些如椭球、圆柱、茶壶等简单多边形实体 部分函数象核心函数一样在任何OpenGL平台都可以应用。
opengl辅助库: 31个函数,以aux 开头,
OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图1可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。
转载自:http://dxwang.blog.51cto.com/384651/698750
(二)一些函数的详细用法
glBegin()
1.在glBegin()和glEnd()之间可调用的函数
函数 函数意义
glVertex*() 设置顶点坐标
glColor*() 设置当前颜色
glIndex*() 设置当前颜色表
glNormal*() 设置法向坐标
glEvalCoord*() 产生坐标
glCallList(),glCallLists() 执行显示列表
glTexCoord*() 设置纹理坐标
glEdgeFlag*() 控制边界绘制
glMaterial*() 设置材质
以上为可在glBegin()和glEnd()之间可调用的函数
glVertex3f()表示了该函数属于gl库,参数是三个float型参数指针。我们用glVertex*()来表示这一类函数。
基本库
2.几何图元类型和说明
类型 说明
GL_POINTS 单个顶点集
GL_LINES 多组双顶点线段
GL_POLYGON 单个简单填充凸多边形
GL_TRAINGLES 多组独立填充三角形
GL_QUADS 多组独立填充四边形
GL_LINE_STRIP 不闭合折线
GL_LINE_LOOP 闭合折线
GL_TRAINGLE_STRIP 线型连续填充三角形串
GL_TRAINGLE_FAN 扇形连续填充三角形串
GL_QUAD_STRIP 连续填充四边形串
gluLookAt()
函数原型为
void gluLookAt(
GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz
);
gluLookAt()共有九个参数,三个一组,分为三组,分别是眼睛的位置,眼睛朝向的位置,以及相片朝上的方向。
详细介绍参考:http://blog.163.com/zhaoxin851055@126/blog/static/81129298200921052929831/
glMatrixMode()
这个函数是对模型矩阵进行变换,即对接下来要做什么进行一下声明,可选值: GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.
如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进行操作,也就是把物体投影到一个平面上,就像我们照相一样,把3维物体投到2维的平面上。这样,接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective();
在opengl中,视图和模型变换是在一个矩阵中进行控制的,这个矩阵就是GL_MODELVIEW_MATRIX,可以使用glGetFloatv函数来获取这个矩阵,而我们所要使用glTranslate*, glRotate*,glScale* 等操作均最后反映到这个矩阵的变化中,所以了解这个矩阵的构造对于灵活运用OpenGL比较重要。
变换矩阵在内存中的存放方式如下:
m[0] m[4] m[ 8] m[12]
m[1] m[5] m[ 9] m[13]
m[2] m[6] m[10] m[14]
m[3] m[7] m[11] m[15]
可以看出,OpenGL是以列序来存放这个矩阵的,位于矩阵上方的3*3矩阵是旋转矩阵,可以用来控制刚体的旋转和尺度变化,如下:
m[0] m[4] m[ 8]
m[1] m[5] m[ 9]
m[2] m[6] m[10]
而左上角的3*1矩阵是用来控制刚体的平移的。就是m[12],m[13],m[14]这三个值,分别控制X,Y ,Z方向的平移。所有16个值组成一标准的齐次矩阵。
参考博文:http://www.cnblogs.com/txwd0033/archive/2009/09/25/1574087.html
若是GL_TEXTURE,就是对纹理相关进行操作;
顺便说下,OpenGL里面的操作,很多是基于对矩阵的操作的,比如位移,旋转,缩放,所以,这里其实说的规范一点就是glMatrixMode是用来指定哪一个矩阵是当前矩阵,而它的参数代表要操作的目标,GL_PROJECTION是对投影矩阵操作,GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。
参考博文:http://blog.sina.com.cn/s/blog_61ac952e0100grop.html
gluPerspective()
函数原型
void gluPerspective( GLdouble fovy, //角度
GLdouble aspect,//视景体的宽高比
GLdouble zNear,//沿z轴方向的两裁面之间的距离的近处
GLdouble zFar //沿z轴方向的两裁面之间的距离的远处
)
详细介绍:http://www.cppblog.com/COOOOOOOOL/archive/2009/12/30/104255.html讲的非常详细,有图有真相。
透视投影原理介绍:《深入探索透视投影变换》
gluPerspective()与gluLookAt()的关系
http://wenku.baidu.com/view/ead1690c844769eae009ed06.html
http://blog.163.com/bingcaihuang@126/blog/static/198942122010015104833960/