基于opengl的3D天体运动模型设计方案

上传人:仙*** 文档编号:29739408 上传时间:2021-10-08 格式:DOC 页数:13 大小:339KB
收藏 版权申诉 举报 下载
基于opengl的3D天体运动模型设计方案_第1页
第1页 / 共13页
基于opengl的3D天体运动模型设计方案_第2页
第2页 / 共13页
基于opengl的3D天体运动模型设计方案_第3页
第3页 / 共13页
资源描述:

《基于opengl的3D天体运动模型设计方案》由会员分享,可在线阅读,更多相关《基于opengl的3D天体运动模型设计方案(13页珍藏版)》请在装配图网上搜索。

1、基于opengl的3D天体运动模型设计方案学 生: _?_ 学 号: * 指导老师: _?_ 一、背景简介1.1设计概述本3D建模设计运用Win32程序设计的基本原理,基于OpenGL接口函数,以Microsoft Visual Studio 2008为开发工具,以C+语言为开发语言,设计了一个星空背景下的太阳地球月球公转自转运动模型,模拟了太阳的光照效果,并实现了可以加速和减速地球和月球的自转、公转速度,而且还可以调整视图的远近和方位,方便各方面的观察。1.2 OpenGL的基本特点OpenGL即开放图形库(Open Graphics Library),是一个三维的计算机图形和模型库。Ope

2、nGL作为一个性能优越的图形应用程序设计接口,适用于广泛的计算机环境。从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。OpenGL是一个与硬件图形发生器的软件接口,它包括了100多个图形操作函数,开发者可以利用这些函数来构造景物模型、进行三维图形交互软件的开发。正如上一章所述,OpenGL是一个高性能的图形开发软件包。OpenGL支持网络,在网络系统中用户可以在不同的图形终端上运行程序显示图形。OpenGL作为一个与硬件独立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供描述类似于飞机、汽车、分子形状等复杂形体的图形操作函数。用户必须从点、线、面等

3、最基本的图形单元开始构造自己的三维模型。当然,像OpenInventor那样更高一级的基于OpenGL的三维图形建模开发软件包将提供方便的工具。因此OpenGL的图形操作函数十分基本、灵活。它具有如下特点。(1) 图形质量好、性能高。无论是三维动画、CAD,还是视觉模拟、可视化计算等,都利用了OpenGL高图形质量、高性能的特点。这个特点使得程序开发者在广播、CAD/CAM/CAE、娱乐、医学图像和虚拟现实等领域中创造和显示出难以想象的2D和3D图形。(2) 行业标准。OpenGL ARB作为独立的联合委员会,制定规范文档(Specification)。随着业内厂商的支持,OpenGL成为唯一

4、真正开放的、独立于供应商的、跨平台的标准。(3) 稳定性。OpenGL能够在各种平台上执行,而且OpenGL高版本兼容低版本,保证了已经开发的应用程序不会失效。(4) 可移植性和可靠性。利用OpenGL技术开发的应用图形软件与硬件无关,只要硬件支持OpenGL API标准就行了,也就是说,OpenGL应用程序可以运行在支持OpenGL API标准的任何硬件上。但是,硬件是不断变化的,OpenGL如何保持可移植性呢?OpenGL扩展(OpenGL Extension)正是为这一目的而设计的。厂商只要提供OpenGL扩展,就可以轻松实现硬件特有的功能。利用OpenGL扩展,OpenGL实现者(Op

5、enGL Implementer)也可以添加新的处理算法。(5) 可扩展性。OpenGL是低级的图形API,它具有充分的可扩展性。许多OpenGL开发商在OpenGL核心技术规范的基础上,增强了许多图形绘制功能,从而使OpenGL能紧跟最新硬件发展和计算机图形绘制算法的发展。对于硬件特性的升级可以体现在OpenGL扩展机制以及OpenGL API中,一个成功的OpenGL扩展会被融入在未来的OpenGL版本之中。通过这种方法,程序开发者和硬件厂商能够在正常的产品周期中组合出新的产品。(6) 可适应性。基于OpenGL API的图形应用程序可以运行在许多系统上,包括各种用户电子设备、PC、工作站

6、以及超级计算机。由此,OpenGL应用程序可以适应开发人员选择的各种目标平台。(7) 易用性。OpenGL具有良好的结构、直观的设计和逻辑命令。与其他图形程序包相比,OpenGL只有很少的代码,因此执行速度快。另外,OpenGL封装了有关基本硬件的信息,使得开发者无须针对具体的硬件特征进行设计。二、概要设计2.1 程序流程图1 程序运行流程图本节将对程序具体的实现进行说明。开始之前要引用程序要求的头文件:#include / Windows的头文件#include / OpenGL32库的头文件#include / Glu32库的头文件#include / Glaux库的头文件#include

7、 / 标准输入/输出库的头文件#include / math函数库要加入程序要求的库到链接器中:#pragma comment (lib, opengl32.lib)/ 链接时查找OpenGL32.lib#pragma comment (lib, glu32.lib)/ 链接时查找glu32.lib#pragma comment (lib, glaux.lib)/ 链接时查找glaux.lib2.1.1 注册窗口RegisterWindowClass(Application* application)(1)定义窗口类:WNDCLASSEX windowClass;/ 窗口类;(2)清空内存:Z

8、eroMemory (&windowClass, sizeof(WNDCLASSEX);/ 清空内存;(3)设置窗口类的属性;窗口类的大小:windowClass.cbSize= sizeof(WNDCLASSEX);/ 窗口类的大小;重绘 :windowClass.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;/ 在窗口移动,改变大小的时候重绘;绑定处理消息的函数:windowClass.lpfnWndProc= (WNDPROC)(WindowProc);/ 用WindowProc函数处理消息;设置实例:windowClass.hInstance= a

9、pplication-hInstance;/ 设置实例画刷颜色:windowClass.hbrBackground= (HBRUSH)(COLOR_APPWORKSPACE);/ 类背景的画刷颜色;鼠标指针:windowClass.hCursor= LoadCursor(NULL, IDC_ARROW);/ 载入鼠标指针;设置类名:windowClass.lpszClassName= application-className;/ 设置应用程序的类名;(4)如果注册失败,返回失败消息。2.1.2 创建窗口CreateWindowGL(GL_Window* window)(1)设置窗口样式:DW

10、ORD windowStyle = WS_OVERLAPPEDWINDOW;设置窗口扩展样式:DWORD windowExtendedStyle = WS_EX_APPWINDOW;(2)设置像素格式描述符: PIXELFORMATDESCRIPTOR pfd;(3)定义窗口大小:RECT windowRect = 0, 0, window-init.width, window-init.height;(4)保存像素格式:GLuint PixelFormat;(5)开始创建 OpenGL 窗口,取得程序类名,传入应用程序实例:window-hWnd = CreateWindowEx(windo

11、wExtendedStyle,/ 窗口扩展样式window-init.application-className,/ 应用程序类名window-init.title,/ 窗口标题windowStyle,/ 窗口样式0, 0,/ 窗口的XY坐标位置windowRect.right - windowRect.left,/ 窗口宽度windowRect.bottom - windowRect.top,/ 窗口高度HWND_DESKTOP,/ 父窗口为桌面0,/ 无菜单window-init.application-hInstance,/ 传入应用程序实例window);(6)如果创建失败,返回失败消

12、息;/以下代码略 (7)如果未得到设备描述符,销毁窗口,句柄清零,返回失败消息;(8)如果选择兼容的像素格式失败,释放设备描述符,设备描述符清零,销毁窗口,句柄清零,返回失败消息;(9)如果未获得绘制描述表,释放设备描述表,设备描述表清零,销毁窗口,句柄清零,返回失败消息;(10)显示窗口,清空键盘缓冲区。2.1.3 初始化OpenGL Initialize(GL_Window* window, Keys* keys)(1)设置全局变量;(2)建立时钟(3)初始化绘制场景清屏:glClearColor(0.0f, 0.0f, 0.0f, 0.5f); / 清屏为黑色设置深度缓存:glClear

13、Depth(1.0f);深度测试:glDepthFunc(GL_LEQUAL);/ 选择深度测试方式glEnable(GL_DEPTH_TEST);/ 开启深度测试阴暗处理:glShadeModel(GL_SMOOTH);/ 阴暗处理采用平滑方式透视计算:glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ 最精细的透视计算2D纹理:LoadTextureGL()/ 载入纹理glEnable(GL_TEXTURE_2D);/ 开启D纹理映射设置环境光:glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);

14、设置漫反射光:glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);建立一个曲面对象指针:quadric = gluNewQuadric();建立纹理坐标:gluQuadricTexture(quadric, GLU_TRUE);用面填充:gluQuadricDrawStyle(quadric, GLU_FILL);打开光照:glEnable(GL_LIGHTING);开光源1:glEnable(GL_LIGHT1);设置雾的各种参数:glFogi(GL_FOG_MODE, GL_LINEAR);/ 雾的类型glFogfv(GL_FOG_COLOR, f

15、ogColor); / 雾的颜色glFogf(GL_FOG_DENSITY, 0.6f); / 雾的浓度glHint(GL_FOG_HINT, GL_DONT_CARE); / 雾的渲染方式glFogf(GL_FOG_START, 1.0f); / 雾的开始深度glFogf(GL_FOG_END, 30.0f); / 雾的终止深度glEnable(GL_FOG); / 启用雾用于显示提示文字:BuildFontGL();2.1.4 处理事件WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)(1)取得窗口信息:GL_Win

16、dow* window = (GL_Window*)(GetWindowLong(hWnd, GWL_USERDATA);(2)取得Window的消息并做相应处理:switch (uMsg)/ 取得Window的消息case default:break;return DefWindowProc(hWnd, uMsg, wParam, lParam);/ 将本程序不处理的消息传给DefWindowProc (3)截取系统命令:case WM_SYSCOMMAND:(4)创建窗口:case WM_CREATE:(5)TIMER事件:case WM_TIMER:(6)PAINT消息处理,在此处绘图:

17、case WM_PAINT:(7)关闭窗口:case WM_CLOSE:(8)窗口大小变化:case WM_SIZE:(9)按键按下时更新键盘缓冲:case WM_KEYDOWN:(10)按键松开时更新键盘缓冲:case WM_KEYUP:(11)开关全屏模式:case WM_TOGGLEFULLSCREEN:(12)将本程序不处理的消息传给 DefWindowProc(hWnd, uMsg, wParam, lParam);2.1.5 扫尾处理 Deinitialize(void)(1)释放时钟KillTimer(OGL_window-hWnd, TIMER1);(2)删除字体KillFon

18、tGL();2.1.6 销毁窗口,注销窗口类 DestroyWindowGL(&window);/ 销毁窗口UnregisterClass(application.className, application.hInstance);/ 注销窗口类2.2 关键算法2.2.1 绘制模型 DrawSceneGL(void)void DrawSceneGL(void)/ 绘制场景glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除颜色和深度缓存glLoadIdentity();/ 重置当前矩阵/ 设置观察视点rad =(float)(PI*s_

19、angle / 180.0f);centerx = (float)(eyex + 100*cos(rad); centerz = (float)(eyez + 100*sin(rad);gluLookAt(eyex, eyey, eyez,centerx, centery, centerz,upx, upy, upz);/ 在此处添加代码进行绘制:/ 在屏幕上显示字体glPushMatrix();glTranslatef(-2.0, 0.0, -4.0);/ 移入屏幕.0fglDisable(GL_LIGHTING);/ 禁用光照glDisable(GL_TEXTURE_2D);/ 禁用纹理g

20、lColor3f(1.0f, 1.0f, 1.0f);glRasterPos2f(0.7f, 1.7f); glPrint(3D Earth And Moon Model-Press Up/Down/Left/Right Button to move the graph);glColor3f(1.0f, 1.0f, 1.0f);glRasterPos2f(0.7f, 1.5f);glPrint(space - speed up);glRasterPos2f(0.7f, 1.3f);glPrint(Delete - Backward shifting);glColor3f(1.0f, 1.0f,

21、 1.0f);glRasterPos2f(0.7f, 1.1f); glPrint(3D Earth And Moon Model-Press F1 button to toggle Full Screen, Esc to exit);glEnable(GL_LIGHTING);/ 启用光照glEnable(GL_TEXTURE_2D);/ 启用纹理glPopMatrix();glTranslatef(0.0f, 0.0f, -5.0f);/ 将坐标系移入屏幕.0fglRotatef(10, 1.0f ,0.0f, 0.0f);/ 将坐标系绕x轴旋转度glEnable(GL_LIGHT0);/

22、 打开光源/*绘制星空背景*/glPushMatrix ();/ 当前模型矩阵入栈glTranslatef(-10.0f, 3.0f, 0.0f);glRotatef (angle_Z, 0.0f, 0.0f, 1.0f);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture1);/ 绑定星空纹理glBegin(GL_QUADS); glNormal3f( 0.0f, 0.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-20.0f, -20.0f, -5.0f);glTexCoo

23、rd2f(6.0f, 0.0f); glVertex3f( 20.0f, -20.0f, -5.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f( 20.0f, 20.0f, -5.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f(-20.0f, 20.0f, -5.0f); glEnd();glPopMatrix ();/ 当前模型矩阵出栈/*绘制太阳*/glBindTexture(GL_TEXTURE_2D, texture2);/ 绑定纹理glEnable(GL_BLEND);/ 开启混合glDisable(GL_DEPTH

24、_TEST);/ 关闭深度测试/绘制太阳光晕glDisable(GL_LIGHTING);/ 关闭光照glBlendFunc(GL_SRC_ALPHA,GL_ONE);/ 基于源象素alpha通道值的半透明混合函数glColor4f(1.0f, 1.0f, 1.0f, 0.4f);/ 设置RGBA值glBegin(GL_QUADS);glNormal3f( 0.0f, 0.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.

25、0f, 0.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);glEnd();glDisable(GL_BLEND);/ 关闭混合glEnable(GL_DEPTH_TEST);glDisable(GL_TEXTURE_2D);/ 关闭纹理glEnable(GL_LIGHTING);/ 开启光照glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);/ 设置光源的当前位置g

26、luSphere(quadric, 0.3f, 32, 32);/ 绘制太阳球体/*绘制地球*/glDisable(GL_LIGHT0);glRotatef(ep_Angle, 0.0f, 1.0f, 0.0f);/ 将坐标系绕Y轴旋转ep_Angle角度 控制地球公转glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);/ 将坐标系绕X轴旋转-90度glEnable(GL_TEXTURE_2D );/ 开启纹理glTranslatef(2.0f, 0.0f, 0.0f);/ 将坐标系右移.0fglBindTexture(GL_TEXTURE_2D, texture0);/

27、绑定纹理glPushMatrix ();/ 当前模型视图矩阵入栈glRotatef(es_Angle, 0.0f, 0.0f, 1.0f);/ 将坐标系绕Z轴旋转es_Angle角度 控制地球自转gluSphere(quadric, 0.2f, 32, 32);/ 地球球体glPopMatrix ();/ 当前模型视图矩阵出栈/*绘制月亮*/glRotatef(mp_Angle, 0.0f, 0.0f, 1.0f);/ 将坐标系绕Z轴旋转mp_Angle角度控制月亮公转glBindTexture(GL_TEXTURE_2D, texture3);/ 绑定纹理glTranslatef(0.5f,

28、 0.0f, 0.0f);/ 右移.5fglRotatef(ms_Angle, 0.0f, 0.0f, 1.0f);/ 将坐标系绕Z轴旋转ms_Angle角度控制月亮自转gluSphere(quadric, 0.05, 32, 32);/ 绘制月亮星体/ 变量更新控制模型活动ep_Angle += ep_velocity;es_Angle += es_velocity;mp_Angle += mp_velocity;ms_Angle += ms_velocity;angle_Z += 0.1f;glFlush();/ 刷新GL命令队列;2.2.2 切换视角 Update(void)/ gluL

29、ookAt函数参数GLfloat eyex = 1.0f;GLfloat eyey = 0.0f;GLfloat eyez = 1.0f;GLfloat centerx = 0.0f;GLfloat centery = 0.0f;GLfloat centerz = 0.0f; GLfloat s_angle = -90.0f; float PI = 3.14159f;float speed = 1.0f;/ 旋转请求if (OGL_keys-keyDownVK_UP = TRUE) / 判断UP是否按下rad =(float)(PI * s_angle / 180.0f);eyex += (f

30、loat)cos(rad) * speed;eyez += (float)sin(rad) * speed;if (OGL_keys-keyDownVK_DOWN = TRUE) / 判断DOWN是否按下rad =(float)(PI * s_angle / 180.0f); eyex -= (float)cos(rad) * speed;eyez -= (float)sin(rad) * speed;if (OGL_keys-keyDownVK_LEFT = TRUE) / 判断LEFT是否按下s_angle -= 2.0; if (OGL_keys-keyDownVK_RIGHT = TR

31、UE) / 判断RIGHT是否按下s_angle += 2.0; / 设置观察视点rad =(float)(PI*s_angle / 180.0f);centerx = (float)(eyex + 100*cos(rad); centerz = (float)(eyez + 100*sin(rad);gluLookAt(eyex, eyey, eyez,centerx, centery, centerz,upx, upy, upz); 2.2.3 控制加减速if (OGL_keys-keyDownVK_DELETE = TRUE) / 判断DELETE是否按下/减速ep_Angle -= 0

32、.2f;es_Angle -= 6.0f; mp_Angle -= 2.4f;ms_Angle -= 0.2f;if (OGL_keys-keyDownVK_SPACE = TRUE) / 判断SPACE是否按下/加速ep_Angle += 0.2f;es_Angle += 6.0f; mp_Angle += 2.4f; ms_Angle += 0.2f; 2.2.4 开启/关闭全屏if (OGL_keys-keyDownVK_F1 = TRUE)/ 判断F1是否按下PostMessage(OGL_window-hWnd, WM_TOGGLEFULLSCREEN, 0, 0);/ 在全屏/窗口

33、模式间切换三、使用方法3.1 打开程序 双击“Earth and Moon.exe”,即打开程序窗口:图2 程序窗口3.2 程序相关操作如程序窗口中的文字提示:3D Earth And Moon Model-Press Up/Down/Left/Right Button to move the graphspace - speed upDelete - Backward shifting3D Earth And Moon Model-Press F1 button to toggle Full Screen, Esc to exit按提示可以进行相关的操作,有效的按键包括上下左右方向键,Esc、空格、delete以及F1按键,通过按下相应的按键可以完成对应的操作。如图所示是程序运行的某个状态:3.3 开启/关闭全屏显示 按F1键开启/关闭全屏显示。3.4 退出程序 按ESC键退出程序。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!