计算机图形学OpenGL(第三版)第二章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前一页 休息 2
2.1 生成图像初步
通过练习(编写和测试各种不同图形的程序)可以 很快掌握计算机图形学。先从简单的任务开始,一 旦掌握,就试着变变花样,看看有哪些变化,试着 进一步绘制更复杂的场景。最好的学习办法是认真、 仔细地学习每行代码或等式。当你这么做时,就能 理解每个新概念。 每个图形程序都以一些初始化工作为开始,由此建 立程序所需要的显示模型和坐标系。
2.2.1 几个点丛绘制的例子

点丛是由大量点组成的某种图案。下面有几个点丛 例子。
前一页
休息
17
例子2.2.1 北斗星群
见计算机图形学课件2016\计算机图形学(Opengl版第三版)书 源代码word版\2.2.1-threeDots.doc
例子2.2.2 Sierpinski(塞平斯基)垫片
或者用浮点值代替整数值:
glBegin(GL_POINTS); glVertex2d(100.0, 50.0); glVertex2d(100.0, 130.0); glVertex2d(150.0, 130.0); glEnd();
OpenGL数据类型:
命令后缀和参数数据类型 OpenGL状态: OpenGL是由许多状态变量组成的状态机,这些状态包括点的大 小、绘图的颜色额屏幕窗口大小等,点的大小可以用 glPointSize()来设置,画图的颜色用这条语句设置: glColor3f(red,green,blue); 坐标系的建立:
index = rand()%3;
//P(k)=(P(k-1)+T)/2 point.x = (point.x + T[index].x) / 2; point.y = (point.y + T[index].y) / 2; drawDot(point.x,point.y); }
例子2.2.3 用点集绘制函数

前一页
休息
10
void main(int argc, char** argv) { glutInit(&argc, argv); // 初始化工具包
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式 glutInitWindowSize(640,480); // 设置窗口大小
void myInit(void) { glMatrixMode(GL_PROJECTION);
glLoadIdentity(); gluOrtho2D(0, 640.0, 0, 480.0); } myInit设置坐标系,设置透视投影变换。 gluOrtho2D设置正交投影。 组合在一起:建立起一个完整的OpenGL程序 glFlush()函数保证所有的数据被完全处理并显 示。

前一页 休息 6
2.1.2 窗口的编程
下面是使用GLUT库,名为myMouse的回调函数例 子,它方便地注册了与鼠标关联的事件: glutMouseFunc(myMouse); glutMouseFunc是GLUT库的固有函数,但是回调函 数myMouse是程序员定义的,并由程序员编写代码, 处理每个可能感兴趣的鼠标动作。 4种主要的OpenGL库: 1)基本GL库,OpenGL库的基础。它提供OpenGL的 基本函数。每个OpenGL函数都以字符GL开头。
见计算机图形学课件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中的一点作为要绘制的 初始点P0。 迭代下面的(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)。
见计算机图形学课件2016\计算机图形学(Opengl版第三版)书 源代码word版\2.2.1-threeDots.doc
绘制某个数学函数f(x),当x在0~4变化时的曲线。当绘制曲线 时,因为0~4之间的x值位于屏幕窗口左下角的前4个像素上, 而且f(.)的负值位于窗口的下面,根本看不到。需要进行平移 和缩放使曲线正好出现在合适的屏幕窗口。将世界坐标系转换 为 窗口坐标系。 x方向缩放:假定屏幕窗口为screenWidth,单位为像素,现在x的 范围为0~4,故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
例子2.2.2 Sierpinski(塞平斯基)垫片 //初始值P(0),在for循环外面 GLintPoint point = T[index]; // 初始值 drawDot(point.x, point.y); // 画初始点 for(int i = 0; i < 1000; i++) //画1000点 {
前一页
休息
5
2.1.2 窗口的编程
事件驱动编程:事件包括单击鼠标,按下键盘上的 按键,或者重新调整窗口的大小。程序员将程序组 织成回调函数的集合,这些回调函数一有事件发生 就执行。即什么也不做,等待事件发生,事件发生 后再做指定的事。OpenGL有一个GLUT库,它用来 打开窗口,管理菜单和处理事件等。 注册回调函数:有一种方法将每种类型的事件与要 求的回调函数关联起来,这个方法称之为注册回调 函数。程序中用到的每一个事件类型都必须用回调 函数注册,该回调函数的名字和定义由程序员选择。

前一页
休息
3
2.1 生成图像初步

初始化时,将显示器设置为“图形模式”,并且建 立了坐标系,坐标x和y以像素为单位,x向右递增, y向下递增。
前一页
休息
4
2.1.1 设备无关的编程 和OpenGL

OpenGL程序可以在不同的图形环境里编译和运行, 即它是与设备无关的编程。OpenGL是一个开源图形 库,可在http://www.opengl.org下载。OpenGL常被 称为应用程序接口(API)。这个接口是程序员可以 调用的例程,先从OpenGL绘制简单的二维物体开始, 然后学习绘制三维图形。

前一页 休息 7
2.1.2 窗口的编程
2)GLUT库:GL实用工具包。它用来打开窗口,开 发和管理菜单,以及管理事件等。 3)GLU库:GL实用库,它提供高级例程,处理矩 阵操作和绘制二次曲面如球和圆柱体; 4)GLUI库:用户接口库,提供控制工具和菜单。 glutDisplayFunc(myDisplay):重绘窗口调用 myDisplay回调函数; glutReshapeFun(myReshape):对屏幕窗口的形状 进行调整;
}
2.1.3 如何打开一个窗口画图
glutInit:该函数初始化工具包 glutDisplayMode(GLUT_SINGLE | GLUT_RGB): 分 配单个显示缓存 glutInitWindowSize(640,480): 该函数指定屏幕的初 始尺寸,宽640像素,高480像素。 glutCreateWindow(“my first attempt”):该函 数打开并显示屏幕窗口吗,并显示标题。 代码如下:
2.2 OpenGL的基本图形元素

屏幕坐标系:宽为640,高为640。x坐标从左边界0 增加到右边界639,y坐标从0增加到上边的479。
前一页
休息
13
绘制三个点: glBegin(GL_POINTS); glVertex2i(100, 50); glVertex2i(100, 130); glVeHale Waihona Puke Baidutex2i(150, 130); glEnd();
本章内容
编写图形程序 学习OpenGL程序的基本组成 开发绘制点、直线、折线和多边形的基 本图形工具 学会用鼠标和键盘控制程序

前一页
休息
1
2.0 vc opengl 编程 指导例子
熟悉代码,多次练习 见图形学第二课opengl-console.doc,创建 一个控制台的应用程序,本书采用的编 程方式 见图形学第二课opengl-nehe-win.doc,创 建一个win32的应用程序,nehe教程(共 48课)采用的编程方式 见图形学第三课opengl-nehe-mfc.doc,创 建一个mfc的应用程序,本人推荐采用的 编程方式,需要学习vc和mfc。

前一页 休息 8
void main() { glutDisplayFunc(myDisplay); // 注册重绘函数 glutReshapeFunc(myReshape); // 注册改变窗口形状函数
glutMouseFunc(myMouse); // 注册鼠标动作函数 glutMotionFunc(myMouse); // 注册鼠标移动函数 glutKeyboardFunc(myKeyboard); // 注册键盘动作函数 //可能初始化其他工作 glutMainLoop(); // 进入主循环等待事件发生
const int screenWidth = 640; // width 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(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_COLOR_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 }
glutInitWindowPosition(100, 150); // 设置窗口在屏幕上的位置
glutCreateWindow("my first attempt"); // 打开屏幕窗口
// 注册回调函数 glutDisplayFunc(myDisplay); glutReshapeFunc(myReshape); glutMouseFunc(myMouse); glutKeyboardFunc(myKeyboard); myInit(); // 必要的其他初始化工作 glutMainLoop(); // 进入循环 }
相关文档
最新文档