基于opengl的三维飞行器程序设计与仿真_毕业论文(编辑修改稿)内容摘要:

用这种方法的初衷主要是想尽可能的展示 OpenGL的一些基本功能 程序的主要功能 该程序主要是基于 OpenGL,实现对飞行器飞行过程的仿真,模拟现实过程中飞机飞行的场景以及对飞机进行 具体的操作和控制。 本论文研究重点 本文研究的重点主要是利用 OpenGL模拟现实中飞机的飞行场景以及对飞机进行操作和控制,重点是各种变换的体实现以及场景的绘制过程,还有飞机飞行过程中的一些列控制,主要是各种相关数据的获取,因此,本论文实际上是一系列数据的操作过程。 基于 OpenGL三维飞行器程序设计与仿真 3. 程序涉及知识详解 基本框架 构建应用程序框架 应用 Visual C++ 建立一个基于 MFC 的应用程序框架 , 并将 VC 库文件、 和。 同时还要修改工程 中的相关参数 ,即将 _CONLOLE改为 _WINDOWS,在 link项,在对象、模块栏的前面加上 OpenGL 函数库的调用有效。 接下来应设置渲染窗口。 OpenGL 的渲染处理完全不同于 Windows 的图形设备接口 GDI。 要使 Windows 的窗口格式为 OpenGL 所接受 ,需进行下面的其他设置。 建立图形操作描述表 OpenGL 作图窗口必 须设置为 WM_CLIPSIBLINGS 和 WM_CLIPCHILDREN 风格。 在 Windows98/2020 系统下 , 窗口程序首先要处理设备描述表 (Device Contexts, DC), 它包括若干在窗口上如何显示图形的信息。 而在 OpenGL 程序中 , 必须创建图形操作描述表 ,这是 DC 中专用于 OpenGL的一种。 但是 RC 不同于其他的 DC, 它只需要一个句柄就可以任意调用 OpenGL 函数 , 而其他 DC 调用每个 GDI 函数时都需要一个句柄。 使用时先通过 wglCreateContext ( ) 函数创建一个 RC,然后调用 wglMakeCurrent ( ) 函数启动它 , 就可在所定义的窗口内调用 OpenGL 函数绘制飞行器了。 设置像素格式 像素格式是对 Win32 API的另一种扩展,它指定了设备的绘图属性 , 包括绘图界面的颜色表示模式、颜色位数、累积缓存区、深度缓存区和模板缓存区的位数。 每个 OpenGL 显示设备都支持某一特定的像素格式。 在绘制创建环境之前,像素格式必须被设置和创建。 像素格式用 PIXELFORMATDESCRIPTOR 结构来表示 , 通过设置这一结构的成员值使 之支持 OpenGL。 建立了图形操作描述表并初始化 PIXELFORMATDESCRIPTOR结构后 ,下一步就是将此结构传递给 ChoosePixelFormat( )函数,此函数会为设备描述表选择像素格式 , 最后调用 SetPixelFormat( )将其设置为当前像素格式。 坐标变换 变换允许我们移动,旋转和操作 3D世界中的实体。 在介绍其他坐标变换之前,先说OpenGL中两个基本的变换,这两个变换在其他变换中起着重要的作用,是其他的变换的基础。 为了进行变换,基本就是用变换矩阵乘以想要变换的点,得到的结果 就是变换过的新的点,比如有一个点 P和变换矩阵 M,那么为了用变换矩阵 M来变换点 P,从而得到结西安科技大学毕业论文 11 果点 P’,应该像下面这样做 : PMP *39。  (31) 为了进行变换,我们要使用在线性代数中被称为的齐次坐标。 首先说 OpenGL中的平移:要对一个点进行平移变换,只需要将每个坐标轴的增量值加上要平移的点的原始坐标就行了。 也就是一些列点和矩阵相乘的操作:例如: 有个平移矩阵 : )23(1000100010001zyxM 如果要用这个矩阵平移一个点,只要用这个矩阵乘以这个点的矢量矩阵,就像下面这样: )33(1zyxP )43(11*1000000010001* zZyYxXZYXzyxPM 在本文中,飞机在没有任何操作的情况下一直沿 z轴 飞行,这个操作过程调用的是OpenGL中的 gltranslate()函数,它的内部就封装了上述的处理过程,对飞机模型说出的位置进行上述变换,使得飞机一直向前飞行; 接下来说旋转变换: 旋转变换主要运用了三角学,而且关于每个坐标轴的旋转都有相应的不同的变换矩阵: 基于 OpenGL三维飞行器程序设计与仿真 关于 x坐标轴的旋转变换矩阵定义如下: )53(10000c o ss in00s inc o s00001X 在关于 x轴旋转过程中,其 x轴保持不变 ,关于 y轴的选装也是同样的道理,要保持 y轴的坐标值不变,其变换矩阵如下所示: )63(10000c o ss in000100s in0c o sY 同样,关于 z轴的旋转,保持 z轴值不变: )73(1000010000c o ss i n00s i nc o sZ 如果要让一个点绕某一坐标轴旋转,就用此坐标轴的旋转乘以这个点,例如,讲一个点绕 z轴旋转,就像下面这样: 西安科技大学毕业论文 13 )83(1ZYXP 然后用这个点去和 Z轴的变换矩阵相乘,即得到这一点旋转后的结果: )93(11c o s*s i n*s i n*c o s**1000010000c o ss i n00s i nc o s* YXYXWZYXPZ 在飞机左右旋转或者滚降的 过程中,飞机所在位置都是围绕 Y轴或者 X轴在旋转,虽然可以直接调用 OpenGL中的 glrotate()函数,但这个函数内部的计算过程全部类似于上面的处理过程。 定义了顶点以后,但在屏幕上显示他们之前一共会发生 3中类型的变换:视图变换,模型变换和投影变换。 其中一些关键名词的意思如下: 视图:指定观察者或照相机的位置; 模型:在场景中移动物体; 模型视图:描述视图和模型变换的对偶性; 投影:改变可视区域的大小或者重新设置它的形状; 视口:这是一种伪变换,只是对窗口上的最终输出进行缩放; 视觉坐标是进行变换 的一个非常重要的概念,它是根据观察者的角度而言的,与可能发生的变换无关,我们可以把它看成是“绝对的”屏幕坐标。 因此,视觉坐标表示一种固定的坐标系统。 视图变换 视图变换是场景所应用的第一个变换。 它用于确定场景的拍摄点。 在默认情况下,在透视投影中,观察者是从原点向 Z轴的负方向望去。 这个观察点系相对于视觉坐标系统进行移动,以提供一个特定的拍摄点。 当观察点位于原点时,场景中所绘制的 Z值为正的物体就位于观察者的后面。 视图变换允许把观察点放在自己所希望的任何位置,并允许在任何方向上观察场景。 确定视 图变换就像是在场景中放置照相机病让他指向某个方向。 作为总体原则,在进行任何变换之前必须先指定视图变换。 原因是视图变换的效果相当于根据视觉坐标系统移动当前所使用的坐标系统。 然后,根据最新修改的坐标系统进行其他所有的后续变换。 从本质上说,它只是在绘制物体之前应用到一个虚拟物体之上的一种模型变换。 基于 OpenGL三维飞行器程序设计与仿真 模型变换 模型变换用于对模型以及模型内部的特定物体进行操纵。 它可以移动物体,对它们进行旋转,或者对它们进行缩放。 场景或者物体的最终外观很大程度上取决于模型变换的应用顺序。 对于移动和旋转,情况更是如此。 投影变换 投影变换是在模型视图变换之后应用到物体的顶点之上的。 这种投影世纪定义了可视区域,并建立裁剪平面。 裁剪平面是 3D空间的平面方程式, OpenGL用它来确定几何图形能否被观察者所看到。 更为具体的说,投影变换制订了一个完成的场景(在所有的模型变换都已经完成之后)投影到屏幕上的最终图像,它主要包括正投影以及透视投影, 在本文中主要利用透视投影。 在正投影中,屏幕上所绘制的所有多边形都按照指定的相对大小出现。 直线和多边形使用平行线直接映射到 2D屏幕上。 这意味着不管物体有多远,都仍然 按照相同的大小进行绘制,平面的出现屏幕上。 这种类型的头型通常用于渲染二维图像和二维图形。 透视投影所显示的场景更接近真实,他的标志性特点就是透视缩短,他会使远处的物体看上去比相同大小的近处物体更小一些。 3D空间中平行的直线在观察者眼里并不总是平行的。 透视投影的优点是不必判断直线将在什么地方交汇,也不必操心远处的物体是如何变小的。 我们所需要做的就是用模型视图变换指定场景,然后应用透视视图。 视区变换 视口变换:当上面的操作全部完成以后,最后所获得的是场景的而为投影,将被投影到屏幕上的某个窗口。 这种到窗口坐标的映射是最后一个完成的变换,成为视口变换。 通常,颜色缓冲区和窗口像素之间存在着一对一的对应关系。 纹理映射 纹理 究其本质,纹理就是有些图案,其范围可能包括了从条纹和简单的形状到自然图案,可以是程序员自己生成的,也可以是现成的图片。 也可以说,纹理就是一个函数 textture(s,t),对于 s和 t在 0到 1之间的取值产生一个颜色或者亮度值。 在本文的仿真中,纹理图案使用的是现成的图片。 纹理可以是 2D, 3D, 4D纹理等,但我们文中使用的是 2D纹理,它通常是从图像或者图片文 件中载入的,文中使用的是从一幅 256*256的现成图片中载入纹理数据,它是在程序运行是才生成纹理。 当我们将一个纹理映射应用到表面时,需要一种方式来定义其纹理在表面的方向,为此,我们使用所谓的参数坐标,其定义为( s,t)对于常规的纹理映射来说, s,t的值处于数值 0到 1之间,就是( 0, 1)。 对于所要进行纹理映射的表面,其上的坐标的最大值和最小值决定了纹理映射的范围,改变这些值就可以产生各种不同的纹理映射效果。 西安科技大学毕业论文 15 纹理数据 纹理数据在本次仿真设计中占有很重要的位置,纹理数据包括图像的数 据以及纹理如何应用到具体的模型上去,这就涉及一个纹理坐标的问题。 草地,天空,飞行器都使用纹理贴图来增加图形的真实感。 纹理数据主要指的是图像载入内存时生成的数据,它存储在一个数组中,数组的专业名字称为纹理对象,其中,图像的数据主要通过以下程序段载入内存而获得的: AUX_RGBImageRec *Texture::LoadBMP(const char *Filename) // Loads A Bitmap Image { FILE *File=NULL。 File Handle if (!Filename) //Make Sure A Filename Was Given { return NULL。 // If Not Return NULL } File=fopen(Filename,r)。 // Check To See If The File Exists if (File) Does The File Exist? { fclose(File)。 // Close The Handle return auxDIBImageLoad(Filename)。 // Load The Bitmap And Return A Pointer } return NULL。 //。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。