欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    基于OpenGL 的3D图形绘制.docx

    • 资源ID:27009722       资源大小:104.59KB        全文页数:29页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于OpenGL 的3D图形绘制.docx

    1、基于OpenGL 的3D图形绘制实验二 基于OpenGL的3D图形绘制一、实验目的与要求1. 学习 OpenGL 图形格式、数学原理;2. 掌握 OpenGL 基本图元的绘制,熟悉曲线、曲面、二次几何体的绘制技术;3. 掌握 OpenGL 光照、材质、纹理的基本原理;4. 掌握基于 Win32、Visual C+环境绘制3D 图形绘制原理、过程与步骤。二、实验仪器与设备1. 微型电子计算机 80台2. Windows 2000以上版本操作系统 80套3. Visual C+ 6.0开发系统 80套4. OpenGL 2.0 以上函数库 80套三、实验内容与步骤本实验主要做使用图形绘制系统,实现

    2、线条,矩形,圆,文本等基本图形的绘制,保存与打开功能。实验步骤如下。1. 设计流程图 图1设计流程图2. 关键代码解析2.1 基于Win32Conslolevoid background(void) glClearColor(0.0,0.0,0.0,0.0); /设置背景颜色为黑色void myDisplay(void) glClear(GL_COLOR_BUFFER_BIT); /buffer设置为颜色可写 glBegin(GL_TRIANGLES); /开始画三角形 glShadeModel(GL_SMOOTH); /设置为光滑明暗模式 glColor3f(1.0,0.0,0.0); /设

    3、置第一个顶点为红色 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(

    4、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

    5、,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函数运行void myReshape(GLsizei w,GLsizei h) glViewport(0,0,w,h); /设置视口 glMatrixMode(GL_PROJECTION); /指明当前矩阵为GL_PROJECTION glLoadIdentity(); /将当前矩阵置换为单位阵 if(w = h) gl

    6、uOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w); /定义二维正视投影矩阵 else gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5); glMatrixMode(GL_MODELVIEW); /指明当前矩阵为GL_MODELVIEWint main(int argc,char * argv) /*初始化*/ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,400)

    7、; glutInitWindowPosition(200,200); /*创建窗口*/ glutCreateWindow(OpenGL_Win32Console-1071301211高磊); /*绘制与显示*/ background(); glutReshapeFunc(myReshape); /注册当前窗口的形状变化回调函数 glutDisplayFunc(myDisplay); /注册当前窗口的显示回调函数 glutMainLoop(); /进入GLUT事件处理循环 return(0);2.2 基于Win32 APIint WINAPI WinMain( HINSTANCE hInstan

    8、ce, /实例 HINSTANCE hPrevInstance, / 前一个实例 LPSTR lpCmdLine, / 命令行参数 int nCmdShow) / 窗口显示状态 MSG msg; / Windowsx 消息结构 BOOL done=FALSE; / 用来退出循环的Bool 变量 / 创建OpenGL 窗口 if (!CreateGLWindow(OpenGL_Win32C-1071301211高磊,640,480,16) return 0; / 失败退出 while(!done) / 保持循环直到 done=TRUE if (PeekMessage(&msg,NULL,0,0,

    9、PM_REMOVE) /有消息在等待吗? if (msg.message=WM_QUIT) /收到退出消息? done=TRUE; else TranslateMessage(&msg); / 翻译消息 DispatchMessage(&msg); / 发送消息 else / 如果没有消息 / 绘制场景。监视ESC 键和来自DrawGLScene()的退出消息 if (active) / 程序激活的么? if (keysVK_ESCAPE) / ESC 按下了么? done=TRUE; / ESC 发出退出信号 else / 不是退出的时候,刷新屏幕 DrawGLScene(); / 绘制场景

    10、 SwapBuffers(hDC); / 交换缓存 (双缓存) KillGLWindow(); / 销毁窗口 return (msg.wParam);BOOL CreateGLWindow(char* title, int width, int height, int bits) GLuint PixelFormat; / 保存查找匹配的结果 WNDCLASS wc; / 窗口类结构 DWORD dwExStyle; / 扩展窗口风格 DWORD dwStyle; / 窗口风格 RECT WindowRect; / 取得矩形的左上角和右下角的坐标值 WindowRect.left=(long)

    11、0; / 将Left 设为0 WindowRect.right=(long)width; / 将Right 设为要求的宽度 WindowRect.top=(long)0; / 将Top 设为0 WindowRect.bottom=(long)height; / 将Bottom 设为要求的高度 hInstance= GetModuleHandle(NULL); / 取得我们窗口的实例 wc.style= CS_HREDRAW|CS_VREDRAW|CS_OWNDC; / 移动时重画,并为窗口取得DC wc.lpfnWndProc= (WNDPROC) WndProc; / WndProc 处理消

    12、息 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 (!Registe

    13、rClass(&wc) / 尝试注册窗口类 MessageBox(NULL,窗口类注册失败!,错误,MB_OK|MB_ICONEXCLAMATION); return FALSE; /退出并返回FALSE dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; / 扩展窗体风格 dwStyle=WS_OVERLAPPEDWINDOW; / 窗体风格 / 调整窗口达到真正要求的大小 AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); if (!(hWnd=CreateWindowEx( dwE

    14、xStyle, / 扩展窗体风格 OpenGL, / 类名字 title, / 窗口标题 dwStyle | / 必须的窗体风格属性 WS_CLIPSIBLINGS | / 必须的窗体风格属性 WS_CLIPCHILDREN, / 选择的窗体属性 0, 0, / 窗口位置 WindowRect.right-WindowRect.left, / 计算调整好的窗口宽度 WindowRect.bottom-WindowRect.top, / 计算调整好的窗口高度 NULL, / 无父窗口 NULL, / 无菜单 hInstance, / 实例 NULL) / 不向WM_CREATE 传递任何东东 K

    15、illGLWindow(); / 重置显示区 MessageBox(NULL,窗口创建失败!,错误,MB_OK|MB_ICONEXCLAMATION); return FALSE; static PIXELFORMATDESCRIPTOR pfd= / 告诉窗口我们所希望的东东 sizeof(PIXELFORMATDESCRIPTOR), /格式描述符的大小 1, / 版本号 PFD_DRAW_TO_WINDOW | / 格式必须支持窗口 PFD_SUPPORT_OPENGL | / 格式必须支持OpenGL PFD_DOUBLEBUFFER, / 必须支持双缓冲 PFD_TYPE_RGBA,

    16、 / 申请 RGBA 格式 bits, / 选定色彩深度 0, 0, 0, 0, 0, 0, / 忽略的色彩位 0, / 无Alpha 缓存 0, / 忽略Shift Bit 0, / 无聚集缓存 0, 0, 0, 0, / 忽略聚集位 16, / 16 位 Z-缓存 (深度缓存) 0, / 无模板缓存 0, / 无辅助缓存 PFD_MAIN_PLANE, / 主绘图层 0, / 保留 0, 0, 0 / 忽略层遮罩 ; if (!(hDC=GetDC(hWnd) /取得设备描述表了么? KillGLWindow(); / 重置显示区 MessageBox(NULL,创建GL DC 失败!,错

    17、误,MB_OK|MB_ICONEXCLAMATION); return FALSE; if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd) KillGLWindow(); / 重置显示区 MessageBox(NULL,找不到象素格式!,错误,MB_OK|MB_ICONEXCLAMATION); return FALSE; if(!SetPixelFormat(hDC,PixelFormat,&pfd) KillGLWindow(); / 重置显示区 MessageBox(NULL,不能设置象素格式!,错误,MB_OK|MB_ICONEXCLAMATION

    18、); return FALSE; if (!(hRC=wglCreateContext(hDC) / 能否取得着色描述表? KillGLWindow(); / 重置显示区 MessageBox(NULL,Cant Create A GL Rendering Context.,错误,MB_OK|MB_ICONEXCLAMATION); return FALSE; if(!wglMakeCurrent(hDC,hRC) / 尝试激活着色描述表 KillGLWindow(); / 重置显示区 MessageBox(NULL,创建GL RC 失败!,错误,MB_OK|MB_ICONEXCLAMATIO

    19、N); return FALSE; ShowWindow(hWnd,SW_SHOW); / 显示窗口 SetForegroundWindow(hWnd); / 略略提高优先级 SetFocus(hWnd); / 设置键盘的焦点至此窗口 ReSizeGLScene(width, height); / 设置透视 GL 屏幕 if (!InitGL() / 初始化新建的GL 窗口 KillGLWindow(); / 重置显示区 MessageBox(NULL,初始化失败!,错误,MB_OK|MB_ICONEXCLAMATION); return FALSE; return TRUE;LRESULT

    20、CALLBACK WndProc( HWND hWnd, / 窗口的句柄 UINT uMsg, / 窗口的消息 WPARAM wParam, / 附加的消息内容 LPARAM lParam) / 附加的消息内容 switch (uMsg) / 检查Windows 消息 case WM_ACTIVATE: / 监视窗口激活消息 if (!HIWORD(wParam) / 检查最小化状态 active=TRUE; / 程序处于激活状态 else active=FALSE; / 程序不再激活 return 0; / 返回消息循环 case WM_SYSCOMMAND: / 中断系统命令 switch

    21、 (wParam) / 检查系统调用 case SC_SCREENSAVE: / 屏保要运行? case SC_MONITORPOWER: / 显示器要进入节电模式? return 0; / 阻止发生 break; / 退出 case WM_CLOSE: /收到Close 消息? PostQuitMessage(0); / 发出退出消息 return 0; case WM_KEYDOWN: / 有键按下么? keyswParam = TRUE; / 如果是,设为TRUE return 0; / 返回 case WM_KEYUP: / 有键放开么? keyswParam = FALSE; / 如

    22、果是,设为FALSE return 0; / 返回 case WM_SIZE: / 调整OpenGL 窗口大小 ReSizeGLScene(LOWORD(lParam),HIWORD(lParam); return 0; / 返回 /向 DefWindowProc 传递所有未处理的消息。 return DefWindowProc(hWnd,uMsg,wParam,lParam);GLvoid KillGLWindow(GLvoid) if (hRC) / 拥有着色描述表吗? if (!wglMakeCurrent(NULL,NULL) /能否释放DC 和RC 描述表? MessageBox(N

    23、ULL,释放DC、RC 失败!,关闭失败,MB_OK | MB_ICONINFORMATION); if (!wglDeleteContext(hRC) / 能否删除RC? MessageBox(NULL,释放RC 失败!,关闭失败,MB_OK | MB_ICONINFORMATION); hRC=NULL; /将RC 设为 NULL if (hDC & !ReleaseDC(hWnd,hDC) / 能否释放 DC? MessageBox(NULL,释放DC 失败!, 关闭失败,MB_OK | MB_ICONINFORMATION); hDC=NULL; / 将 DC 设为 NULL if (

    24、hWnd & !DestroyWindow(hWnd) / 能否销毁窗口? MessageBox(NULL,销毁窗口失败!,关闭失败, MB_OK | MB_ICONINFORMATION); hWnd=NULL; / 将 hWnd 设为 NULL if (!UnregisterClass(OpenGL,hInstance) / 能否注销类? MessageBox(NULL,不能注销类!, 关闭失败,MB_OK | MB_ICONINFORMATION); hInstance=NULL; / 将 hInstance 设为 NULL int InitGL(GLvoid) glShadeModel

    25、(GL_SMOOTH); / 启用阴影平滑 glClearColor(255.0f, 255.0f, 255.0f, 0.5f); / 黑色背景 glClearDepth(1.0f); / 设置深度缓存 glEnable(GL_DEPTH_TEST); / 启用深度测试 glDepthFunc(GL_LEQUAL); / 所作深度测试的类型 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); / 真正精细的透视修正 return TRUE; / 初始化 OKGLvoid ReSizeGLScene(GLsizei width, GLsizei

    26、height) / 重置并初始化GL 窗口大小 if (height=0) / 防止被零除 height=1; / 将Height 设为1 glViewport(0,0,width,height); / 重置当前的视口 glMatrixMode(GL_PROJECTION); / 选择投影矩阵 glLoadIdentity(); / 重置投影矩阵 / 计算窗口的外观比例 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); / 选择模型观察矩阵 glLoadId

    27、entity(); / 重置模型观察矩阵int DrawGLScene(GLvoid) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 清除屏幕及深度缓存 glLoadIdentity(); / 重置视口 glTranslatef(-1.5f,1.0f,-6.0f); / 左移 1.5 单位,上移1.0,并移入屏幕 6.0 glColor3f(1.0,0.0,0.0); /设置第一个顶点为红色 glBegin(GL_TRIANGLES); / 绘制三角形 glVertex3f( 0.0f, 1.0f, 0.0f); / 上顶点 glV

    28、ertex3f(-1.0f,-1.0f, 0.0f); / 左下 glVertex3f( 1.0f,-1.0f, 0.0f); / 右下 glEnd(); / 三角形绘制结束 glTranslatef(3.0f,0.0f,0.0f); / 右移3 单位 glColor3f(0.0,0.0,1.0); glBegin(GL_QUADS); / 绘制矩形 glVertex3f(-1.0f, 1.0f, 0.0f); / 左上 glVertex3f( 1.5f, 1.0f, 0.0f); / 右上 glVertex3f( 1.5f,-1.0f, 0.0f); / 右下 glVertex3f(-1.0f,-1.0f, 0.0f); / 左下 glEnd(); / 矩形绘制结束 glTranslatef(-2.0f,-2.5f,2.0f); glRotated(yAngle,0.0f,1.0f,0.0f


    注意事项

    本文(基于OpenGL 的3D图形绘制.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开