计算机图形学opengl(第三版)第二章课件

上传人:F****n 文档编号:88196861 上传时间:2019-04-20 格式:PPT 页数:48 大小:470KB
返回 下载 相关 举报
计算机图形学opengl(第三版)第二章课件_第1页
第1页 / 共48页
计算机图形学opengl(第三版)第二章课件_第2页
第2页 / 共48页
计算机图形学opengl(第三版)第二章课件_第3页
第3页 / 共48页
计算机图形学opengl(第三版)第二章课件_第4页
第4页 / 共48页
计算机图形学opengl(第三版)第二章课件_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《计算机图形学opengl(第三版)第二章课件》由会员分享,可在线阅读,更多相关《计算机图形学opengl(第三版)第二章课件(48页珍藏版)》请在金锄头文库上搜索。

1、1,本章内容,编写图形程序 学习OpenGL程序的基本组成 开发绘制点、直线、折线和多边形的基本图形工具 学会用鼠标和键盘控制程序,2,2.0 vc opengl 编程 指导例子,熟悉代码,多次练习 见图形学第二课opengl-console.doc,创建一个控制台的应用程序,本书采用的编程方式 见图形学第二课opengl-nehe-win.doc,创建一个win32的应用程序,nehe教程(共48课)采用的编程方式 见图形学第三课opengl-nehe-mfc.doc,创建一个mfc的应用程序,本人推荐采用的编程方式,需要学习vc和mfc。,3,2.1 生成图像初步,通过练习(编写和测试各种

2、不同图形的程序)可以很快掌握计算机图形学。先从简单的任务开始,一旦掌握,就试着变变花样,看看有哪些变化,试着进一步绘制更复杂的场景。最好的学习办法是认真、仔细地学习每行代码或等式。当你这么做时,就能理解每个新概念。 每个图形程序都以一些初始化工作为开始,由此建立程序所需要的显示模型和坐标系。,4,2.1 生成图像初步,初始化时,将显示器设置为“图形模式”,并且建立了坐标系,坐标x和y以像素为单位,x向右递增,y向下递增。,5,2.1.1 设备无关的编程 和OpenGL,OpenGL程序可以在不同的图形环境里编译和运行,即它是与设备无关的编程。OpenGL是一个开源图形库,可在http:/www

3、.opengl.org下载。OpenGL常被称为应用程序接口(API)。这个接口是程序员可以调用的例程,先从OpenGL绘制简单的二维物体开始,然后学习绘制三维图形。,6,2.1.2 窗口的编程,事件驱动编程:事件包括单击鼠标,按下键盘上的按键,或者重新调整窗口的大小。程序员将程序组织成回调函数的集合,这些回调函数一有事件发生就执行。即什么也不做,等待事件发生,事件发生后再做指定的事。OpenGL有一个GLUT库,它用来打开窗口,管理菜单和处理事件等。 注册回调函数:有一种方法将每种类型的事件与要求的回调函数关联起来,这个方法称之为注册回调函数。程序中用到的每一个事件类型都必须用回调函数注册,

4、该回调函数的名字和定义由程序员选择。,7,2.1.2 窗口的编程,下面是使用GLUT库,名为myMouse的回调函数例子,它方便地注册了与鼠标关联的事件: glutMouseFunc(myMouse); glutMouseFunc是GLUT库的固有函数,但是回调函数myMouse是程序员定义的,并由程序员编写代码,处理每个可能感兴趣的鼠标动作。 4种主要的OpenGL库: 1)基本GL库,OpenGL库的基础。它提供OpenGL的基本函数。每个OpenGL函数都以字符GL开头。,8,2.1.2 窗口的编程,2)GLUT库:GL实用工具包。它用来打开窗口,开发和管理菜单,以及管理事件等。 3)G

5、LU库:GL实用库,它提供高级例程,处理矩阵操作和绘制二次曲面如球和圆柱体; 4)GLUI库:用户接口库,提供控制工具和菜单。 glutDisplayFunc(myDisplay):重绘窗口调用myDisplay回调函数; glutReshapeFun(myReshape):对屏幕窗口的形状进行调整;,void main() glutDisplayFunc(myDisplay); / 注册重绘函数 glutReshapeFunc(myReshape); / 注册改变窗口形状函数 glutMouseFunc(myMouse); / 注册鼠标动作函数 glutMotionFunc(myMouse)

6、; / 注册鼠标移动函数 glutKeyboardFunc(myKeyboard); / 注册键盘动作函数 /可能初始化其他工作 glutMainLoop(); / 进入主循环等待事件发生 ,10,2.1.3 如何打开一个窗口画图,glutInit:该函数初始化工具包 glutDisplayMode(GLUT_SINGLE | GLUT_RGB): 分配单个显示缓存 glutInitWindowSize(640,480): 该函数指定屏幕的初始尺寸,宽640像素,高480像素。 glutCreateWindow(“my first attempt”):该函数打开并显示屏幕窗口吗,并显示标题。

7、代码如下:,void main(int argc, char* argv) glutInit( / 打开屏幕窗口,/ 注册回调函数 glutDisplayFunc(myDisplay); glutReshapeFunc(myReshape); glutMouseFunc(myMouse); glutKeyboardFunc(myKeyboard); myInit(); / 必要的其他初始化工作 glutMainLoop(); / 进入循环 ,13,2.2 OpenGL的基本图形元素,屏幕坐标系:宽为640,高为640。x坐标从左边界0增加到右边界639,y坐标从0增加到上边的479。,绘制三个

8、点: glBegin(GL_POINTS); glVertex2i(100, 50); glVertex2i(100, 130); glVertex2i(150, 130); glEnd(); 或者用浮点值代替整数值: glBegin(GL_POINTS); glVertex2d(100.0, 50.0); glVertex2d(100.0, 130.0); glVertex2d(150.0, 130.0); glEnd();,OpenGL数据类型: 命令后缀和参数数据类型 OpenGL状态: OpenGL是由许多状态变量组成的状态机,这些状态包括点的大小、绘图的颜色额屏幕窗口大小等,点的大小

9、可以用glPointSize()来设置,画图的颜色用这条语句设置: glColor3f(red,green,blue); 坐标系的建立:,void myInit(void) glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 640.0, 0, 480.0); myInit设置坐标系,设置透视投影变换。gluOrtho2D设置正交投影。 组合在一起:建立起一个完整的OpenGL程序 glFlush()函数保证所有的数据被完全处理并显示。,17,2.2.1 几个点丛绘制的例子,点丛是由大量点组成的某种图案。下面有几个点丛例子。

10、,例子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),每一个点都依赖于前一个点P(k-1),过程如下: (1)选择三个固定的点T0,T1,T2,构成一个三角形,称为每个Sierpinski垫片的父三角形; (2)随机选择父三角形顶点T0,T1,T2中的一点作为要绘制的初始点P

11、0。 迭代下面的(3)(5)步,直到图案填充完毕。 (3)随机选择T0,T1,T2中的一点,称为T。 (4)构造下一个点P(k),作为T和前一个已建好的点P(k-1)之间的之间点,即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)

12、=(P(k-1)+T)/2 point.x = (point.x + Tindex.x) / 2; point.y = (point.y + Tindex.y) / 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(.)的负值位于窗口的下面,根本看不到。需要进行平移和缩放使曲线正好出现在合适的屏幕窗口。将世界坐标

13、系转换为 窗口坐标系。 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.0;sx,sy为屏幕坐标,x,y为窗口坐标;转换方程为: sx= A * x + B sy =C * y + D,const int screenWidth = 640; / w

14、idth of screen window in pixels const int screenHeight = 480; / height of screen window in pixels GLdouble A, B, C, D; / values used for scaling and shifting void myInit(void) glClearColor(1.0,1.0,1.0,0.0); / background color is white glColor3f(0.0f, 0.0f, 0.0f); / drawing color is black glPointSize

15、(2.0); / a dot is 2 by 2 pixels glMatrixMode(GL_PROJECTION); / set “camera shape“ glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)screenWidth, 0.0, (GLdouble)screenHeight); A = screenWidth / 4.0; / x方向的缩放量A B = 0.0; /x方向的平移量B C = D = screenHeight / 2.0;/ y方向的缩放量C和平移量D void myDisplay(void) glClear(GL_COL

16、OR_BUFFER_BIT); / clear the screen glBegin(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 + D glVertex2d(A * x + B, C * func + D); glEnd(); glFlush(); / send all output to display ,例子2.2.3 用点集绘制函数 见计算机图形学课件2016计算机图形学(Opengl版第三版)书源代码word版2.2.1-threeDots.doc f(x)=sin(x),f(x)=sin(2x),x从-到,y从-1到1 A = screenWidth /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号