已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验八:粒子系统一、实验目的掌握粒子系统的的原理,熟悉Ogre中粒子系统的结构和使用方法.二、实验仪器Visual Studio 2005三、实验原理及过程/利用Ogre实现一个粒子系统效果,并描述程序实现时的思路包括对每个调用的API以及脚本进行详细说明基本概念:粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。粒子系统在三维显示中占有很重要的位置,如3D中的雨,雪,喷泉,爆炸等效果都是粒子完成的。粒子是用四边形来表示的,它有长宽,和其方向,有数量和材质,还有重量。这些属性封在粒子属性变换器(Affector)中,Affector中包含颜色衰退变换器(colourFadeAffector)和线形影响变换器(LinearForceAffector)和点状粒子发生器(PointEmmiter),由这些组成粒子脚本文件,以.Particle为其扩展名。点状粒子发生器随机地从单一的点发射粒子;盒状粒子发生器随机的从一个区域发射粒子。通过创建Plugins你可以向ogre里增加一个新的发谁。当前ogre只支持点状粒子发生器和盒状粒子发射器。当粒子发生器不停的喷发大量粒子时,就可以形成烟、火和爆炸等效果,结构图如下: 每个引擎都会有自己的粒子系统,粒子系统特效在游戏中运用广泛,比如射击类游戏中的爆炸特效,烟雾特效,开枪时喷出的火焰,撞击时击出的火花等等多半由粒子系统实现。粒子系统的基本单元是粒子,每个粒子一般具有形状、大小、颜色、透明度、位置、速度、加速度、方向、生命周期等属性。每一帧,粒子系统一般都会执行如下步骤: 1) 产生新的粒子,并赋予相应的属性; 2) 删除超过生命周期的粒子; 3) 更新粒子的动态属性;4) 渲染所有有效粒子。OGRE 粒子系统组成 OGRE粒子系统还是比较清晰易懂的,它由ParticleSystemManage(粒子系统管理器)、ParticleSystem(粒子系统)、ParticleSystemRenderer(粒子渲染器)、ParticleEmitter(粒子发射器)、ParticleAffector(粒子影响器)、Particle(粒子)等组成。 1) ParticleSystemManager(粒子系统管理器) 此类类似于OGRE中的SceneManager,单件模式,内含粒子系统工厂集合,粒子发射器工厂集合,粒子影响器工厂集合,以及粒子渲染器工厂集合,用于创建和管理粒子系统、粒子发射器、粒子影响器、粒子渲染器。该类还负责加载和分析粒子系统脚本。 2) ParticleSystem(粒子系统) 具体的粒子系统类,它需要包含具体的ParticleEmitter 集合、ParticleAffector集合、ParticleSystemRenderer,Particle集合,用于粒子的创建、更新、渲染。 3) ParticleEmitter(粒子发射器) 用于创建粒子,赋予粒子初始属性赋值,最重要的方法是_initParticle(),该类为抽象类,OGRE中提供了如下派生类,自己也可以根据需要编写自己的Emitter: AreaEmitter BoxEmitter CylinderEmitter EllipsoidEmitter HollowEllipsoidEmitter PointEmitter RingEmitter发射器中几个参数解释:1. angle 粒子发射器发射出的粒子的最大偏移角2. colour 设置所有发射出的粒子的固定颜色3. colour_range_start & colour_range_end 粒子颜色将为这2中颜色值之间随意的产生4. emission_rate 粒子发射器发射出的粒子数5. velocity 每次发射粒子的恒定速度6. time_to_live 每个粒子在销毁之前存活的时间。不过,它可以利用参数repeat_delay复活7. duration 发射器发射的粒子处于激活状态的数量8. repeat_delay 粒子销毁到激活需要等待的时间数 4) ParticleAffector(粒子影响器) 用于在粒子的生命周期内更新粒子的属性,最重要的方法是 _affectParticles(),OGRE中提供了如下派生类,自己也可以根据需要编写自己的Affector: ColourFaderAffector ColourImageAffector ColourInterpolatorAffector DeflectorPlaneAffector DirectionRandomiserAffector LinearForceAffector RotationAffector ScaleAffector 5) ParticleSystemRenderer(粒子渲染器) 该类用于渲染粒子系统,该类为抽象类,ORGE提供了BillboardParticleRenderer具体类,自己也可以根据需要编写自己的粒子渲染类。 6) Particle(粒子) 粒子系统的基本元素,粒子,存储了粒子的所有属性和状态。粒子系统脚本在Ogre程序中,粒子系统可以利用代码实现,但也可以利用脚本语言。不过,一般情况下,都是利用脚本语言。OGRE提供了粒子系统脚本语言,刻一张哎脚本中设置粒子的各种属性,而不用重新编译程序。这样给使用者带来了方便。需要注意的粒子系统脚本文件有自己的语法,类似c+,注释用“/”,用“”来区分界限,但不支持在代码后跟注释。在Ogre中只要将记事本的后缀名定义为.particle,Ogre会自动识别其为粒子脚本。载入粒子脚本粒子系统脚本是在系统初始化的时候载入的,缺省情况下在系统在公共资源路径(Root:addResourceLocation函数指定)下查找所有扩展名为“.particle”的文件并解析它们,如果想要指定其他扩展名可以使用particleSystemManager:getsingleton().ParseAllSource方法,如果想要解析单个的粒子系统脚本文件可使用ParticleSystemManager:getsingleton().parseScript方法。一旦粒子系统脚本被载入,你可以使用ParticleSystemManager:getSingleton().createSystem()方法来才创建一个实例化的粒子系统,该方法接受两个参数,一个该粒子系统的名称,而另一个参数是要参照的模板名称(也就是脚本中定义过的模板名称)获取粒子模板迭代器Ogre:ParticleSystemManager:getSingleton().getTemplateIterator()解析单个的粒子系统脚本文件Ogre:ResourceGroupManager:getSingleton().addResourceLocation(“文件名”, FileSystem);Ogre:DataStreamPtr stream = Ogre:ResourceGroupManager:getSingleton().openResource(文件名);Ogre:ParticleSystemManager:getSingleton().parseScript(stream,Ogre:ResourceGroupManager:DEFAULT_RESOURCE_GROUP_NAME);OGRE粒子系统执行流程1. 创建一个粒子系统对象,如:ParticleSystem*lightParticle= mSceneMgr-createParticleSystem(LightParticle, myLight);createParticleSystem函数中第一个变量为粒子系统的名称,有利于根据名称查找到该粒子系统;第二个变量为我们创建的粒子系统的脚本语言的名称。2. 创建一个节点,用于绑定刚才创建好的粒子系统对象。该节点可以根据自己的需要创建,也既是灵活的将粒子绑定在各个不同的节点上。如:mSceneMgr-getRootSceneNode()-createChildSceneNode()-attachObject(lightParticle)3. 初始化ParticleSystemManager:addEmitterFactory() ParticleSystemManager:addAffectorFactory() ParticleSystemManager :addRendererFactory() ParticleSystemManager:createTemplate() ParticleSystem:setRenderer() ParticleSystemManager:_createRenderer() ParticleSystem:addEmitter() ParticleSystemManager:_createEmitter() ParticleSystem:addAffector() ParticleSystemManager:_createAffector()4. 每一帧,执行如下更新 ParticleSystem:_update() ParticleSystem:_triggerAffectors() Affector:_affectParticles() ParticleSystem :_triggerEmitters() Emitter:_initParticle() ParticleSystem:_updateRenderQueue() ParticleRenderer:_updateRenderQueue() 1. 实验结果打开烟花粒子系统以及A,B喷泉粒子系统打开A,B喷泉粒子系统以及光环粒子系统打开A,B喷泉粒子系统以及雨水粒子系统五、实验心得本次实验与上次的实验步骤比较一致,主要难点也是在于读懂代码,理解代码的具体含义。经过上几次的实验,对ogre有了一些了解,而且在以前学的direct x中也涉及到过相关内容,所以使得这次读代码的时候能稍微读懂一些,但由于对例子系统的不熟悉,对于一些函数还是不明白,只能先通过网络搜索ogre粒子系统的相关知识,了解与之相关的一些函数、参数及用法,使得能够大部分读懂本次实验的代码。通过本次实验,加深了对粒子系统的了解,粒子系统的基本单元是粒子,每个粒子一般具有形状、大小、颜色、透明度、位置、速度、加速度、方向、生命周期等属性,了解了粒子系统得组成以及执行流程。在没有学理论知识的情况下通过本次实验,提前学习了相关知识,提升了自身的自学能力,也为理论的学习打下了基础,更进一步加深了对ogre的熟悉。但此次实验也让我发现了自身很多的不足,后期还需更加努力的学习。六、主要代码ParticleFX.cpp#include SamplePlugin.h#include ParticleFX.husing namespace Ogre;using namespace OgreBites;#ifndef OGRE_STATIC_LIBSamplePlugin* sp;Sample* s;extern C _OgreSampleExport void dllStartPlugin()s = new Sample_ParticleFX;sp = OGRE_NEW SamplePlugin(s-getInfo()Title + Sample);sp-addSample(s);Root:getSingleton().installPlugin(sp);extern C _OgreSampleExport void dllStopPlugin()Root:getSingleton().uninstallPlugin(sp); OGRE_DELETE sp;delete s;#endifParticleFX.h#ifndef _ParticleFX_H_#define _ParticleFX_H_#include SdkSample.husing namespace Ogre;using namespace OgreBites;class _OgreSampleClassExport Sample_ParticleFX : public SdkSamplepublic:Sample_ParticleFX()mInfoTitle = Particle Effects;mInfoDescription = Demonstrates the creation and usage of particle effects.;mInfoThumbnail = thumb_particles.png;mInfoCategory = Effects;mInfoHelp = Use the checkboxes to toggle visibility of the individual particle systems.; bool frameRenderingQueued(const FrameEvent& evt) mFountainPivot-yaw(Degree(evt.timeSinceLastFrame * 30); / spin the fountains aroundreturn SdkSample:frameRenderingQueued(evt); / dont forget the parent class updates! void checkBoxToggled(CheckBox* box)/ show or hide the particle system with the same name as the check boxmSceneMgr-getParticleSystem(box-getName()-setVisible(box-isChecked();protected:void setupContent()/ setup some basic lighting for our scenemSceneMgr-setAmbientLight(ColourValue(0.3, 0.3, 0.3);mSceneMgr-createLight()-setPosition(20, 80, 50);/ set our camera to orbit around the origin and show cursormCameraMan-setStyle(CS_ORBIT);mCameraMan-setYawPitchDist(Degree(0), Degree(15), 250);mTrayMgr-showCursor();/ create an ogre head entity and place it at the origin Entity* ent = mSceneMgr-createEntity(Head, ogrehead.mesh); mSceneMgr-getRootSceneNode()-attachObject(ent);setupParticles(); / setup particlessetupTogglers(); / setup particle togglersvoid setupParticles()ParticleSystem:setDefaultNonVisibleUpdateTimeout(5); / set nonvisible timeoutParticleSystem* ps; / create some nice fireworks and place it at the origin ps = mSceneMgr-createParticleSystem(Fireworks, Examples/Fireworks);mSceneMgr-getRootSceneNode()-attachObject(ps); / create a green nimbus around the ogre head ps = mSceneMgr-createParticleSystem(Nimbus, Examples/GreenyNimbus);mSceneMgr-getRootSceneNode()-attachObject(ps); ps = mSceneMgr-createParticleSystem(Rain, Examples/Rain); / create a rainstorm ps-fastForward(5); / fast-forward the rain so it looks more natural mSceneMgr-getRootSceneNode()-createChildSceneNode(Vector3(0, 1000, 0)-attachObject(ps); / create aureola around ogre head perpendicular to the ground ps = mSceneMgr-createParticleSystem(Aureola, Examples/Aureola); mSceneMgr-getRootSceneNode()-attachObject(ps); / create shared pivot node for spinning the fountains mFountainPivot = mSceneMgr-getRootSceneNode()-createChildSceneNode(); ps = mSceneMgr-createParticleSystem(Fountain1, Examples/PurpleFountain); / create fountain 1 / attach the fountain to a child node of the pivot at a distance and anglemFountainPivot-createChildSceneNode(Vector3(200, -100, 0), Quaternion(Degree(20), Vector3:UNIT_Z)-attachObject(ps); ps = mSceneMgr-createParticleSystem(Fountain2, Examples/Pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年家庭清洁服务市场可行性研究报告及总结分析
- 2025年新能源汽车市场发展策略可行性研究报告及总结分析
- 2025年自驾游汽车租赁项目可行性研究报告及总结分析
- 2025年快速消费品物流配送优化可行性研究报告及总结分析
- 2025年智慧农业技术应用推广可行性研究报告及总结分析
- 2025年乡村振兴战略实施效果可行性研究报告及总结分析
- 北医院笔试题目及答案
- 公务员笔试题及答案图解
- 根管治疗显微镜护理术前准备配合细节
- 京考税务笔试题及答案
- 共济机房监控系统设备调试手册
- 2023年度科技研发部门工作总结
- 酒店与物业安全消防管理协议
- 2025年科技馆行业市场盈利模式与投资前景研究报告
- 2025年中翼航空投资有限公司招聘笔试参考题库含答案解析
- 环保行业污水处理厂自动化控制系统设计方案
- 2024年中国住院患者血糖管理专家共识
- 快递公司安全检查与事故隐患排查制度范文(2篇)
- 8.1 《荷花淀》课件 2024-2025学年统编高中语文选择性必修中册
- LED产品研发流程
- 仓库管理5S知识培训课件
评论
0/150
提交评论