资源描述:
《基于opengl的三维建模技术》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于OpenGL的三维建模技术王鹏目录1.三维显示的基本方法2.OpenGL基本原理3.OpenGL编程的基本方法1.三维显示的基本方法三维显示就是将立体图像以平面投影图或透视图的形式在平面上表现出来的过程。三维显示的理论基础是计算机图形学。实现的主要方法:DirectX和OpenGL两个函数库。DirectX是微软独自开发的API。DirectX由显示部分、声音部分、输入部分和网络部分四大部分组成。OpenGL“开放图形库”,由SGI公司开发,主要针对3D图像处理。它与硬件无关,并且独立于操作系统之外。相比之
2、下,OpenGL更容易被初学者掌握。三维显示在地球物理方面的应用:三维可视化软件有:LandmarkEarthCube模块和GeoProbe模块,GeoFrame,ParadigmVoxelGeo等等。实际上,三维显示功能已经成为大型地学软件不可或缺的一部分。2.OpenGL基本原理三维显示和摄影类似相机镜头视点三角架视点位置视野大小视景体景物模型在实际摄影拍摄时,我们可以改变拍摄位置和角度,相机的焦距,改变景物的位置等等。在OpenGL中,提供对应的函数来实现这些功能。这些函数(也称为变换)是通过矩阵计算来实现
3、的。同时,OpenGL是一个状态机,设置了某种状态而不改变,OpenGL将一直保持这个状态。视点变换:确定视点的位置和方向。投影变换:定义一个视景体,使得视景体外多余的部分裁剪掉,确定视野范围。模型变换:对模型进行平移,旋转和缩放处理。视点变换voidgluLookAT(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,//视点GLdoublecx,GLdoublecy,GLdoublecz,//目标点GLdoubleupx,GLdoubleupy,GLdoubleupz,//视点朝上
4、的方向)投影变换由于显示器只能用二维图象显示三维物体,因此就要靠投影来降低维数。投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终绘制图像的只是视景体内的有关部分。投影包括透视投影(PerspectiveProjection)和正交投影(OrthographicProjection)两种。透视投影voidgluPerspective(fovy,aspect,zNear,zFar)取景体是一个截头锥体,在这个体积内的物体这个锥体的顶点也就是视点的位置。正交投影voidglOrtho(left,ri
5、ght,bottom,top,near,far)取景体是一个各面均为矩形的六面体透视投影正交投影离视点近的物体大,离视点远的物体小。无论物体距视点多远,投影后的物体大小不变。建立模型任何复杂的图形都是由基本的图元点、线和多边形组成的。glBegin(…);……//描述一组顶点,用于建构某种几何对象glEnd();例如:glBegin(GL_LINES)//画线glVertex2f(0.0,0.0,0.0);glVertex2f(1.0,1.0,1.0);glEnd();模型的平移与旋转平移变换voidglTans
6、late{fd}(TYPEx,TYPEy,TYPEz);旋转变换voidglRotate{fd}(TYPEangle,TYPEx,TYPEy,TYPEz);模型总是在原点处绘制完成以后,再通过适当的平移变换和旋转变换到恰当的空间位置。需要特别指出的是,实际的变换顺序与指定的顺序是相反的。旋转变换平移变换绘制模型绘制模型平移变换旋转变换程序代码顺序:实现顺序:原始模型先平移,再旋转45度先旋转45度再平移光照为了增强模型的立体效果,可以给场景加入光源。无光源有光源OpenGL将光线分为辐射光、环境光、漫反射光和镜面
7、反射光4种独立的成分。上色和纹理贴图现实世界中的物体表面往往有各种纹理,因此要绘制逼真的三维模型,除了对模型进行光照处理外,还需要加上纹理贴图,使物体看起来更真实。3.OpenGL编程的基本方法1.利用GLUT实现2.利用MFC实现3.高级图像库1利用GLUT实现因为OpenGL独立于任何窗口系统和操作系统之外。所以OpenGL不能直接用来打开窗口以及从键盘或鼠标读取事件。GLUT库简化Windows窗口操作,它提供了非常简单的方法来实现窗口操作。intmain(intargc,char**argv){glutI
8、nit(&argc,argv);//初始化GLUTglutInitDisplayMode(GLUT_SINGLE
9、GLUT_RGB);glutInitWindowSize(640,480);//设置窗口大小glutInitWindowPosition(0,0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化