基于粒子动画的动漫游戏场景情绪表现方法的研究【毕业论文】.doc

上传人:文初 文档编号:17429 上传时间:2018-04-26 格式:DOC 页数:53 大小:6.45MB
下载 相关 举报
基于粒子动画的动漫游戏场景情绪表现方法的研究【毕业论文】.doc_第1页
第1页 / 共53页
基于粒子动画的动漫游戏场景情绪表现方法的研究【毕业论文】.doc_第2页
第2页 / 共53页
基于粒子动画的动漫游戏场景情绪表现方法的研究【毕业论文】.doc_第3页
第3页 / 共53页
基于粒子动画的动漫游戏场景情绪表现方法的研究【毕业论文】.doc_第4页
第4页 / 共53页
基于粒子动画的动漫游戏场景情绪表现方法的研究【毕业论文】.doc_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、本科毕业设计(20届)基于粒子动画的动漫游戏场景情绪表现方法的研究所在学院专业班级计算机科学与技术学生姓名学号指导教师职称完成日期年月1摘要【摘要】随着计算机动画技术的发展,烟雾等自然场景的动态模拟在仿真虚拟研究中占有越来越重要的地位。而粒子系统对自然景物的模拟在视景仿真系统、计算机游戏、三维动画中有着广泛的应用。目前,粒子系统已经被广泛使用到烟,雾,火,雨,雪等自然景观的模拟中,并取得了很好的特效效果。本课题主要使用3DSMAX软件创建现实场景,将场景导出为X文件,再将X文件用DIRECT3D语言导入至MICROSOFTVC60的编程环境中,利用粒子系统在场景中渲染恐怖的情绪,同时,通过控制

2、粒子参数来控制特效的表现度,从而控制场景的恐怖情绪。【关键词】粒子系统;DIRECT3D;场景情绪2ABSTRACT【ABSTRACT】WITHTHEDEVELOPMENTOFCOMPUTERANIMATIONTECHNOLOGY,DYNAMICSIMULATIONOFSMOKEANDOTHERNATURALSCENESGAINSAMOREANDMOREIMPORTANTPOSITIONINVIRTUALSIMULATIONSTUDYTHEEFFECTOFNATURALPHENOMENONSIMULATIONHASBEENWIDELYUSEDINVISUALSIMULATIONSYSTEM,C

3、OMPUTERGAME,AND3DANIMATIONANDSOONATPRESENT,THEPARTICLESYSTEMHASBEENWIDELYUSEDINTHESIMULATIONSOFSMOKE,FIRE,RAIN,SNOWANDGAINSAGOODPERFORMANCETHESUBJECTCREATESREALISTICLIFELIKEMODELSANDNATURALPHENOMENABYUSING3DSMAXEXPORTINGTHEXFILEFROMTHESCENEANDTHENIMPORTINGTHEXFILEINTOTHEPROGRAMMINGENVIRONMENTOFMICRO

4、SOFTVC60BYUSINGTHEDIRECT3DLANGUAGEANDTHENPERFORMTHEGRIMATMOSPHEREBYUSINGPARTICLESYSTEMANDCONTROLTHEMOTIONOFSCENEBYCONTROLLINGTHEPARTICLEPARAMETERS【KEYWORDS】PARTICLESYSTEMDIRECT3DTHEMOTIONOFSCENE3目录1引言4113D动漫游戏发展史412动漫游戏作品中粒子动画的特效分析7121CRYSIS中粒子系统实现的大自然景观7122CRYSIS中粒子系统实现的战场环境913本文的主要工作102虚拟场景设计1121虚

5、拟的社会场景剧情1122虚拟场景的创建1123虚拟场景的导出1524人物模型的创建1725人物模型导出183基于游戏场景的粒子动画特效设计1931粒子系统的基本原理1932基于粒子系统的烟和火特效1933基于粒子系统的雾特效264实验过程和分析2941实验的编程环境2942程序的主要函数和关键代码说明29421用广告板技术绘制树29422基于蒙皮骨骼动画的角色设计3043部分演示画面4544实验结果分析485结束语5051实验效果5052实验心得50参考文献52致谢错误未定义书签。附录错误未定义书签。41引言113D动漫游戏发展史随着个人电脑配置的提升和游戏开发环境的进一步完善,人们开始对电脑

6、游戏的画面产生了更为苛刻的要求,以往的2D画面已经远远不能满足这些挑剔的游戏玩家的眼光。于是,如何利用现有的2D显示设备(如各种CRT和液晶显示器)更好的显示出3D的游戏画面以满足玩家们日益增长的画面要求,开始成为游戏制作者和高级程序员们不断挑战的课题。史上最早的3D游戏产生于雅达利公司的业务用筐体,即我们通常所说的街机,它的名字叫做夜之车手(NIGHTDRIVER)。玩家们扮演的角色是一个行驶在夜间的道路上的疯狂车手。黑白的屏幕,街机专用的方向盘,刹车,油门,一切都是为模拟真实的赛车感觉而制作,给了人们一种崭新的游戏体验。而这个游戏所创造的“第一人称”视角的3D画面表现方式及其衍生的“第三人

7、称”视角和“斜45度俯视视角”则在现代的3D游戏里大行其道,其所应用的动态近大远小的3D画面透视原理为所有的3D游戏建立了一个在2D显示设备上表现运动的3D画面的基本概念和方法。时至今日,无论是反恐精英还是极品飞车,无论是AVG还是RTS,只要和3D沾上了边的游戏,在它们身上都能或多或少找到当年夜之车手的影子。尽管游戏市场上存在夜之车手这类3D游戏,但由于硬件条件所限,极其简陋的画面还是吸引不了普通家用消费者的挑剔目光,所以这类游戏在最初的时候大多出在街机上。这样糟糕的状况一直延续到1992年,一个传奇游戏的诞生。1992年,3DREALMS公司发行了由卡马克们制作的一款只有2兆多的小游戏德军

8、总部3D(WOLFENSTEIN3D),在这个小游戏里,玩家们头一次感受到Z轴的威力,相对于2D画面的X轴、Y轴,Z轴的诞生使玩家们可以自由的以第一视角进出任何一个场景。通过观察这一极其真实的虚拟世界,所有的玩家都感受到了一种巨大的视觉冲击。图11德军总部当然受限于当时的硬件和软件条件,德军总部3D并非一个真正意义上的3D游戏,在游戏中玩家只能前后左右的移动,不能跳,不能上看下看,不能以任意角度方向移动,只能笔直的移动和以90度角转向。不久之后,ID最著名的作品之一DOOM诞生,相比较于德军5总部3D,DOOM显然对于3D的理解显然更进了一步,在游戏中玩家们终于可以自由的以任意角度移动了。而D

9、OOM也成了第一个被授权引用的商品化的引擎,以DOOM为引擎的游戏如异教徒(HERETIC)和毁灭巫师(HEXEN)等,在FPS初期发展的岁月里也获得了同样巨大的成功,至今仍然在欧美的狂热FPS玩家心中拥有极高的地位。图12DOOM尽管DOOM系列的引擎无可否认是一款优秀的游戏引擎,但由于硬件条件的制约,在即使是2D显示速度还成问题的当时,卡马克用了各种办法试图使DOOM系列达到自己心中完美的境地,DOOM系列仍然只是一个至多算得上是25D的游戏,与现在普遍意义上的3D游戏还存在着很大的差距。但这个本质是2D的游戏却在卡马克们优秀的程序设计和惊人的环境效果上虚拟了一个真实而又残酷的屠戮世界,并

10、由此开始引发了一场游戏发展史上的最大革命。而ID公司也成了电脑业界一个极其独特的公司,在往后的岁月里这个几十人的小公司一直在幕后领导着整个计算机显示设备的更新换代和计算机图形技术的向前发展。时针指向1996年年中,一个划时代的游戏作品诞生了,那就是俗称为雷神之锤的QUAKE。然而,开发的过程并不是非常顺利,95年整整一年,ID内部都陷入到一个混乱而无序的内耗过程中。在这场内部的斗争中,在游戏理想和游戏制作理念的追求上,卡马克和罗梅洛这对曾经亲密无间的战友发生了严重的分歧。而在QUAKE制作过程中3DREALM公司的毁灭公爵3D所取得的巨大成功也给这对难兄难弟带来了前所未有的压力。遗憾的是,天才

11、的他俩就和披头士中才华横溢的列农与麦卡特尼一样,在QUAKE完成之后分道扬镳。1996年6月,QUAKE终于完工。和之前的FPS不同,这是一款真正意义上的3D游戏,而之前即使是广受好评的毁灭公爵在本质上也是一款2D游戏。在游戏中,玩家可以自由的尝试360度的转身,可以低头,可以抬头,可以上窜下跳,可以从房间里窜到广阔的荒野上,所有的游戏里的东西都是基于无数多边形构成的物件,QUAKE带给了我们一个比以往任何时候都要真实的3D化虚拟杀戮世界。就技术上来说,QUAKE引擎是当时第一款完全支持多边形模型、动画和粒子特效的真正意义上的3D引擎。而且除了可以使用CPU的软加速进行游戏外,QUAKE还支持

12、使用当时最先进的图形加速卡VOODOO的硬件加速技术,而使用这个GLQUAKE模式进入游戏的玩家可以获得更快的游戏速度与更华丽的游戏效果。更由于真实的63D场景和3D人物建模的引入,玩家们自由的创造出了多种影响深远的游戏战术,比如QUAKE系列最著名的操作技巧之一火箭跳就是从那个时候产生的。除了画面和游戏性方面的进步外,ID公司还鼓励玩家们自己制作游戏的MODS,QUAKE本身也为他的爱好者们提供了各种各样的开发工具,以使玩家们可以根据自己天马行空的想象力创造出属于自己的游戏方式,夺旗等新颖的游戏模式通过玩家们的双手诞生。图13QUAKEQUAKE比DOOM更进步的地方还有对联网功能支持的加强

13、,原本只支持4人的网络对战现在扩大到了16人,并增加了对TCP/IP等各种网络协议的支持,从而使世界各地的玩家能够通过互联网接入设备站在同一块虚拟的大地上厮杀。从那时开始的QUAKE社区在世界各地吸收了各种不同肤色志同道合的人们加入到游戏技艺的切磋和探讨中来,并培养出一大群FPS的死忠玩家和高手,其中就包括了把法拉利开走的THRESH首批职业玩家中最著名的一个。ID公司则通过举办各种奖金丰厚的比赛,吸引了大批玩家的参与,来实现自己推动和发展竞技游戏运动的理想,可以说现代竞技游戏运动的兴起和ID的努力是分不开的。现在无论是WCG,还是CPL等各项大小游戏赛事无疑都是参照了ID的比赛模式进化发展而

14、来。QUAKE不仅代表了PC游戏正式迈进3D门槛,更是带来了电子竞技运动的新概念。QUAKE以及QUAKE引擎所衍生的大量游戏,不仅仅领导着游戏软件制作的潮流,并由这些3DFPS游戏所产生的硬件需求,一步步催赶着电脑硬件,特别是3D图形显示设备的不断向前发展。时至今日,一个优秀的3DFPS游戏不仅仅是玩家硬盘里的座上宾,也是硬件评测人员的必备工具,更是那一条条催促硬件厂商进行硬件研发和升级的皮鞭。3D化的游戏已经成为了软件技术进步和电脑硬件发展的催化剂。从WINDOWS95诞生以来,随着古墓丽影、QUAKE和极品飞车这一类3D游戏的大获成功和3DAPI的不断成熟完善,各个硬件生产厂商针对3D游

15、戏不断进行硬件更新,3D游戏开始在电脑游戏界牢牢地扎下了自己的根基。不同于2D游戏细腻如同油画般的美感,3D游戏带给玩家们的是一个用数字的方式表现出来的极为真实的虚拟世界。在这个世界里,玩家可以孤身一人前往尼亚加拉大瀑布探险,可以在虚拟的战场与各种怪物殊死作战,可以惬意的开着法拉利在某个小村庄享受田园诗情画意的宁静。在这个由无数个多边形构成的奇妙世界7里玩家们体验到了与现实世界不尽相同的真实。12动漫游戏作品中粒子动画的特效分析随着动漫技术的提高,许多的动漫游戏中,尤其是3D游戏中使用粒子系统来模拟很多类似烟,火焰,火花,雾,下雨,下雪等自然景象,让游戏玩家在游戏这个虚拟的世界里能体验到真实世

16、界的景象。而且随着游戏技术的不断发展,游戏玩家对游戏的画面表现,真实度的要求越来越高。粒子系统是一个能源源不断产生粒子的系统,系统中的每个粒子都有一定的生命周期,它将经理“产生”、“活动”、“死亡”三个生命过程。系统生成一个新粒子,粒子按照设定好的属性值改变形状,大小,颜色,位置等,在其生命周期内按照设定好的方向进行运动,当运动时间与其生命值相等时,该粒子就死亡,同时系统又将产生新的粒子。2007年,CRYTEK出品的CRYSIS是当年最受关注的PC游戏,虽然其高配置要求导致90以上的用户根本看不到特效全开的CRYSIS画面效果,其DX10最高画质下的画面水平王电影水平逼近。后来,台湾一个叫M

17、OBILE01的网站使用了一套INTELCORE2DUOQX6850和GEFORCE8800GTX系统,在1024X768分辨率下,勉强以20FPS的帧速跑出了DX10特效全开画面,向众多粉丝们展示了CRYSIS的多项创新技术。其中就有用粒子系统实现的特效。121CRYSIS中粒子系统实现的大自然景观在很多游戏中,雨雪等自然特效都已经能够实现,而且栩栩如生。而CRYSIS在雪天效果的实现上又有了突破。片片雪花的大小形状、下落速度都各不相同,非常逼真。而为了增强自然景观的真实性,粒子系统通过空间扭曲控制粒子的行为,结合空间扭曲能对粒子流造成重力、阻挡、风力等仿真影响。(1)下雪特效如图11图11

18、粒子动画雪(2)下雨的效果如图128图12粒子动画雨(3)瀑布的效果如图13图13粒子动画瀑布(4)体积雾效果如图14图14粒子动画体积雾9(5)体积云效果如图15图15粒子动画体积云122CRYSIS中粒子系统实现的战场环境游戏场景中角色在激烈的战斗过后,空气中仍然会弥漫着硝烟与尘埃,过一段时间后才会慢慢散去。有些角色跑动的时候会激起大片灰尘,粒子系统通过对粒子生命值的控制来达到这种硝烟散去和灰尘激起的效果,非常逼真,接近现实。同时,怪物死亡时冒出的血花,以及各种炫目多彩的光影效果都是基于粒子系统而完成的。(1)战场硝烟效果如图16图16粒子动画硝烟(2)战场爆炸效果如图1710图17粒子动

19、画爆炸(3)战场火效果如图18图18粒子动画火13本文的主要工作本文主要使用3DSMAX制作虚拟的环境场景,利用DIRECT3D语言通过粒子系统实现烟,火,雾三种特效。一般动漫游戏中的特效表现出的仅仅是一种自然现象的模拟,本文的创新点在于通过调节粒子系统的各个属性来烘托不同场景情绪,使场景表现出一种恐怖的氛围。112虚拟场景设计21虚拟的社会场景剧情本课题的虚拟社会场景灵感来源于上面提到的SILENTHILL,主要构建了一个名叫DEATHHILL的死亡岭,恐怖的死亡岭主要以山岭为背景,加之以浓密的树林,表现真实的山岭环境,而之所以称之为“死亡岭”,因为来此岭的人基本有去无回,有大量尸骨填埋于此

20、,所以在场景中搭建了大片墓地,营造死亡的气氛。同在山岭之前,森林深处加入了一座庙宇,庙宇自古与鬼神有关,以此更加烘托出神秘的气氛。在大片坟墓之前,搭建了一个小茅屋,屋门紧闭,预示着此处稀无人烟,但烟囱却冒着浓浓黑烟,门前的火台也燃烧旺盛,透露着丝丝诡异。同时,为了在漫游时,没有接触到所有恐怖事件之前,也能体验到神秘之感,场景中借鉴了SILENTHILL中的浓雾,未知的前方使漫游者始终心怀恐惧之感,使场景的恐怖情绪更高一筹。22虚拟场景的创建(1)地面的创建。地图主要采用3DSMAX中的平面技术和贴图效果,通过PS技术,在草地贴图中加入了清澈的河流,取得基本的视觉效果,而避免了在3DSMAX中制

21、作的麻烦,减少了不必要的模型量。效果如图21图21地面(2)山脉设计山脉主要采用3DSMAX中的平面和可编辑网格技术,通过随意拉动可编辑网格顶点的方法来获得山脉的峭壁效果,制作方法如图2212图22山脉制作方法通过对可编辑多边形顶点的拖动,使平面有了山脉的效果。在贴图过程中,利用了UVW贴图技术,此技术主要是调整纹理贴图的方位和贴图方法,根据不同的贴图方法获得不同的贴图效果。在山的贴图中,使用的是长“长方体”效果,最终山脉效果如图23图23山脉(3)房屋的建立。用平面和圆柱体创建大致的房屋模型,采用UV贴图,将贴图赋予模型,贴图过程如图24图24贴图过程最终房屋模型效果如图2513图25房屋同

22、样的方法,创建庙宇,效果如下图25图25庙宇(4)坟墓的建立。坟墓主要利用了3DSMAX的平面和广告牌技术,效果如图26图26坟墓(5)DEADHILL标牌的建立。14主要采用长方体和圆柱建立基本模型,用PS制作DEADHILL的贴图,效果如图27图27DEADHILL标牌(6)STOP标牌和十字架的建立。STOP标牌主要采用圆柱体建立基本模型,使用PS制作STOP红底白字的贴图,有明显的视觉效果;十字架采用长方体为基本的模型,效果如图28图28STOP标牌和十字架(7)火架的建立。火架的支撑,火台,不规则木棒,均是用长方体为基本模型,然后采用可编辑网格中的顶点拉伸来达到不规则的效果,如图29

23、图29火架15(8)天空的制作。天空主要采用球体,两个一大一小的球体为基本模型,采用布尔运算挖空大的球体,达到空球体的效果,再加以天空贴图,效果如图210图210天空23虚拟场景的导出在3DSMAX中制作的模型需要导成X文件后才能被程序使用。导出过程使用PANDA导出插件。导出过程中需要注意要将坐标系进行转换,因为3DSMAX中的坐标系是右手坐标系,而DIRECT3D中使用的是左手坐标系,所以需要转换成左手坐标系后才能在程序中正确显示,否则就要在程序中进行相应坐标轴的转换。到处效果见211图211场景导出图DIRECTX中导入CHANGJINGMAX9X文件,导入代码为HRD3DXLOADME

24、SHFROMX“CHANGJINGMAX9X“,D3DXMESH_MANAGED,DEVICE,保存材质和纹理到指定缓冲区,代码为IFMTRLBUFFER0FORINTI0IMTRLBUFFER/DONEW/BUFFER渲染场景的代码为17/RENDERHOUSE1D3DXMATRIXHOUSEMATD3DXMATRIXROTYD3DXMATRIXROTATIONXD3DXMATRIXIDENTITYD3DXMATRIXTRANSLATIOND3DXMATRIXSCALD3DXMATRIXSCALING/缩放DEVICESETTRANSFORMD3DTS_WORLD,/ISETMATERIAL

25、/材料DEVICESETTEXTURE0,TEXTURESI/材质HOUSE1DRAWSUBSETI24人物模型的创建根据人物模型创建骨骼,将骨骼和人物模型进行蒙皮封套,完成效果如图212图212蒙皮封套图将蒙皮完得模型进行UV贴图,效果如图213图213贴图操作选择人物的一根骨骼,选择“运动图标,打开运动捕捉,选择人物动作库中的WALK动作,18给蒙皮骨骼添加动画。操作如图214图214运动捕捉25人物模型导出将加了WALK动作的人物模型导出,导成X文件,打开X文件,可以观察到走路的妇女,效果如图215图215妇女导出图193基于游戏场景的粒子动画特效设计31粒子系统的基本原理粒子通常是一个

26、带有纹理的四边形。通过这个使用了纹理映射的四边形,可以认为粒子实际上就是一个很小的三维网络模型,只不过是纹理赋予了它特殊的外表。绘制粒子就如同绘制多边形一样简单,因为一个粒子就是一个可以改变大小并映射了纹理的四边形。如果给出了粒子中心店的坐标和粒子的大小,不难计算出绘制粒子所需要的4个顶点的为转移坐标。很多情况下,因为一个粒子是使用两个三角形组成一个矩形来表示的,所以通常需要使粒子四边形始终面向观察者,这就使用广告版(BILLBOARD)技术。广告版技术的基本原理就是在渲染一个多边形时,首先根据观察方向构造一个旋转矩阵,利用该矩阵旋转多边形使其面向观察者,然后再渲染该多边形,如果观察方向不断变

27、化就需要不断旋转多边形1。粒子系统由大量的粒子构成。每个粒子就有一组属性,如位置、大小以及纹理,可能还需要颜色,透明度、运动速度、加速度、生命期等属性。一个粒子系统是随时间不断变化的。在生命的每一刻,都要完成粒子源产生粒子,更新现存粒子的属性,删除已“死亡”的粒子,绘制粒子四步工作。DIRECT3D通过点精灵(POINTSPRITES)技术对粒子系统的实现提供了很好的支持。为了节省存储空间,通常只给出粒子中心点的位置和粒子的大小,在渲染时根据中心点的位置和粒子的大小计算绘制粒子多边形所需要的4个顶点的坐标,同时还需要根据观察方向旋转每个粒子使其面向观察者。可以认为点精灵就是具有中心店位置和大虾

28、偶的粒子,并在渲染时它能够根据其中心位置和大小自动计算出多边形的4个顶点,并自动旋转面向观察方向2。32基于粒子系统的烟和火特效321构造粒子系统粒子系统中每个粒子在程序中通常使用一个结构体来表示,所以首先需要设计合理的粒子结构。STRUCTPARTICLED3DXVECTOR3M_VCURPOS/CURRENTPOSITIONOFPARTICLED3DXVECTOR3M_VCURVEL/CURRENTVELOCITYOFPARTICLEFLOATM_FINITTIME/TIMEOFCREATIONOFPARTICLEPARTICLEM_PNEXT/NEXTPARTICLEINLIST在程序中

29、使用一个链表来保存粒子及系统中的素有存货的粒子,所以在粒子结构中添加了一个而指向下一个粒子结构的指针。322粒子系统类的设计与实现将与粒子系统相关的操作封装到一个CPARTICLESYSTEM类中,实现一个通用的结构化粒子系20统。主要函数解析(1)SETTEXTURE函数该函数负责为粒子系统创建粒子纹理,实现代码如下VOIDCPARTICLESYSTEMSETTEXTURECHARCHTEXFILEIFM_CHTEXFILENULLDELETEM_CHTEXFILEM_CHTEXFILENULLM_CHTEXFILENEWCHARSTRLENCHTEXFILE1IFM_CHTEXFILENU

30、LLSTRCPYM_CHTEXFILE,CHTEXFILE(2)RESTOREDEVICEOBJECTS函数该函数负责为粒子系统创建保存粒子的顶点缓冲区,实现代码如下HRESULTCPARTICLESYSTEMRESTOREDEVICEOBJECTSLPDIRECT3DDEVICE9PD3DDEVICEHRESULTHRIFFAILEDHRPD3DDEVICECREATEVERTEXBUFFERM_DWDISCARDSIZEOFPOINTVERTEX,D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS,POINTVERTEXFVF_FLAGS

31、,/OURCUSTOMFVFD3DPOOL_DEFAULT,RETURNS_OK在该段代码中,1、因为创建的顶点缓冲区用于渲染点精灵,所以在调用CREATEVERTEXBUFFER函数创建顶点缓冲区时,需要通过参数USAGE添加D3DUSAGE_POINTS标志予以说明;2、因为渲染粒子系统需要不断地锁定粒子系统的顶点缓冲区并根据每个粒子的具体属性数据填充点点缓冲区,所以为了提高性能在调用CREATEVERTEXBUFFER函数创建顶点缓冲区时,通过参数USAGE添加一个D3DUSAGE_WRITEONLY使用标志;3、在后面的RENDER函数中,锁定顶点缓冲区填充粒子数据时,为了提高程序运行

32、性能,21使用了D3DLOCK_DISCARD和D3DLOCK_NOOVERWRITE加锁标志,所以在创建顶点缓冲区时,必须通过参数USAGE添加D3DUSAGE_DYNAMIC使用标志,这是因为只有在创建顶点缓冲区时使用了D3DUSAGE_DYNAMIC标志,D3DLOCK_DISCARD和D3DLOCK_NOOVERWRITE加锁标志才有效。4、因为创建顶点缓冲区时使用D3DUSAGE_DYNAMIC标志,所以在创建顶点缓冲区时就不能使用管理的内存,即不能将CREATEVERTEXBUFFER函数的POOL设置为D3DPOOL_MANAGED,而只能设置D3DPOOL_SUSTEMMEM和

33、D3DPOOL_DEFAULT,考虑到程序运行性能,选用了D3DPOOL_DEFAULT。因为采用的是D3DPOOL_DEFAULT内存类型,所以在设备丢失时必须释放顶点缓冲区,在设备恢复时也需要重新为粒子系统创建顶点缓冲区。(3)UPDATE函数该函数负责根据当时时间更新整个粒子系统,包括更新当前所有粒子的各属性值,删除已“死亡”的粒子,发射新的粒子。该函数的实现代码如下HRESULTCPARTICLESYSTEMUPDATEFLOATFELPASEDTIMEPARTICLEPPARTICLEPARTICLEPPPARTICLED3DXVECTOR3VOLDPOSITIONM_FCURREN

34、TTIMEFELPASEDTIMEPPPARTICLE/STARTATTHEHEADOFTHEACTIVELISTWHILEPPPARTICLEPPARTICLEPPPARTICLE/SETAPOINTERTOTHEHEADFLOATFTIMEPASSEDM_FCURRENTTIMEPPARTICLEM_FINITTIMEIFFTIMEPASSEDM_FLIFECYCLE/TIMEISUP,PUTTHEPARTICLEBACKONTHEFREELISTPPPARTICLEPPARTICLEM_PNEXTPPARTICLEM_PNEXTM_PFREELISTM_PFREELISTPPARTICL

35、EM_DWACTIVECOUNTELSEPPARTICLEM_VCURVELM_VGRAVITYFELPASEDTIMEIFM_BAIRRESISTENCETRUEPPARTICLEM_VCURVELM_VWINDPPARTICLEM_VCURVELFELPASEDTIME22VOLDPOSITIONPPARTICLEM_VCURPOSPPARTICLEM_VCURPOSPPARTICLEM_VCURVELFELPASEDTIMEPPPLANE/SETAPOINTERTOTHEHEADPPPARTICLEIFM_FCURRENTTIMEM_FLASTUPDATEM_FRELEASEINTERV

36、ALM_FLASTUPDATEM_FCURRENTTIMEFORDWORDI0IM_PNEXTELSEIFM_DWACTIVECOUNTM_PNEXTM_PACTIVELIST/MAKEITTHENEWHEADM_PACTIVELISTPPARTICLEPPARTICLEM_VCURVELM_VVELOCITYIFM_FVELOCITYVAR00FD3DXVECTOR3VRANDOMVECGETRANDOMVECTORPPARTICLEM_VCURVELVRANDOMVECM_FVELOCITYVARPPARTICLEM_FINITTIMEM_FCURRENTTIMEPPARTICLEM_VC

37、URPOSM_VPOSITIONM_DWACTIVECOUNT23RETURNS_OK该函数首先遍历粒子链表(M_PACTIVELIST)中的所有粒子,根据当前粒子的存活时间计算粒子的当前位置和速度,从而实现对粒子运动轨迹的控制,然后根据用户设定的粒子的存活时间来判断当前粒子是否已经死亡,并删除死亡的粒子。接下来发射新的粒子,根据两帧之间流逝的时间决定发射新粒子的数量,对于每个新粒子首先需要为其分配存储空间,然后赋予初始值并添加到粒子链表中。因为不断有粒子死亡,又不断产生新的粒子,所以就需要不断为死亡的粒子释放内存,为新粒子分配内存,而释放内存和分配内存都是比较消耗时间的。因此在CPARTIC

38、LESYSTEM类的UPDATE成员函数中,并没有真正为死亡的粒子释放内存,而是将表示死亡粒子的链表节点,从当前粒子链表中取出来链接到另一个单独的空闲链表(M_PFREELIST)中。为新粒子分配内存时,首先检查空闲链表是否还有节点,如果有则直接取一个节点作为新粒子的存储空间,并链接到当前粒子链表中,如果空闲链表已经为空,则再为新粒子分配空间。这样就可以避免不断的释放和分配内存,从而可以提高系统性能,当然其代价是占用更多的系统内存。(4)RENDER函数该函数负责将保存在粒子链表中的粒子渲染出来,该函数是CPARTICLESYSTEM类中最复杂的一个函数,其实现代码如下HRESULTCPART

39、ICLESYSTEMRENDER2LPDIRECT3DDEVICE9PD3DDEVICEHRESULTHRPD3DDEVICESETRENDERSTATED3DRS_POINTSPRITEENABLE,TRUEPD3DDEVICESETRENDERSTATED3DRS_POINTSCALEENABLE,TRUEPD3DDEVICESETRENDERSTATED3DRS_POINTSIZE,FTODWM_FSIZEPD3DDEVICESETRENDERSTATED3DRS_POINTSIZE_MIN,FTODW10FPD3DDEVICESETRENDERSTATED3DRS_POINTSCALE

40、_A,FTODW00FPD3DDEVICESETRENDERSTATED3DRS_POINTSCALE_B,FTODW00FPD3DDEVICESETRENDERSTATED3DRS_POINTSCALE_C,FTODW10FPARTICLEPPARTICLEM_PACTIVELISTPOINTVERTEXPVERTICESDWORDDWNUMPARTICLESTORENDER0M_DWVBOFFSETM_DWFLUSHIFM_DWVBOFFSETM_DWDISCARDM_DWVBOFFSET024IFFAILEDHRM_PVBLOCKM_DWVBOFFSETSIZEOFPOINTVERTEX

41、,M_DWFLUSHSIZEOFPOINTVERTEX,VOID/RENDEREACHPARTICLEWHILEPPARTICLED3DXVECTOR3VPOSPPARTICLEM_VCURPOSD3DXVECTOR3VVELPPARTICLEM_VCURVELPVERTICESPOSITVPOSPVERTICESCOLORM_CLRCOLORPVERTICESIFDWNUMPARTICLESTORENDERM_DWFLUSHM_PVBUNLOCKPD3DDEVICESETSTREAMSOURCE0,M_PVB,0,SIZEOFPOINTVERTEXPD3DDEVICESETFVFPOINTV

42、ERTEXFVF_FLAGSIFFAILEDHRPD3DDEVICEDRAWPRIMITIVED3DPT_POINTLIST,M_DWVBOFFSET,DWNUMPARTICLESTORENDERRETURNHRM_DWVBOFFSETM_DWFLUSHIFM_DWVBOFFSETM_DWDISCARDM_DWVBOFFSET0IFFAILEDHRM_PVBLOCKM_DWVBOFFSETSIZEOFPOINTVERTEX,/OFFSETTOLOCKM_DWFLUSHSIZEOFPOINTVERTEX,/SIZETOLOCKVOIDDWNUMPARTICLESTORENDER0PPARTICL

43、EPPARTICLEM_PNEXTM_PVBUNLOCKIFDWNUMPARTICLESTORENDERPD3DDEVICESETSTREAMSOURCE0,M_PVB,0,SIZEOFPOINTVERTEX25PD3DDEVICESETFVFPOINTVERTEXFVF_FLAGSIFFAILEDHRPD3DDEVICEDRAWPRIMITIVED3DPT_POINTLIST,M_DWVBOFFSET,DWNUMPARTICLESTORENDERRETURNHRPD3DDEVICESETRENDERSTATED3DRS_POINTSPRITEENABLE,FALSEPD3DDEVICESET

44、RENDERSTATED3DRS_POINTSCALEENABLE,FALSERETURNS_OK因为CPARTICLESYSTEM使用点精灵实现粒子的渲染,所有首先需要设置与点精灵相关的各种渲染状态,尤其将D3DRS_POINTSPRITEENABLE状态设置为TRUE,表示启用点精灵。锁定顶点缓冲区,使用D3DLOCK_NOOVERWRITE方式将粒子数据填充到缓冲区小块,填充结束,解锁,绘制缓冲区中的粒子,锁定下一个小块,重复以上步骤。当用完顶点缓冲区的空间,即已经在顶点缓冲区的末尾(M_DWVBOFFSETM_DWDISCARD),则从缓冲区的起始处(M_DWVBOFFSET)重新开始

45、填充,此时使用D3DLOCK_DISCARD方式。(5)在主程序DEADHILL中,初始化烟和火的粒子参数,如下/烟粒子的初始化代码/G_PPARTICLESYSTEMS1NEWCPARTICLESYSTEMG_PPARTICLESYSTEMS1SETTEXTURE“SMOKEBMP“G_PPARTICLESYSTEMS1SETMAXPARTICLES500G_PPARTICLESYSTEMS1SETNUMTORELEASE5G_PPARTICLESYSTEMS1SETRELEASEINTERVAL005F/释放时间间隔G_PPARTICLESYSTEMS1SETLIFECYCLE50F/生命

46、周期G_PPARTICLESYSTEMS1SETSIZE10F/烟的浓度控制05/单位G_PPARTICLESYSTEMS1SETCOLORD3DXCOLOR10F,00F,00F,10FG_PPARTICLESYSTEMS1SETPOSITIOND3DXVECTOR300F,00F,00F/180F,420F,1200FG_PPARTICLESYSTEMS1SETVELOCITYD3DXVECTOR300F,100F,00F/速度G_PPARTICLESYSTEMS1SETGRAVITYD3DXVECTOR300F,00F,00F/重力G_PPARTICLESYSTEMS1SETWINDD3

47、DXVECTOR315F,00F,00FG_PPARTICLESYSTEMS1SETVELOCITYVAR15FG_PPARTICLESYSTEMS1INIT2DEVICE创建粒子对象G_PPARTICLESYSTEMS1作为烟粒子的对象,设置烟的纹理,最大粒子数,释放时间间隔,声明周期,烟的浓度,速度,重力,风力等属性值。模拟火焰和烟的整体思路即将点精灵固定于三位空间的某个位置,让粒子群按照设定好的属性随机产生。在存活时间之26内,慢慢上升,生命值逐渐递减,最后消失,而新的粒子有不断产生。/火粒子的初始化代码/G_PPARTICLESYSTEMS2NEWCPARTICLESYSTEMG_PP

48、ARTICLESYSTEMS2SETTEXTURE“FIREBMP“G_PPARTICLESYSTEMS2SETMAXPARTICLES200G_PPARTICLESYSTEMS2SETNUMTORELEASE5G_PPARTICLESYSTEMS2SETRELEASEINTERVAL005FG_PPARTICLESYSTEMS2SETLIFECYCLE20FG_PPARTICLESYSTEMS2SETSIZE15FG_PPARTICLESYSTEMS2SETCOLORD3DXCOLOR00F,10F,00F,10FG_PPARTICLESYSTEMS2SETPOSITIOND3DXVECTO

49、R300F,00F,00F/160F,300F,1000FG_PPARTICLESYSTEMS2SETVELOCITYD3DXVECTOR300F,50F,00FG_PPARTICLESYSTEMS2SETGRAVITYD3DXVECTOR300F,00F,00FG_PPARTICLESYSTEMS2SETVELOCITYVAR30FG_PPARTICLESYSTEMS2INIT2DEVICE创建粒子对象G_PPARTICLESYSTEMS2作为火粒子的对象,火粒子和烟粒子的区别主要在于火粒子的粒子浓度比烟粒子浓度大,火粒子浓度没有设置风力,而烟粒子浓度为了凸显其形象逼真的效果,设置了X轴方向的风速向量。33基于粒子系统的雾特效雾化效果是计算机图形学中应用最广的效果之一,它不仅能显著地增加视觉效果的真实感,并可以可供一定的深度感。在实时图形程序,特别是游戏设计程序中,为了确保图形系统的运行速度,图形开发人员往往在位于观察点远处的场景使用较为简单的额三维模型,甚至不绘制物体,而在近处使用复杂模型,这样就可能造成物体变形、突然出项或突然消失等失真现象,雾化效果可以有效避免这种失真现象。在DIRECT3D图形系统中,雾化是通过将景物颜色与雾的颜色

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。