《》实验报告专业年级姓名学号指导老师实验室使用日期苏州大学计算机科学与技术学院统一印制二零零二年八月苏州大学计算机科学与技术学院计算机图形学实验指导书(MFC和OpenGL版)计算机图形学课题组目录实验一OpenGL程序设计实验二二维基本图元的生成实验三二维图元的填充实验四二维图形的几何变换实验五二维裁剪实验六自由曲线前言一、实验目的1、培养学生动手编程解决实际问题的能力。
2 训练学生分析问题和调试程序的能力。
3 锻炼学生撰写科技实验论文的能力。
二、实验总体要求1 问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。
2 程序设计(1) 根据所采用的算法,设计数据结构,画出流程图并编程。
(2) 最后准备调试程序的数据及测试方案。
3 上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。
(2) 调试前,先运行一遍程序看看究竟将会发生什么。
(3) 如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。
4 整理实习报告三、实验报告1 实习内容:采用的算法名称2 问题描述:包括目标、任务、条件约束描述等。
3 设计:数据结构设计和核心算法设计。
主要功能模块的输入,处理(算法框架)和输出。
4 测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
5 心得:包括程序的改进设想,经验和体会。
6 程序清单:源程序,其中包括变量说明及详细的注释。
实验1 OpenGL 程序设计实验目的巩固计算机图形学和C语言程序设计的相关知识,初步了解通用图形软件包,了解常见的图元的生成方法,学会图形显示设备的初始化及其交互式图形生成的过程,锻炼程序调试的技巧。
实验学时2学时实验类型学习型实验实验要求初步了解OpenGL 程序设计结构;了解OpenGL 的基本数据类型、核心函数及辅助函数的使用。
四、实验内容1、综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL 提供了完备的支持。
OpenGL 提供了一系列的辅助函数,用于简化Windows 操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。
2、实验步骤在VC 中新建项目新建一个项目。
选择菜单File 中的New 选项,弹出一个分页的对话框,选中页Projects 中的Win32 Console Application 项,然后填入你自己的Project name,如Test,回车即可。
VC 为你创建一个工作区(WorkSpace),你的项目Test 就放在这个工作区里。
为项目添加文件为了使用OpenGL,我们需要在项目中加入三个相关的Lib 文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\Microsoft Visual Studio\vc98\lib 目录中。
选中菜单Project->Add To Project->Files 项(或用鼠标右键),把这三个文件加入项目,在FileView 中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。
点击工具条中New Text File 按钮,新建一个文本文件,存盘为Test.c 作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。
#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>//初始化OpenGL 场景void myinit (void){glClearColor (0.0, 0.0, 0.0, 0.0); //将背景置成黑色glShadeModel (GL_FLAT); //设置明暗处理}//用户的绘图过程void CALLBACK display(void){glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除缓存glBegin(GL_LINES); //开始画一根白线glColor3f (1.0f, 1.0f, 1.0f);//设置颜色为白色//设置第一根线的两个端点,请注意:OpenGL 坐标系的原点是在屏幕左下角glVertex2f(10.0f, 50.0f);glVertex2f(110.0f, 50.0f);glColor3f (1.0f, 0.0f, 0.0f);//设置颜色为红色//设置第二根线的两个端点glVertex2f(110.0f, 50.0f);glVertex2f(110.0f, 150.0f);glEnd(); //画线结束glFlush (); //绘图结束}//主过程:// 初始化Windows 的窗口界面;并初始化OpenGL 场景,绘图int main(int argc, char** argv){auxInitDisplayMode (AUX_RGB);//初始化显示模式,采用RGB 彩色系统。
auxInitPosition (0, 0, 400, 150); //初始化窗口位置、大小auxInitWindow ("Display Lists"); //初始化窗口,设置标题myinit ();auxMainLoop(display);//循环运行display 过程,display 由用户编写return(0);}2).OpenGL基础库设置•更改头文件(在视图类的头文件中引用gl\gl.h gl\glu.h)•连接OpenGL库(工程——设置——General/Use MFC in a Library, Link/OpenGL32.lib glu32.lib)3).添加变量和函数•添加变量并初始化•CClientDC * MyDC;•视图类的构造函数中MyDC=NULL;•添加消息映射函数•OnCreate()•OnSize()•OnDestroy()4).在PreCreateWindow函数中将窗口的客户区设置为OpenGL能够支持的风格cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS; 5).在OnCreate函数中•定义像素存储格式•PIXELFORMATDESCRIPTOR结构•创建绘图上下文RC(Rendering Context)并使之当前化•wglCreateContext()函数创建绘图上下文RC。
PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), // pfd的大小1, //结构的版本号PFD_DRAW_TO_WINDOW| //支持windowPFD_SUPPORT_OPENGL| //支持OpenGLPFD_DOUBLEBUFFER, //双缓存PFD_TYPE_RGBA, //RGBA颜色模式24, //24位颜色深度缓存0,0,0,0,0,0, //color bits ignored0, //no alpha buffer0, //shift bit ignored0, //不使用累积缓存0,0,0,0, //accum bits ignored32, //32位z缓冲0, //不使用模板缓存0, //no auxiliary bufferPFD_MAIN_PLANE, //选择主层面0, //保留0,0,0 //layer masks ignored};MyDC=new CClientDC(this);//设置像素格式int pixelFormat=ChoosePixelFormat(MyDC->GetSafeHdc(),&pfd); SetPixelFormat(MyDC->GetSafeDC(),pixelFormat,&pfd);m_hRC=wglCreateContext(MyDC->m_hDC);wglMakeCurrent(MyDC->GetSafeHdc(),m_hRC);6).在OnSize函数中设置视场和视口If(cy>0){glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,9.0);glViewport(0,0,cx,cy);}7).在OnDestroy函数:在OnDestroy成员中需要释放OnCreate成员中RC所占用的资源HGLRC m_hRC;m_hRC=wglGetCurrentContext();wglMakeCurrent(NULL,NULL);wglDeleteContext(m_hRC);MyDC->DeleteDC();8)在OnEraseBKgnd中将原来的返回语句换成返回TRUE;9).在OnDraw中根据当前的视点、视距、观看方向等参数,设置合适的OpenGL视景体属性,使用户能够看到预期的场景外观glClearColor(1.0f,1.0f,0.0f,1.0f);//背景为黄色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0f,0.0f,-6.0f);glBegin(GL_LINES); //OpenGL绘制直线命令glColor3f(1.0,0.0,0.0); //设置当前颜色为红色glVertex2f(0,0);glVertex2f(1,1);glColor3f(0.0,1.0,0.0); //设置当前颜色为绿色glVertex2f(0.2f,0.0f);//glVertex2f(1.2f,1.0f);glEnd();glFinish();SwapBuffers(wglGetCurrentDC());3、程序说明每个函数的具体含义在程序注释中已作了叙述,不再多说。
OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如:glColor3f(),字母f指明要使用浮点数。
字母前的数字指明参数个数或指明二维还是三维,如:glVertex2f()是要设置二维的点。