计算机图形学OpenGL(第三版)第二章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机图形学OpenGL(第三版)第二章课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 OpenGL 第三 第二 课件
- 资源描述:
-
1、 前一页 休息1本章内容本章内容l编写图形程序编写图形程序l学习学习OpenGL程序的基本组成程序的基本组成l开发绘制点、直线、折线和多边形的基开发绘制点、直线、折线和多边形的基本图形工具本图形工具l学会用鼠标和键盘控制程序学会用鼠标和键盘控制程序 前一页 休息22.0 vc opengl 编程编程 指导例子指导例子l熟悉代码,多次练习熟悉代码,多次练习l见图形学第二课见图形学第二课opengl-console.doc,创建创建一个控制台的应用程序,本书采用的编一个控制台的应用程序,本书采用的编程方式程方式l见图形学第二课见图形学第二课opengl-nehe-win.doc,创创建一个建一个w
2、in32的应用程序,的应用程序,nehe教程(共教程(共48课)采用的编程方式课)采用的编程方式l见图形学第三课见图形学第三课opengl-nehe-mfc.doc,创创建一个建一个mfc的应用程序,本人推荐采用的的应用程序,本人推荐采用的编程方式,需要学习编程方式,需要学习vc和和mfc。前一页 休息32.1 生成图像初步生成图像初步l通过练习(编写和测试各种不同图形的程序)可以通过练习(编写和测试各种不同图形的程序)可以很快掌握计算机图形学。先从简单的任务开始,一很快掌握计算机图形学。先从简单的任务开始,一旦掌握,就试着变变花样,看看有哪些变化,试着旦掌握,就试着变变花样,看看有哪些变化,
3、试着进一步绘制更复杂的场景。最好的学习办法是认真、进一步绘制更复杂的场景。最好的学习办法是认真、仔细地学习每行代码或等式。当你这么做时,就能仔细地学习每行代码或等式。当你这么做时,就能理解每个新概念。理解每个新概念。l每个图形程序都以一些初始化工作为开始,由此建每个图形程序都以一些初始化工作为开始,由此建立程序所需要的显示模型和坐标系。立程序所需要的显示模型和坐标系。前一页 休息42.1 生成图像初步生成图像初步l初始化时,将显示器设置为初始化时,将显示器设置为“图形模式图形模式”,并且建,并且建立了坐标系,坐标立了坐标系,坐标x和和y以像素为单位,以像素为单位,x向右递增,向右递增,y向下递
4、增。向下递增。前一页 休息52.1.1 设备无关的编程设备无关的编程 和和OpenGLlOpenGL程序可以在不同的图形环境里编译和运行,程序可以在不同的图形环境里编译和运行,即它是与设备无关的编程。即它是与设备无关的编程。OpenGL是一个开源图形是一个开源图形库,可在库,可在http:/www.opengl.org下载。下载。OpenGL常被常被称为应用程序接口(称为应用程序接口(API)。这个接口是程序员可以)。这个接口是程序员可以调用的例程,先从调用的例程,先从OpenGL绘制简单的二维物体开始,绘制简单的二维物体开始,然后学习绘制三维图形。然后学习绘制三维图形。前一页 休息62.1.
5、2 窗口的编程窗口的编程l事件驱动编程:事件包括单击鼠标,按下键盘上的事件驱动编程:事件包括单击鼠标,按下键盘上的按键,或者重新调整窗口的大小。程序员将程序组按键,或者重新调整窗口的大小。程序员将程序组织成回调函数的集合,这些回调函数一有事件发生织成回调函数的集合,这些回调函数一有事件发生就执行。即什么也不做,等待事件发生,事件发生就执行。即什么也不做,等待事件发生,事件发生后再做指定的事。后再做指定的事。OpenGL有一个有一个GLUT库,它用来库,它用来打开窗口,管理菜单和处理事件等。打开窗口,管理菜单和处理事件等。l注册回调函数:有一种方法将每种类型的事件与要注册回调函数:有一种方法将每
6、种类型的事件与要求的回调函数关联起来,这个方法称之为注册回调求的回调函数关联起来,这个方法称之为注册回调函数。程序中用到的每一个事件类型都必须用回调函数。程序中用到的每一个事件类型都必须用回调函数注册,该回调函数的名字和定义由程序员选择。函数注册,该回调函数的名字和定义由程序员选择。前一页 休息72.1.2 窗口的编程窗口的编程l下面是使用下面是使用GLUT库,名为库,名为myMouse的回调函数例的回调函数例子,它方便地注册了与鼠标关联的事件:子,它方便地注册了与鼠标关联的事件:glutMouseFunc(myMouse););glutMouseFunc是是GLUT库的固有函数,但是回调函库
7、的固有函数,但是回调函数数myMouse是程序员定义的,并由程序员编写代码,是程序员定义的,并由程序员编写代码,处理每个可能感兴趣的鼠标动作。处理每个可能感兴趣的鼠标动作。4种主要的种主要的OpenGL库:库:1)基本)基本GL库,库,OpenGL库的基础。它提供库的基础。它提供OpenGL的的基本函数。每个基本函数。每个OpenGL函数都以字符函数都以字符GL开头。开头。前一页 休息82.1.2 窗口的编程窗口的编程l2)GLUT库:库:GL实用工具包。它用来打开窗口,开实用工具包。它用来打开窗口,开发和管理菜单,以及管理事件等。发和管理菜单,以及管理事件等。l3)GLU库:库:GL实用库,
8、它提供高级例程,处理矩实用库,它提供高级例程,处理矩阵操作和绘制二次曲面如球和圆柱体;阵操作和绘制二次曲面如球和圆柱体;l4)GLUI库:用户接口库,提供控制工具和菜单。库:用户接口库,提供控制工具和菜单。glutDisplayFunc(myDisplay):重绘窗口调用重绘窗口调用myDisplay回调函数;回调函数;glutReshapeFun(myReshape):对屏幕窗口的形状):对屏幕窗口的形状进行调整;进行调整;void main()glutDisplayFunc(myDisplay);/注册重绘函数注册重绘函数glutReshapeFunc(myReshape);/注册改变窗口
9、形状函数注册改变窗口形状函数glutMouseFunc(myMouse);/注册鼠标动作函数注册鼠标动作函数glutMotionFunc(myMouse);/注册鼠标移动函数注册鼠标移动函数glutKeyboardFunc(myKeyboard);/注册键盘动作函数注册键盘动作函数/可能初始化其他工作可能初始化其他工作glutMainLoop();/进入主循环等待事件发生进入主循环等待事件发生 前一页 休息102.1.3 如何打开一个窗口画图如何打开一个窗口画图 lglutInit:该函数初始化工具包:该函数初始化工具包lglutDisplayMode(GLUT_SINGLE|GLUT_RGB
10、):分分配单个显示缓存配单个显示缓存lglutInitWindowSize(640,480):该函数指定屏幕的初始该函数指定屏幕的初始尺寸,宽尺寸,宽640像素,高像素,高480像素。像素。lglutCreateWindow(“my first attempt”):该函数):该函数打开并显示屏幕窗口吗,并显示标题。打开并显示屏幕窗口吗,并显示标题。代码如下:代码如下:void main(int argc,char*argv)glutInit(&argc,argv);/初始化工具包初始化工具包glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/设置显示模式设置显
11、示模式glutInitWindowSize(640,480);/设置窗口大小设置窗口大小glutInitWindowPosition(100,150);/设置窗口在屏幕上的位置设置窗口在屏幕上的位置glutCreateWindow(my first attempt);/打开屏幕窗口打开屏幕窗口/注册回调函数注册回调函数glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMouseFunc(myMouse);glutKeyboardFunc(myKeyboard);myInit();/必要的其他初始化工作必要的其他初始化工作glut
12、MainLoop();/进入循环进入循环 前一页 休息132.2 OpenGL的基本图形元素的基本图形元素l屏幕坐标系:宽为屏幕坐标系:宽为640,高为,高为640。x坐标从左边界坐标从左边界0增增加到右边界加到右边界639,y坐标从坐标从0增加到上边的增加到上边的479。绘制三个点:绘制三个点:glBegin(GL_POINTS);glVertex2i(100,50);glVertex2i(100,130);glVertex2i(150,130);glEnd();或者用浮点值代替整数值:或者用浮点值代替整数值:glBegin(GL_POINTS);glVertex2d(100.0,50.0)
13、;glVertex2d(100.0,130.0);glVertex2d(150.0,130.0);glEnd();OpenGL数据类型:数据类型:命令后缀和参数数据类型命令后缀和参数数据类型OpenGL状态:状态:OpenGL是由许多状态变量组成的状态机,这些状态包括点的大是由许多状态变量组成的状态机,这些状态包括点的大小、绘图的颜色额屏幕窗口大小等,点的大小可以用小、绘图的颜色额屏幕窗口大小等,点的大小可以用glPointSize()来设置,画图的颜色用这条语句设置:()来设置,画图的颜色用这条语句设置:glColor3f(red,green,blue););坐标系的建立:坐标系的建立:vo
14、id myInit(void)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0,640.0,0,480.0);myInit设置坐标系,设置透视投影变换。设置坐标系,设置透视投影变换。gluOrtho2D设置正交投影。设置正交投影。组合在一起:建立起一个完整的组合在一起:建立起一个完整的OpenGL程序程序glFlush()函数保证所有的数据被完全处理并显()函数保证所有的数据被完全处理并显示。示。前一页 休息172.2.1 几个点丛绘制的例子几个点丛绘制的例子l点丛是由大量点组成的某种图案。下面有几个点丛点丛是由大量点组成的某种
15、图案。下面有几个点丛例子。例子。例子例子2.2.1 北斗星群北斗星群 见计算机图形学课件见计算机图形学课件2016计算机图形学(计算机图形学(Opengl版第三版版第三版)书书源代码源代码word版版2.2.1-threeDots.doc例子例子2.2.2 Sierpinski(塞平斯基)垫片(塞平斯基)垫片见计算机图形学课件见计算机图形学课件2016计算机图形学(计算机图形学(Opengl版第三版版第三版)书源书源代码代码word版版2.2.1-threeDots.doc算法如下:第算法如下:第k个点表示为个点表示为P(k)=(x(k),),y(k),每一个),每一个点都依赖于前一个点点都依
16、赖于前一个点P(k-1),过程如下:),过程如下:(1)选择三个固定的点)选择三个固定的点T0,T1,T2,构成一个三角形,称为每,构成一个三角形,称为每个个Sierpinski垫片的父三角形;垫片的父三角形;(2)随机选择父三角形顶点)随机选择父三角形顶点T0,T1,T2中的一点作为要绘制的中的一点作为要绘制的初始点初始点P0。迭代下面的(迭代下面的(3)(5)步,直到图案填充完毕。)步,直到图案填充完毕。(3)随机选择)随机选择T0,T1,T2中的一点,称为中的一点,称为T。(4)构造下一个点)构造下一个点P(k),作为),作为T和前一个已建好的点和前一个已建好的点P(k-1)之间的之间点
17、,即之间的之间点,即P(k)=(P(k-1)+T)/2(5)用)用drawDot()绘制()绘制P(k)。)。例子例子2.2.2 Sierpinski(塞平斯基)垫片(塞平斯基)垫片/初始值初始值P(0),在在for循环外面循环外面GLintPoint point=Tindex;/初始值初始值drawDot(point.x,point.y);/画初始点画初始点for(int i=0;i 1000;i+)/画画1000点点index=rand()%3;/P(k)=(P(k-1)+T)/2point.x=(point.x+Tindex.x)/2;point.y=(point.y+Tindex.y)
18、/2;drawDot(point.x,point.y);例子例子2.2.3 用点集绘制函数用点集绘制函数 见计算机图形学课件见计算机图形学课件2016计算机图形学(计算机图形学(Opengl版第三版版第三版)书书源代码源代码word版版2.2.1-threeDots.doc绘制某个数学函数绘制某个数学函数f(x),当),当x在在04变化时的曲线。当绘制曲线变化时的曲线。当绘制曲线时,因为时,因为04之间的之间的x值位于屏幕窗口左下角的前值位于屏幕窗口左下角的前4个像素上,个像素上,而且而且f(.)的负值位于窗口的下面,根本看不到。需要进行平移的负值位于窗口的下面,根本看不到。需要进行平移和缩放
19、使曲线正好出现在合适的屏幕窗口。将世界坐标系转换和缩放使曲线正好出现在合适的屏幕窗口。将世界坐标系转换为为窗口坐标系。窗口坐标系。x方向缩放:假定屏幕窗口为方向缩放:假定屏幕窗口为screenWidth,单位为像素,现在,单位为像素,现在x的的范围为范围为04,故,故sx=x*screenWidth/4.0;y方向缩放:假定屏幕窗口为方向缩放:假定屏幕窗口为screenHeight,单位为像素,单位为像素,f(x)的的 取值在取值在1.0 和和 1.0之间之间,缩放缩放screenHeight/2,平移为,平移为 screenHeight/2,sy=(y+1.0)*screenHeight/2
20、.0;sx,sy为屏为屏幕坐标,幕坐标,x,y为窗口坐标;转换方程为:为窗口坐标;转换方程为:sx=A*x+B sy=C*y+Dconst int screenWidth=640;/width of screen window in pixelsconst int screenHeight=480;/height of screen window in pixelsGLdouble A,B,C,D;/values used for scaling and shiftingvoid myInit(void)glClearColor(1.0,1.0,1.0,0.0);/background col
21、or is whiteglColor3f(0.0f,0.0f,0.0f);/drawing color is blackglPointSize(2.0);/a dot is 2 by 2 pixelsglMatrixMode(GL_PROJECTION);/set camera shapeglLoadIdentity();gluOrtho2D(0.0,(GLdouble)screenWidth,0.0,(GLdouble)screenHeight);A=screenWidth/4.0;/x方向的缩放量方向的缩放量AB=0.0;/x方向的平移量方向的平移量BC=D=screenHeight/2.
22、0;/y方向的缩放量方向的缩放量C和平移量和平移量Dvoid myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);/clear the screenglBegin(GL_POINTS);for(GLdouble x=0;x 4.0;x+=0.005)Gldouble func=exp(-x)*cos(2*3.14159265*x);/sx=A*x+B,sy=C*y+DglVertex2d(A*x+B,C*func+D);glEnd();glFlush();/send all output to display例子例子2.2.3 用点集绘制函数用点集绘制函数
23、见计算机图形学课件见计算机图形学课件2016计算机图形学(计算机图形学(Opengl版第三版版第三版)书源代码书源代码word版版2.2.1-threeDots.doc f(x)=sin(x),f(x)=sin(2x),x从从-到到,y从从-1到到1A=screenWidth/6.28;/x方向的缩放量方向的缩放量A,屏幕宽度,屏幕宽度/x方向的变化范围方向的变化范围 B=screenWidth/2.0;/x方向的平移量方向的平移量B,屏幕宽度的一半,屏幕宽度的一半 C=screenHeight/2.0;/y方向的缩放量方向的缩放量C,屏幕高度,屏幕高度/y方向的变化范围方向的变化范围 D=s
24、creenHeight/2.0;/y方向的平移量方向的平移量D,屏幕的高度的一半屏幕的高度的一半for(GLdouble x=-3.14;x 3.14;x+=0.005)Gldouble func=sin(x);Gldouble func 1=sin(2x);/sx=A*x+B,sy=C*y+DglVertex2d(A*x+B,C*func+D);glVertex2d(A*x+B,C*func 1+D);前一页 休息232.3 OpenGL中的直线绘制中的直线绘制l绘制线段绘制线段glBegin(GL_LINES);/use constant GL_LINES here glVertex2i(
25、40,100);glVertex2i(202,96);glEnd();或者编写一个函数或者编写一个函数void drawLineInt(GLint x1,GLint y1,GLint x2,GLint y2)glBegin(GL_LINES);glVertex2i(x1,y1);glVertex2i(x2,y2);glEnd();2.3.1 绘制折线和多边形绘制折线和多边形折线就是一系列头尾相连的线段的集合,也称为线带。折线就是一系列头尾相连的线段的集合,也称为线带。glBegin(GL_LINE_STRIP);/draw an open polyline glVertex2i(20,10);
展开阅读全文