




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OGRE周边版块 OGRE本身作为图形引擎是非常强大的,但是如果要想只用它来做游戏还是不够的,我们必须有声音,界面,物理,输入,人工智能等等。很幸运OGRE现在有着庞大的社群支持(OGRE中文GAMERES是中文网站中人最多的),在几乎各个可能需要的领域都有许多优秀人才做着基础的工作,而且绝大多数是免费或者近乎免费的提供使用。在这么多前人的努力只下,使用OGRE做游戏|虚拟现实已经变的容易的多了。1、 声音在OGRE添加声音有很多选择,比如:DXSOUND、DXMUSIC、FMOD、OPENAL、AUDIERE等等,这完全看个人爱好以及对这些SDK的熟悉程度来选择了。DXSOUND、DXMUSIC都是DIRECTX组件,会使用的人也很多,很容易能找到相关的书籍,所以我主要介绍后面几个声音引擎在OGRE中的使用。1.1 FMOD The FMOD Ex声音系统是一个针对多种音频开发人员的解决方案,包括游戏开发人员、多媒体开发者、声音设计师、甚至是音乐家、音频引擎的开发者,它是基于Firelight多年在声音引擎开发方面的经验研发而成。官方网站:,提供FMOD的免费下载,当然如果商用的话还是要购买使用权,不过价格还是很便宜的,100美元。现在有很多游戏公司已经选择它作为自己声音库,搜狐的天龙八部,还有暴雪公司也放弃了自己原来做的声音库并购买了FMOD的使用权等等就不多说了。FMOD支持几乎所有的声音格式:.MOD, .S3M, .XM, .IT or .MID而且可以运行在windows,winCE,Linux,GameCube Xbox等平台上。下面介绍简要FMOD的使用的方法首先下载API(OGRE的API、FMOD的API)并且安装配置环境,需要注意的是使用不同的IDE需要舔加不同的LIB文件:fmodvc.lib 用于 Microsoft Visual C+ 和 Codewarrior fmodbc.lib 用于 Borland fmodwc.lib 用于 Watcom fmodcc.lib 用于 LCC-Win32 libfmod.a 用于 MingW and CygWin fmod-3-7.lib 用于 GCC 以Microsoft Visual C+2005为例,舔加fmodvc.lib,然后加如入fmod.hpp头文件后就可以使用了以Demo_ParticleFX这个例子为原型,向其中加FMOD代码实现简单的声音效果。Demo_ParticleFX原代码如下:(头文件#include ExampleApplication.h/*加入必要的头文件*/#include ././api/inc/fmod.hpp /*#include ././api/inc/fmod_errors.h/*#include /*#include /*#include /*/*定义初始化常用的参数*/FMOD:System *system = 0; /*/FMO系统,也算是最根本的部分 FMOD:Sound *sound = 0; /*/声音,和一个声音文件关联,比如*.waveFMOD:Channel *channel = 0; /*/声道 FMOD_RESULT result; /*/结果,主要是根据函数返回的结果,做出相应的处理。 unsigned int version; /* /版本/ Event handler to add ability to alter curvatureclass ParticleFrameListener : public ExampleFrameListenerprotected: SceneNode* mFountainNode;public: ParticleFrameListener(RenderWindow* win, Camera* cam, SceneNode* fountainNode) : ExampleFrameListener(win, cam) mFountainNode = fountainNode; bool frameStarted(const FrameEvent& evt) if( ExampleFrameListener:frameStarted(evt) = false ) return false; / Rotate fountains mFountainNode-yaw(Degree(evt.timeSinceLastFrame * 30); / Call default return true; ;class ParticleApplication : public ExampleApplicationpublic: ParticleApplication() protected: SceneNode* mFountainNode; / Just override the mandatory create scene method void createScene(void) / Set ambient light mSceneMgr-setAmbientLight(ColourValue(0.5, 0.5, 0.5); Entity *ent = mSceneMgr-createEntity(head, ogrehead.mesh); / Add entity to the root scene node mSceneMgr-getRootSceneNode()-createChildSceneNode()-attachObject(ent); / Green nimbus around Ogre /mSceneMgr-getRootSceneNode()-createChildSceneNode()-attachObject( / mSceneMgr-createParticleSystem(Nimbus, Examples/GreenyNimbus); / Create some nice fireworks mSceneMgr-getRootSceneNode()-createChildSceneNode()-attachObject( mSceneMgr-createParticleSystem(Fireworks, Examples/Fireworks); / Create shared node for 2 fountains mFountainNode = mSceneMgr-getRootSceneNode()-createChildSceneNode(); / fountain 1 ParticleSystem* pSys2 = mSceneMgr-createParticleSystem(fountain1, Examples/PurpleFountain); / Point the fountain at an angle SceneNode* fNode = mFountainNode-createChildSceneNode(); fNode-translate(200,-100,0); fNode-rotate(Vector3:UNIT_Z, Degree(20); fNode-attachObject(pSys2); / fountain 2 ParticleSystem* pSys3 = mSceneMgr-createParticleSystem(fountain2, Examples/PurpleFountain); / Point the fountain at an angle fNode = mFountainNode-createChildSceneNode(); fNode-translate(-200,-100,0); fNode-rotate(Vector3:UNIT_Z, Degree(-20); fNode-attachObject(pSys3); / Create a rainstorm ParticleSystem* pSys4 = mSceneMgr-createParticleSystem(rain, Examples/Rain); SceneNode* rNode = mSceneMgr-getRootSceneNode()-createChildSceneNode(); rNode-translate(0,1000,0); rNode-attachObject(pSys4); / Fast-forward the rain so it looks more natural pSys4-fastForward(5); / Aureola around Ogre perpendicular to the ground ParticleSystem* pSys5 = mSceneMgr-createParticleSystem(Aureola, Examples/Aureola); mSceneMgr-getRootSceneNode()-createChildSceneNode()-attachObject(pSys5);/ Set nonvisible timeoutParticleSystem:setDefaultNonVisibleUpdateTimeout(5);/*下面是FMOD的使用部分*/result = FMOD:System_Create(&system);/创建系统 if (result != FMOD_OK) /在这里也可以使用LOG文件输出错误内容以便出错时确定出错位置。下面可能出错的地方也可以这样做。 exit(-1); /处理返回的结果result = system-getVersion(&version);/创建版本 if (result != FMOD_OK) exit(-1); /处理返回的结果 if (version init(32, FMOD_INIT_NORMAL, 0);/系统初始化,参数分别代表最大声道数,播放的FLAG,额外的设备数据 if (result != FMOD_OK) exit(-1); result = system-createSound(./media/playlist.m3u, FMOD_DEFAULT, 0, &playlist);/创建声音,参数分别代表声音文件(其实是声音的绝对路径),模式,额外信息,声音(以备后用) if (result != FMOD_OK) exit(-1); result = sound-setMode(FMOD_LOOP_NORMAL);/设置声音模式,这里是普通循环。 if (result != FMOD_OK) exit(-1); result = system-playSound(FMOD_CHANNEL_FREE, sound, false, &channel);/播放声音,当然也可以放在其他你认为合适的地方播放 if (result != FMOD_OK) exit(-1); /*FMOD部分至此*/ / Create new frame listener void createFrameListener(void) mFrameListener= new ParticleFrameListener(mWindow, mCamera, mFountainNode); mRoot-addFrameListener(mFrameListener); ;源文件:#include ParticleFX.h#if OGRE_PLATFORM = OGRE_PLATFORM_WIN32#define WIN32_LEAN_AND_MEAN#include windows.h#endif#ifdef _cplusplusextern C #endif#if OGRE_PLATFORM = OGRE_PLATFORM_WIN32INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )#elseint main(int argc, char *argv)#endif / Create application object ParticleApplication app; try app.go(); catch( Ogre:Exception& e ) #if OGRE_PLATFORM = OGRE_PLATFORM_WIN32 MessageBox( NULL, e.getFullDescription().c_str(), An exception has occured!, MB_OK | MB_ICONERROR | MB_TASKMODAL);#else std:cerr An exception has occured: release(); if (result != FMOD_OK) exit(-1); result = system-close(); if (result != FMOD_OK) exit(-1); result = system-release(); if (result != FMOD_OK) exit(-1); 1.2 Audiere使用Audiere是个轻量级的声音引擎,功能虽然没FMOD那么强大,但是简单、易用。可以到/projects/audiere/下载。其实OGRE的DEMO中有个是使用了audiere的(Magic of Stonehenge demo ),虽然从代码来看并没有很复杂的技术,但是作者巧妙的构思、完美的搭配以及使用audiere实现的声音给人一种很震撼的艺术效果。下面分析这个DEMO是如何使用AUDIERE的。原代码如下:/*Magic of Stonehenge demo v1.0Programming: Arsen Gnatkivsky Troglodite-mail: troglinbox.ruused engines:OGRE : audiere : /*/#include ExampleApplication.h#include /添加头文件,别忘了自己链接audiere.libParticleSystem *pThrusters;AnimationState* mAnimState;SceneNode* camNode;Overlay* mBlackOverlay;audiere:AudioDevicePtr device(audiere:OpenDevice();/设备audiere:OutputStreamPtr stream(audiere:OpenSound(device, music.wav, false);/输出流,和声音文件相关联。参数分别为设备,声音文件,是否是流文件std:ofstream posLog(position.log);class SkyBoxFrameListener : public ExampleFrameListenerprivate:static float fDefDim;static float fDefVel;public:SkyBoxFrameListener(RenderWindow* win, Camera* cam) : ExampleFrameListener( win, cam )showDebugOverlay(false);bool frameStarted( const FrameEvent& evt )mAnimState-addTime(evt.timeSinceLastFrame);bool bOK = ExampleFrameListener:frameStarted( evt );static Real tim=0;tim+=evt.timeSinceLastEvent;static bool nothold=true;/ This peace op code you need when you capture the camera motion/ it will generate c+ code for keyframes in separate file/*if( mInputDevice-isKeyDown( KC_SPACE ) )if (nothold=true)nothold=false;mWindow-setDebugText(!);Quaternion ori=mCamera-getOrientation();Vector3 pos=mCamera-getPosition();posLog createKeyFrame(animDelay*tim+timOffset);n;posLog setTranslate(Vector3( pos.x , pos.y , pos.z );n;posLog setRotation(Quaternion( ori.w , ori.x , ori.y , ori.z );n; else nothold=true;*/static int nohide=3;static bool isTest=true;if (isTest)if (nohidehide();isTest=false;else nohide-;return bOK;float SkyBoxFrameListener:fDefDim = 25.0f;float SkyBoxFrameListener:fDefVel = 50.0f;class SkyBoxApplication : public ExampleApplicationpublic:SkyBoxApplication() protected:virtual void createFrameListener(void)mFrameListener= new SkyBoxFrameListener(mWindow, mCamera);mRoot-addFrameListener(mFrameListener);/ Just override the mandatory create scene methodvoid createScene(void)stream-setRepeat(true);/设置流是否循环播放stream-setVolume(0.5f); / 声音大小stream-play();/播放/ Set ambient lightmSceneMgr-setAmbientLight(ColourValue(0.5, 0.5, 0.5);/ Create a lightLight* l = mSceneMgr-createLight(MainLight);l-setPosition(20,80,50);/-Entity *ground = mSceneMgr-createEntity( ground, Plane01.mesh );Entity *s1 = mSceneMgr-createEntity( s1, s1.mesh );Entity *s2 = mSceneMgr-createEntity( s2, s2.mesh );Entity *s3 = mSceneMgr-createEntity( s3, s3.mesh );Entity *s4 = mSceneMgr-createEntity( s4, s4.mesh );Entity *s5 = mSceneMgr-createEntity( s5, s5.mesh );Entity *s6 = mSceneMgr-createEntity( s6, s6.mesh );Entity *s7 = mSceneMgr-createEntity( s7, s7.mesh );Entity *s8 = mSceneMgr-createEntity( s8, s8.mesh );Entity *s9 = mSceneMgr-createEntity( s9, s9.mesh );Entity *s10 = mSceneMgr-createEntity( s10, s10.mesh );Entity *s11 = mSceneMgr-createEntity( s11, s11.mesh );Entity *s12 = mSceneMgr-createEntity( s12, s12.mesh );Entity *s13 = mSceneMgr-createEntity( s13, s13.mesh );Entity *s14 = mSceneMgr-createEntity( s14, s14.mesh );Entity *s15 = mSceneMgr-createEntity( s15, s15.mesh );mSceneMgr-getRootSceneNode()-attachObject(ground);mSceneMgr-getRootSceneNode()-attachObject(s1);mSceneMgr-getRootSceneNode()-attachObject(s2);mSceneMgr-getRootSceneNode()-attachObject(s3);mSceneMgr-getRootSceneNode()-attachObject(s4);mSceneMgr-getRootSceneNode()-attachObject(s5);mSceneMgr-getRootSceneNode()-attachObject(s6);mSceneMgr-getRootSceneNode()-attachObject(s7);mSceneMgr-getRootSceneNode()-attachObject(s8);mSceneMgr-getRootSceneNode()-attachObject(s9);mSceneMgr-getRootSceneNode()-attachObject(s10);mSceneMgr-getRootSceneNode()-attachObject(s11);mSceneMgr-getRootSceneNode()-attachObject(s12);mSceneMgr-getRootSceneNode()-attachObject(s13);mSceneMgr-getRootSceneNode()-attachObject(s14);mSceneMgr-getRootSceneNode()-attachObject(s15);Entity *cast1 = mSceneMgr-createEntity( cast1, cast1.mesh );mSceneMgr-getRootSceneNode()-attachObject(cast1);Entity *pilon = mSceneMgr-createEntity( pilon, pilon.mesh );mSceneMgr-getRootSceneNode()-attachObject(pilon);ParticleSystem* pSys2 = ParticleSystemManager:getSingleton().createSystem(fountain1, PEExamples/stoneh2);mSceneMgr-getRootSceneNode()-attachObject(pSys2);ParticleSystem* pSys3 = ParticleSystemManager:getSingleton().createSystem(fountain2, PEExamples/stoneh2_small);ParticleSystem* pSys4 = ParticleSystemManager:getSingleton().createSystem(fountain3, PEExamples/stoneh2_small);ParticleSystem* pSys5 = ParticleSystemManager:getSingleton().createSystem(fountain4, PEExamples/stoneh2_small);SceneNode* spout_node1=mSceneMgr-getRootSceneNode()-createChildSceneNode();SceneNode* spout_node2=mSceneMgr-getRootSceneNode()-createChildSceneNode();SceneNode* spout_node3=mSceneMgr-getRootSceneNode()-createChildSceneNode();spout_node1-attachObject(pSys3);spout_node2-attachObject(pSys4);spout_node3-attachObject(pSys5);Real max2ogre=0.025;Vector3 triSpoutPos1=Vector3(-0.084/max2ogre,0.354/max2ogre,-7.047/max2ogre);Vector3 triSpoutPos2=Vector3(5.872/max2ogre,0.354/max2ogre,3.461/max2ogre);Vector3 triSpoutPos3=Vector3(-5.787/max2ogre,0.354/max2ogre,3.351/max2ogre);spout_node1-setPosition(triSpoutPos1);spout_node2-setPosition(triSpoutPos2);spout_node3-setPosition(triSpoutPos3);Entity *cast3 = mSceneMgr-createEntity( cast3, cast1.mesh );SceneNode* cast3_node=mSceneMgr-getRootSceneNode()-createChildSceneNode();cast3_node-attachObject(cast3);cast3_node-setScale(5,1,5);cast3_node-setPosition(0,100,0);cast3-setMaterialName(cast3);Entity *cast4 = mSceneMgr-createEntity( cast4, cast1.mesh );SceneNode* cast4_node=mSceneMgr-getRootSceneNode()-createChildSceneNode();cast4_node-attachObject(cast4);cast4_node-setScale(2,1,2);cast4_node-setPosition(0,200,0);cast4-setMaterialName(cast4);Entity *castTri1 = mSceneMgr-createEntity( castTri1, cast1.mesh );SceneNode* castTriNode1=mSceneMgr-getRootSceneNode()-createChildSceneNode();castTriNode1-attachObject(castTri1);castTriNode1-setScale(0.5,0.1,0.5);castTriNode1-setPosition(triSpoutPos1-Vector3(0,-10,0);castTri1-setMaterialName(castTri);Entity *castSun2 = mSceneMgr-createEntity( castSun2, cast1.mesh );SceneNode* castSunNode2=mSceneMgr-getRootSceneNode()-createChildSceneNode();castSunNode2-attachObject(castSun2);castSunNode2-setScale(1.5,0.1,1.5);/castSunNode1-setPosition(triSpoutPos1-Vector3(0,-10,0);castSunNode2-setPosition(0,10,0);castSun2-setMaterialName(castsun1);for (int sc=1;sccreateEntity( castSun1+StringConverter:toString(sc), cast1.mesh );SceneNode* castSunNode1=mSceneMgr-getRootSceneNode()-createChildSceneNode();castSunNode1-attachObject(castSun1);castSunNode1-setScale(2.5-sc*0.05,0.1,2.5-sc*0.05);/castSunNode1-setPosition(triSpoutPos1-Vector3(0,-10,0);castSunNode1-setPosition(0,40+sc*10,0);castSunNode1-yaw(Radian(0.5);castSunNode1-pitch(Radian(rand()%5);castSunNode1-roll(Radian(rand()%5);castSun1-setMaterialName(castsun);Entity *castTri2 = mSceneMgr-createEntity( castTri2, cast1.mesh );SceneNode* castTriNode2=mSceneMgr-getRootSceneNode()-createChildSceneNode();castTriNode2-attachObject(castTri2);castTriNode2-setScale(0.5,0.1,0.5);castTriNode2-setPosition(triSpoutPos2-Vector3(0,-10,0);castTriNode2-yaw(Radian(-90.0);castTri2-setMaterialName(castTri);Entity *castTri3 = mSceneMgr-createEntity( castTri3, cast1.mesh );SceneNode* castTriNode3=mSceneMgr-getRootSceneNode()-createChildSceneNode();castTriNode3-attachObject(castTri3);castTriNode3-setScale(0.5,0.1,0.5);castTriNode3-setPosition(triSpoutPos3-Vector3(0,-10,0);castTriNode3-yaw(Radian(90.0);castTri3-setMaterialName(castTri);Entity *gorizont = mSceneMgr-createEntity( gorizont, gorizont.mesh );mSceneMgr-getRootSceneNode()-attachObject(gorizont);Entity *barier = mSceneMgr-createEntity( barier, barier.mesh );mSceneMgr-getRootSceneNode()-attachObject(barier);/-SceneNode* lookNode= mSceneMgr-getRootSceneNode()-createChildSceneNode();lookNode-setPosition(0,200,0);camNode = mSceneMgr-getRootSceneNode()-createChildSceneNode();camNode-attachObject(mCamera);mCamera-setPosition(0,0,0);camNode-setPosition(-244.852,392.682,-357.77);camNode-setOrientation(Quaternion(0.345054,-0.0821347,0.909552,0.216516);camNode-needUpdate();/ set up spline animation of nodeAnimation* anim = mSceneMgr-createAnimation(CameraTrack,319.382-28.307);/ 319.382-28.5128/ Spline it for nice curvesanim-setInterpolationMode(Animation:IM_SPLINE);/anim-setInterpolationMode(Animation:IM_LINEAR);/ Create a track to animate the cameras nodeAnimationTrack* track = anim-createTrack(0, camNode);/ Setup keyframesKeyFrame* key;key = track-createKeyFrame(0); / startpositionunsigned fr=0;Real animDelay=1;Real timOffset=-28.8307*animDelay;key = track-createKeyFrame(animDelay*28.8307+timOffset);key-setTranslate(Vector3(-244.852,392.682,-357.77);key-setRotation(Quaternion(0.345054,-0.0821347,0.909552,0.21
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 田园浪漫写生活动方案
- 眼镜医院活动方案
- 策划毕业活动方案
- 电厂争先活动方案
- 电瓶车前叉活动方案
- 美容美甲店十一活动方案
- 策划成人礼公司策划方案
- 电商公司客服活动方案
- 电脑相关活动方案
- 福州徒步活动方案
- T/CECS 10348-2023一体化净水设备
- 骨科与麻醉科加速康复围手术期患者血液管理共识
- 打造卓越电信网络-优化技术引领业务增长
- 《医疗机构工作人员廉洁从业九项准则》解读
- 设备维护保养与维修操作手册
- 《支架外固定的护理》课件
- 建钢结构库房合同协议
- 2024-2030全球智能牙科诊所系统行业调研及趋势分析报告
- 通信系统建模与仿真(基于MWORKS) 课件 第2章 MWORKS 科学计算与系统建模仿真基础
- 热水承包合同协议
- 大数据治理与服务平台建设及数据服务运营实施技术方案
评论
0/150
提交评论