(强烈推荐)基于OpenGL的三维飞行器程序设计与仿真 - 毕业论文设计

发布时间:2017-08-29 15:39:14   来源:文档文库   
字号:

论文题目:基于OpenGL的三维飞行器程序设计与仿真

本文基于OpenGL,应用Visual C++ 6.0 平台,用C++编程对飞行器的飞行场景进行了设计与仿真.这样做的目的是由于在实际操纵中,使用真实的飞机来训练新操作手的风险和代价是很高的,所以,在实验室中使用模拟训练器来训练是国内外通常采用的有效方法。文章使用纹理贴图的方法实现了对天空和地面的模拟,用多边形组成了飞机,使用键盘来实现对飞机的操作,同时添加了雾以及光照来增加场景的真实感。程序的运行结果比较符合预期要求,对实际操纵有一定的借鉴意义。最后还针对实际制作过程中提出了一些建议以及改进的方法。

【关键字】OpenGL C++;飞行器;纹理贴图;仿真

【论文类型】设计性



TitleAircraft program design and simulation based an OpenGL

Major

Name Signature:

Supervisor Signature:

Abstract

The paper uses C + + programming design and simulate the scene of aircraft flight based on the OpenGL and apply Visual C + + 6.0 platform.Thanks to using the real aircraft to train new operators ,the risks and costs are in the actual manipulation, so at the laboratory .The article uses texture mapping method to achieve a simulation of the sky and the ground, aircraft polygons and use the keyboard to the operation of the aircraft, at the same time ,adding the fog and light to increase the realism of the scene.The results of the program is in line with the expectations, further more ,it the actual manipulation .Finally, for the actual process of making a number of recommendations as well as improved methods.

Key words OpenGL; C++; aircraft; texture mapping; simulate

Type of ThesisThe design model

1. 绪论 5

1.1 前言 5

1.2 飞行器仿真技术国内外研究现状 6

1.3 本文研究的目的及主要内容 6

2. 程序功能概述 7

2.1 场景的构建及其特点 8

2.1.1 场景的构建 8

2.1.2 与以往实现方法的区别 8

2.2 程序的主要功能 9

2.3 本论文研究重点 9

3. 程序涉及知识详解 10

3.1 基本框架 10

3.1.1 构建应用程序框架 10

3.2 坐标变换 10

3.2.1 视图变换 13

3.2.2 模型变换 14

3.2.3 投影变换 14

3.3 纹理映射 14

3.3.1 纹理 14

3.3.2 纹理数据 15

3.4 漫游的原理 16

3.5 显示列表 17

3.6 屏幕显示 18

4.场景的构建 19

4.1天空的构建 19

4.2 地面 21

4.2.1 地面的生成 21

4.2.2 地面中的水 25

4.3 飞行器 26

4.3.1 飞行器的构建 26

4.3.2 材质属性的设置 28

4.3.3 飞行器漫游 28

4.3.4 飞行器的控制 30

4.3.5 飞行器的尾焰 33

4.4 场景中的光照 34

4.4.1 光照的属性 34

4.4.2 光照的模型 35

4.5 场景中的雾 37

4.5.1 雾的属性 37

4.5.2 雾的生成 38

4.6 本系统建模流程 38

4.7 建模细节及其改进 40

5.总结与展望 43

44

参考文献 45

1. 绪论

1.1 前言

科学计算可视化是2 0 世纪80 年代后期随着计算机图形学应用的拓广而发展起来的一个新的研究分支, 受其推动, 各种信息的可视化成为90 年代许多学科领域的研究前缘。三维可视化是指以适当的数据结构建立地下特征的数学模型,采用计算机图形技术将数学描述以3D 真实感图像的形式予以表现。三维可视化技术对于地下构造研究十分重要, 三维可视化模型能够形象地表达地下构造的“ 真实” 形态特征以及构造要素的空间关系, 结合三维信息处理和空间分析功能可以使地下构造分析更为直观、准确, 为地下构造三维可视化研究开拓了一条现实的途径。怎样把海底地貌地形通过计算机形象地、直观地显示出来, 实现飞行器场景的逼真显现, 就是本系统的研究目的。

目前, OpenGL 在虚拟现实领域是功能较强, 最具发展前途的实现工具。OpenGL 是美国高级图形和高性能计算机系统公司( SGI) 所开发的三维图形库, 在当前已经成为事实上的高性能图形和交互式视景处理的标准[2]OpenGL是一个独立的工作平台, 用它编写的程序可以在不同的硬件平台(如工作站或个人微机)中使用, 也可以在多种操作系统(Windows 系列、OS2 )下运行。经过近几年来的发展, 虚拟现实技术及设备被很多领域应用, 而飞行仿真是最重要的应用领域之一。

Open-GLSGI公司开发的与硬件环境和操作系统独立的API,它提供了建模、坐标变换、着色、光照、平滑等二维和三维图形功能以及纹理映射、曲线等高级功能,并且能够生成三维场景,绘制三维物体Open-GL良好的交互性和代码运行的高效性使它已经成为三维动画和虚拟现实场景开发的重要工具。OpenGL的根本目的是为硬件加速的3D绘制而设计的,为程序员提供了一个图形硬件接口。同时一个功能强大的,支持底层绘制和造型能力的软件图形函数库,适用于所有的主流操作系统平台,有着广泛的硬件支持。是为游戏,造型以及CAD之类的图形应用程序而设计的。它有意识的只提供底层的绘制程序功能,这就使得程序员有了更多的控制权和灵活性。而使用这些程序可以很容易的创建高层的绘制和造型函数库。

OpenGL是几百个能够访问图形硬件所有性能的函数的集合。在其内部,它是以状态机的形式运行的,就是一些状态的集合,而这些状态决定了OpenGL如何运行。通过应用程序编程接口,可以设置状态机的各个状态,例如当前的颜色,光照以及混合模式等状态。在绘制时,状态机的当前设置决定了每一个将被显示的对象如何被绘制。准确的掌握各种状态机的含义以及他们所产生的效果是很重要的,因为一个或者多个不正确的状态设置,就会导致意想不到的结果。

Windows操作系统中,OpenGL可以完全替代图形设备接口,图形设计接口的设计使得对于Windows程序员来说图形硬件是完全不可见的,它提供了抽象层从而避免了程序员处理与硬件相关的问题。但是图形设备接口是为一般的应用程序而提供的,因此不能满足游戏所必须的速度要求。OpenGL允许完全绕过GDI直接和图形硬件打交道。

OpenGL实用库(GLU)OpenGL的补充,它提供了更高一层的函数,GLU的功能广泛,既有OpenGL函数的简单封装,也有能支持高级的绘制技术的复杂组件。OpenGL 提供了功能强大的图元绘制命令, 所有高级的目标绘制都通过这些命令来实现, 它共包括100 多个功能强大的图形函数, 分属于三个基本的图形库: 基础核心库( g l-) 、应用程序库( Glu-) 和编程辅助库( AUX-) 。在Visual C+ + 编程环境下, 能方便地调用这些函数对三维图形进行仿真。

1.2 飞行器仿真技术国内外研究现状

飞行器仿真是可视化仿真技术的一个重要分支,是航空航天技术的重要研究课题,飞行器仿真在飞行器设计、性能分析、飞行员训练、战法分析以及国防建设中起着十分重要的作用,在当今国内外的研究中占据着重要地位。对国内来说,可视化仿真尤其是飞行器仿真起步较晚,不过也处于发展之中,在航空航天领域的可视化仿真工作,基本上还是处于使用国外的可视化仿真工具来开发应用程序的阶段,没有达到一个相对成熟的阶段,还没有专用的可视化仿真工具,这使得可视化仿真工作始终落后于国外,因此很有必要认真吸收国外的先进研究成果,尽可能的掌握相关的先进软件,在此基础上进行创新研究,尽量缩短差距,推动国内可视化仿真技术的创新和长足发展。

1.3 本文研究的目的及主要内容

由于计算机软硬技术水平的限制,科学计算在早起只能以批处理方式实现,而不能进行交互处理,对于大量的输出数据,只能人工方式处理,或者用绘图工具输出二维图形,这种处理方式不仅效率低下,而且丢失大量的信息。近年来,随着计算机的普及和科学技术的迅速发展,天气,卫星以及地震勘测领域中的数据量越来越大,可视化技术就成为科学研究中必不可少的手段。

在航空航天领域,可视化与仿真技术的结合——飞行器可视化仿真的技术应用越来越广泛,作用越来越突出。在航天任务选择阶段,研究人员需要进行大量的轨道计算,而在航天发射和航天任务的执行过程中,需要对航天工具以及航天器进行导航,定位,上述工作中,都会产生大量的有关飞行状态的数据,将这些抽象的数据在屏幕上表现出来,对航天任务的分析和论证,以及发射和运行方案的选择,都是极其重要的。

可视化仿真的研究意义主要有以下几点:

大大加快飞行数据的处理速度,使通过仿真计算或测量得到的庞大数据得到有效的利用,实现人和人与机之间的图像通讯,而不是目前的图像和数据通讯,从而使系统工作人员观察到传统方法难以观察到的包含在飞行数据中的现象和规律使系统人员不仅能得到计算结果,而且知道在计算过程中发生了什么情况,并可主动改变参数,观察其影响,对计算结果进行引导和控制,进而对运行和控制方案进行选择

本文的主要研究内容在于飞行器的空间运动轨迹建模以及在三维可视化环境下实时模拟其运动的姿态和轨迹,通过调用初始参数库中的各飞行参数,利用模型算法库的优化算法,经过轨迹方程计算得到每一时刻轨迹上各点的坐标和飞行姿态参数,将其存入仿真数据结果库; 然后再调用仿真数据结果库的数据对模型进行实时绘制,驱动飞行器在空地作战环境运动; 最后利用粒子系统对飞行器产生的特殊效果,如火焰等进行逼真显示。为了使运动轨迹可视化更加逼真,本文首先利用DEM 数据构建地形模型,绑定上地形纹理数据后,便生成基础的三维战场环境; 然后在场景中加入了天空纹理,构建了简单的天空环境,同时使用雾化、光照等效果使空地作战环境产生真实感,最后将制作飞行器,该飞行器是由基本的图形组合而成的,最后根据运动轨迹方程实时计算出飞机的飞行位置,对运动模型进行实时绘制。

2. 程序功能概述

这一章节主要介绍飞行器飞行的具体场景的构建以及在程序中它们是如何生成的,还有就是主要介绍程序各个部分的功能以及场景中与飞行器相关的其他模型的构建过程。

2.1 场景的构建及其特点

2.1.1 场景的构建

飞行器的场景主要指飞行器的飞行环境,主要包括天空,草地,光照,雾以及一些水的效果,天空的绘制主要是绘制一个半径比较大的球,而其余所有的场景和模型均置于球的内部, 这样在球的内部看, 球就类似于一个无穷大的天空。完成后经过纹理映射使场景看起来更加贴近现实。

地面的构建主要是采用绘制网格的方法,绘制一个巨大的三角形网格条带,在这里要注意纹理坐标中高度值得获得,然后在利用纹理贴图,在上面贴上草地,可以实现模拟真实的草地场景,最后通过随机赋予网状格高度来模拟高低起伏的地面,与此同时,在此地面上设置一个高度,设计为海平面,海平面实际为一个多边形,在上面贴上水面的纹理就可以模拟水面的场景。光照和雾可以调用OpenGL中的相关函数进行设计。

2.1.2 与以往实现方法的区别

1)天空

目前对于天空的仿真还存在很多不足,一些模拟方法中存在实现复杂、计算耗时、图像分辨力不高,,真实感不强等问题,在传统的3D游戏中,对于天空的仿真,程序员往往从实时简单的角度出发,采用非常简化的天空模型,通常包括以下3种方法:1)用一种接近天空的淡蓝色来清除背景;2)采用天空盒(skyBox)的方法:即首先绘制一个多边形,然后进行立方体纹理贴图;3)八棱锥天空模型:定义一个天顶,以这个顶点为中心绘制一圈三角形扇,然后进行纹理映射。

3种方法都具备了实时性,方法简单的优点,但同时也存在明显的不足,第一种方法绘制的天空效果看起来太平面化,简单粗糙,逼近度不高。第二种方法对纹理的要求非常高,如果纹理使用得不好,在一个比较大的多边形上的纹理就容易产生拉伸变形的副作用。此外,雾化设置也会产生问题,如果雾的设置靠近观察点,则天空的颜色会变淡甚至没有。第三种方法有明显的天顶。

本文在研究了前人仿真天空算法的基础上,提出了一种更加简单实用的仿真3D天空的方法,地球是球型的,所以天空像半个球一样笼罩在大地之上。在用计算机仿真3D天空时,半球型天空模型显然符合真实世界的天空模型,由于球形方法绘制的天空具有更多的顶点,雾化效果可以绘制得更加均匀,同时也可以实时改变单个顶点的颜色,这样可以获得一些非常好的效果。

2 飞行器

该程序的实现过程中,飞机的构成不是使用当下3D游戏中流行的使用建好后的3DMAX 模型载入到内存中,进而重新绘制飞机模型,而是由一些基本的三角形进行组合而成的,这种方法可能没有利用直接载入3DMAX模型的方法产生的效果好,但这里主要想利用OpenGL绘图中经常使用的一个东西,即就是显示列表,主要就是想尽可能的从OpenGL角度出发来完成本次设计。

3 地面

在场景仿真中,地面也有许多种方法来进行绘制,应用最多的就是网格法,本文的地面没有采用大多数使用的高程地形来进行绘制,而是利用了三角形条带的方法,利用这种方法的初衷主要是想尽可能的展示OpenGL的一些基本功能

2.2 程序的主要功能

该程序主要是基于OpenGL,实现对飞行器飞行过程的仿真,模拟现实过程中飞机飞行的场景以及对飞机进行具体的操作和控制

2.3 本论文研究重点

本文研究的重点主要是利用OpenGL模拟现实中飞机的飞行场景以及对飞机进行操作和控制,重点是各种变换的体实现以及场景的绘制过程,还有飞机飞行过程中的一些列控制,主要是各种相关数据的获取,因此,本论文实际上是一系列数据的操作过程。

3. 程序涉及知识详解

3.1 基本框架

3.1.1 构建应用程序框架

应用Visual C++ 6.0 建立一个基于MFC 的应用程序框架, 并将VC 库文件opengl32.libglu32.lib glaux.lib包含在应用程序中。同时还要修改工程中的相关参数,即将_CONLOLE改为_WINDOWS,link项,在对象、模块栏的前面加上opengl32.lib Glut32.lib Glaux.lib glu32.lib为使OpenGL 函数库的调用有效。接下来应设置渲染窗口。OpenGL 的渲染处理完全不同于Windows 的图形设备接口GDI。要使Windows 的窗口格式为OpenGL 所接受,需进行下面的其他设置。

3.1.2 建立图形操作描述表

Open-GL 作图窗口必须设置为WM_CLIPSIBLINGS WM_CLIPCHILDREN 风格。Windows982000 系统下, 窗口程序首先要处理设备描述表(Device Contexts, DC), 它包括若干在窗口上如何显示图形的信息。而在OpenGL 程序中, 必须创建图形操作描述表 ,这是DC 中专用于OpenGL的一种。但是RC 不同于其他的DC, 它只需要一个句柄就可以任意调用OpenGL 函数, 而其他DC 调用每个GDI 函数时都需要一个句柄。使用时先通过wglCreateContext ( ) 函数创建一个RC,然后调用wglMakeCurrent ( ) 函数启动它, 就可在所定义的窗口内调用OpenGL 函数绘制飞行器了。

3.1.3 设置像素格式

像素格式是对Win32 API的另一种扩展,它指定了设备的绘图属性, 包括绘图界面的颜色表示模式、颜色位数、累积缓存区、深度缓存区和模板缓存区的位数。每个OpenGL 显示设备都支持某一特定的像素格式。在绘制创建环境之前,像素格式必须被设置和创建。像素格式用PIXELFORMATDESCRIPTOR 结构来表示, 通过设置这一结构的成员值使之支持OpenGL。建立了图形操作描述表并初始化PIXELFORMATDESCRIPTOR结构后,下一步就是将此结构传递给ChoosePixelFormat( )函数,此函数会为设备描述表选择像素格式, 最后调用SetPixelFormat( )将其设置为当前像素格式。

3.2 坐标变换

变换允许我们移动,旋转和操作3D世界中的实体。在介绍其他坐标变换之前,先说OpenGL中两个基本的变换,这两个变换在其他变换中起着重要的作用,是其他的变换的基础。为了进行变换,基本就是用变换矩阵乘以想要变换的点,得到的结果就是变换过的新的点,比如有一个点P和变换矩阵M,那么为了用变换矩阵M来变换点P,从而得到结果点P’,应该像下面这样做:

(3-1)

为了进行变换,我们要使用在线性代数中被称为的齐次坐标。

首先说OpenGL中的平移:要对一个点进行平移变换,只需要将每个坐标轴的增量值加上要平移的点的原始坐标就行了。也就是一些列点和矩阵相乘的操作:例如:

有个平移矩阵:

如果要用这个矩阵平移一个点,只要用这个矩阵乘以这个点的矢量矩阵,就像下面这样:

在本文中,飞机在没有任何操作的情况下一直沿z轴飞行,这个操作过程调用的是OpenGL中的gltranslate()函数,它的内部就封装了上述的处理过程,对飞机模型说出的位置进行上述变换,使得飞机一直向前飞行;

接下来说旋转变换:

旋转变换主要运用了三角学,而且关于每个坐标轴的旋转都有相应的不同的变换矩阵:

关于x坐标轴的旋转变换矩阵定义如下:

在关于x轴旋转过程中,其x轴保持不变,关于y轴的选装也是同样的道理,要保持y轴的坐标值不变,其变换矩阵如下所示:

同样,关于z轴的旋转,保持z轴值不变:

如果要让一个点绕某一坐标轴旋转,就用此坐标轴的旋转乘以这个点,例如,讲一个点绕z轴旋转,就像下面这样:

然后用这个点去和Z轴的变换矩阵相乘,即得到这一点旋转后的结果:

在飞机左右旋转或者滚降的过程中,飞机所在位置都是围绕Y轴或者X轴在旋转,虽然可以直接调用OpenGL中的glrotate()函数,但这个函数内部的计算过程全部类似于上面的处理过程。

定义了顶点以后,但在屏幕上显示他们之前一共会发生3中类型的变换:视图变换,模型变换和投影变换。其中一些关键名词的意思如下:

视图:指定观察者或照相机的位置;

模型:在场景中移动物体;

模型视图:描述视图和模型变换的对偶性;

投影:改变可视区域的大小或者重新设置它的形状;

视口:这是一种伪变换,只是对窗口上的最终输出进行缩放;

视觉坐标是进行变换的一个非常重要的概念,它是根据观察者的角度而言的,与可能发生的变换无关,我们可以把它看成是“绝对的”屏幕坐标。因此,视觉坐标表示一种固定的坐标系统。

3.2.1 视图变换

视图变换是场景所应用的第一个变换。它用于确定场景的拍摄点。在默认情况下,在透视投影中,观察者是从原点向Z轴的负方向望去。这个观察点系相对于视觉坐标系统进行移动,以提供一个特定的拍摄点。当观察点位于原点时,场景中所绘制的Z值为正的物体就位于观察者的后面。视图变换允许把观察点放在自己所希望的任何位置,并允许在任何方向上观察场景。确定视图变换就像是在场景中放置照相机病让他指向某个方向。作为总体原则,在进行任何变换之前必须先指定视图变换。原因是视图变换的效果相当于根据视觉坐标系统移动当前所使用的坐标系统。然后,根据最新修改的坐标系统进行其他所有的后续变换。从本质上说,它只是在绘制物体之前应用到一个虚拟物体之上的一种模型变换。

3.2.2 模型变换

模型变换用于对模型以及模型内部的特定物体进行操纵。它可以移动物体,对它们进行旋转,或者对它们进行缩放。场景或者物体的最终外观很大程度上取决于模型变换的应用顺序。对于移动和旋转,情况更是如此。

3.2.3 投影变换

投影变换是在模型视图变换之后应用到物体的顶点之上的。这种投影世纪定义了可视区域,并建立裁剪平面。裁剪平面是3D空间的平面方程式,Open-GL用它来确定几何图形能否被观察者所看到。更为具体的说,投影变换制订了一个完成的场景(在所有的模型变换都已经完成之后)投影到屏幕上的最终图像,它主要包括正投影以及透视投影, 在本文中主要利用透视投影。在正投影中,屏幕上所绘制的所有多边形都按照指定的相对大小出现。直线和多边形使用平行线直接映射到2D屏幕上。这意味着不管物体有多远,都仍然按照相同的大小进行绘制,平面的出现屏幕上。这种类型的头型通常用于渲染二维图像和二维图形。透视投影所显示的场景更接近真实,他的标志性特点就是透视缩短,他会使远处的物体看上去比相同大小的近处物体更小一些。3D空间中平行的直线在观察者眼里并不总是平行的。透视投影的优点是不必判断直线将在什么地方交汇,也不必操心远处的物体是如何变小的。我们所需要做的就是用模型视图变换指定场景,然后应用透视视图。

3.2.4 视区变换

视口变换:当上面的操作全部完成以后,最后所获得的是场景的而为投影,将被投影到屏幕上的某个窗口。这种到窗口坐标的映射是最后一个完成的变换,成为视口变换。通常,颜色缓冲区和窗口像素之间存在着一对一的对应关系。

3.3 纹理映射

3.3.1 纹理

究其本质,纹理就是有些图案,其范围可能包括了从条纹和简单的形状到自然图案,可以是程序员自己生成的,也可以是现成的图片。也可以说,纹理就是一个函数textture(s,t),对于st01之间的取值产生一个颜色或者亮度值。在本文的仿真中,纹理图案使用的是现成的图片。纹理可以是2D3D4D纹理等,但我们文中使用的是2D纹理,它通常是从图像或者图片文件中载入的,文中使用的是从一幅256*256的现成图片中载入纹理数据,它是在程序运行是才生成纹理。

当我们将一个纹理映射应用到表面时,需要一种方式来定义其纹理在表面的方向,为此,我们使用所谓的参数坐标,其定义为(s,t)对于常规的纹理映射来说,s,t的值处于数值01之间,就是(01)。对于所要进行纹理映射的表面,其上的坐标的最大值和最小值决定了纹理映射的范围,改变这些值就可以产生各种不同的纹理映射效果。

3.3.2 纹理数据

纹理数据在本次仿真设计中占有很重要的位置,纹理数据包括图像的数据以及纹理如何应用到具体的模型上去,这就涉及一个纹理坐标的问题。草地,天空,飞行器都使用纹理贴图来增加图形的真实感。

纹理数据主要指的是图像载入内存时生成的数据,它存储在一个数组中,数组的专业名字称为纹理对象,其中,图像的数据主要通过以下程序段载入内存而获得的:

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; If Load Failed Return NULL

}

最后在上面的工作完成后,由于位图的颜色格式为BGR,因此还必须交换RB的值,以得到RGB数据。

在将纹理数据从BMP文件中载入到内存之后,将其定义为一个OpenGL纹理图,调用OpenGL中的glTexImage()函数可以实现,在函数被调用之后,纹理数据就会被载入并做好被使用的准备,调用glGenTexture()函数将一个名字赋给纹理对象,因为纹理对象是用来存储数据的,使其随时准备被使用。有了纹理对象,就可以将多个纹理一次性的载入内存,以便场景绘制期间随时引用其中的任何一个纹理。生成纹理名之后,然后使用glBindTexture()函数将此纹理对象绑定为我们将在绘制多边形时使用的当前纹理。如果想要使用多个纹理对象,那么每次要使用不同的纹理时都要调用glBindTexture()函数来绑定相应的纹理对象。

最后当纹理对象被绑定到其数据上以后,可以调用glBindTexture()函数来将此纹理设置为当前的纹理状态,这样在绘制多边形完成后,就可以调用相应的纹理来进行贴图。

3.4 漫游的原理

在飞行器仿真中,飞行器可以在三维场景中漫游,随着我们的移动,我们周围的景物也在发生变化,在OpenGL中,物体坐标的移动可视为物体的移动,角度的变换,可仿真视角的效果,在行走过程中,视觉的效果在OpenGL中被模拟出来。

本文来源:https://www.2haoxitong.net/k/doc/027fe2f4162ded630b1c59eef8c75fbfc77d9489.html

《(强烈推荐)基于OpenGL的三维飞行器程序设计与仿真 - 毕业论文设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式