您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于OpenGL-的3D图形绘制
《多媒体技术实验》实验报告册班级:计算机1072姓名:高磊学号:10713012111实验二基于OpenGL的3D图形绘制一、实验目的与要求1.学习OpenGL图形格式、数学原理;2.掌握OpenGL基本图元的绘制,熟悉曲线、曲面、二次几何体的绘制技术;3.掌握OpenGL光照、材质、纹理的基本原理;4.掌握基于Win32、VisualC++环境绘制3D图形绘制原理、过程与步骤。二、实验仪器与设备1.微型电子计算机80台2.Windows2000以上版本操作系统80套3.VisualC++6.0开发系统80套4.OpenGL2.0以上函数库80套三、实验内容与步骤本实验主要做使用图形绘制系统,实现线条,矩形,圆,文本等基本图形的绘制,保存与打开功能。实验步骤如下。1.设计流程图图1设计流程图2.关键代码解析开始选择演示模式选择演示类型设置光照和材质鼠标操纵3D图形翻转、移动是否自动旋转?设置旋转速度是否结束停止转动自动旋转演示《多媒体技术实验》实验报告册班级:计算机1072姓名:高磊学号:107130121122.1基于Win32Conslolevoidbackground(void){glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色}voidmyDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写glBegin(GL_TRIANGLES);//开始画三角形glShadeModel(GL_SMOOTH);//设置为光滑明暗模式glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色glVertex2f(0.0,-1.0);//设置第二个顶点的坐标glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色glVertex2f(-0.5,1.0);//设置第三个顶点的坐标glEnd();//三角形结束glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(1.0f,-0.5f);glEnd();glLineWidth(3.0f);glBegin(GL_LINES);glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色glVertex2f(0.3f,-1.0f);glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色glVertex2f(1.3f,-1.0f);glEnd();glBegin(GL_POLYGON);//画五边形glColor3f(1.0,0.0,0.0);glVertex2f(0.0f,0.0f);glColor3f(0.0,1.0,0.0);glVertex2f(1.0f,0.0f);glColor3f(0.0,0.0,1.0);glVertex2f(1.5f,1.0f);glColor3f(1.0,1.0,0.0);glVertex2f(0.5f,1.5f);glColor3f(0.0,0.0,1.0);glVertex2f(-0.5f,1.0f);glEnd();//五边形结束glFlush();//强制OpenGL函数运行}voidmyReshape(GLsizeiw,GLsizeih)《多媒体技术实验》实验报告册班级:计算机1072姓名:高磊学号:10713012113{glViewport(0,0,w,h);//设置视口glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTIONglLoadIdentity();//将当前矩阵置换为单位阵if(w=h)gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵elsegluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW}intmain(intargc,char**argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow(OpenGL_Win32Console-1071301211高磊);/*绘制与显示*/background();glutReshapeFunc(myReshape);//注册当前窗口的形状变化回调函数glutDisplayFunc(myDisplay);//注册当前窗口的显示回调函数glutMainLoop();//进入GLUT事件处理循环return(0);}2.2基于Win32APIintWINAPIWinMain(HINSTANCEhInstance,//实例HINSTANCEhPrevInstance,//前一个实例LPSTRlpCmdLine,//命令行参数intnCmdShow)//窗口显示状态{MSGmsg;//Windowsx消息结构BOOLdone=FALSE;//用来退出循环的Bool变量//创建OpenGL窗口if(!CreateGLWindow(OpenGL_Win32C-1071301211高磊,640,480,16)){return0;//失败退出}while(!done)//保持循环直到done=TRUE{if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))//有消息在等待吗?{《多媒体技术实验》实验报告册班级:计算机1072姓名:高磊学号:10713012114if(msg.message==WM_QUIT)//收到退出消息?{done=TRUE;}else{TranslateMessage(&msg);//翻译消息DispatchMessage(&msg);//发送消息}}else//如果没有消息{//绘制场景。监视ESC键和来自DrawGLScene()的退出消息if(active)//程序激活的么?{if(keys[VK_ESCAPE])//ESC按下了么?{done=TRUE;//ESC发出退出信号}else//不是退出的时候,刷新屏幕{DrawGLScene();//绘制场景SwapBuffers(hDC);//交换缓存(双缓存)}}}}KillGLWindow();//销毁窗口return(msg.wParam);}BOOLCreateGLWindow(char*title,intwidth,intheight,intbits){GLuintPixelFormat;//保存查找匹配的结果WNDCLASSwc;//窗口类结构DWORDdwExStyle;//扩展窗口风格DWORDdwStyle;//窗口风格RECTWindowRect;//取得矩形的左上角和右下角的坐标值WindowRect.left=(long)0;//将Left设为0WindowRect.right=(long)width;//将Right设为要求的宽度WindowRect.top=(long)0;//将Top设为0WindowRect.bottom=(long)height;//将Bottom设为要求的高度hInstance=GetModuleHandle(NULL);//取得我们窗口的实例wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;//移动时重画,并为窗口取得DC《多媒体技术实验》实验报告册班级:计算机1072姓名:高磊学号:10713012115wc.lpfnWndProc=(WNDPROC)WndProc;//WndProc处理消息wc.cbClsExtra=0;//无额外窗口数据wc.cbWndExtra=0;//无额外窗口数据wc.hInstance=hInstance;//设置实例wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);//装入缺省图标wc.hCursor=LoadCursor(NULL,IDC_ARROW);//装入鼠标指针wc.hbrBackground=NULL;//GL不需要背景wc.lpszMenuName=NULL;//不需要菜单wc.lpszClassName=OpenGL;//设定类名字if(!RegisterClass(&wc))//尝试注册窗口类{MessageBox(NULL,窗口类注册失败!,错误,MB_OK|MB_ICONEXCLAMATION);returnFALSE;//退出并返回FALSE}dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;//扩展窗体风格dwStyle=WS_OVERLAPPEDWINDOW;//窗体风格//调整窗口达到真正要求的大小AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);if(!(hWnd=CreateWindowEx(dwExStyle,//扩展窗体风格OpenGL,//类名字title,//窗口标题dwStyle|//必须的窗体风格属性WS_CLIPSIBLINGS|//必须的窗体风格属性WS_CLIPCHILDREN,//选择的窗体属性0,0,//窗口位置WindowRect.right-WindowRect.left,//计算调整好的窗口宽度WindowRect.bottom-WindowRect.top,//计算调整好的窗口高度NULL,//无父窗口NULL,//无菜单hInstance,//实例NULL)))//不向WM_CREATE传递任何东东{KillGLWindow();//重置显示区MessageBox(NULL,窗口创建失败!,错误,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}staticPIXELFORMATDESCRIPTORpfd=//告诉窗口我们所希望的东东{sizeof(PIXELFORMATDESCRIPTOR),//格式描述符的大小1,//版本号PFD_DRAW_TO_WINDOW|//格式必须支持窗口PFD_SUPPORT_OPENGL|//格式必须支持OpenGL《多媒体技术实验》实验报告册班级:计算机1072姓名:高磊学号:10713012116PFD_DOUBLEBUFFER,//必须支持双缓冲PFD_TYPE_RGBA,//申请RGBA格式bits,//选定色彩深度0,0,0,0,0,0,//忽略的色彩位0,//无Alpha缓存0,//忽略ShiftBit0,//无聚集缓存0,0,0,0,//忽略聚集位16,//16位Z-缓存(深度缓存)0,//无模板缓存0,//无辅助缓存PFD_MAIN_PLANE,//主绘图层0,//保留0,0,0//忽略层遮罩};if(!(hDC=GetDC(hWnd)))//取得设备描述表了么?{KillGLWindow();//重置显示区MessageBox(NULL,创建GLDC失败!,错误,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){KillGLWindow();//重置显示区MessageBox(NULL,找不到象素格式!,错误,MB_OK|MB_ICONEXCLAMATION);returnFALSE;}if(!SetPixelFormat(hDC,PixelF
本文标题:基于OpenGL-的3D图形绘制
链接地址:https://www.777doc.com/doc-4262234 .html