+++++++++++++++++++++++++++++++++++++++++++++

+++++++++    轻松创建天龙八部的场景  ++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++

1.    从这里开始:

需要的资源:

天龙八部的资源:

一个动态库文件:EditableTerrainManager_d.lib

一个静态库文件:TinyXML.lib  这个是用来对类似XML的文件进行数据操作

相关的头文件:

下载路径:

创建一个控制台的项目TTLB.

编译成功后,会出出现黑色屏幕,则说明成功。

代码如下:

TutorialApp.h

#ifndef _TuorialApp_H #define _TuorialApp_H #include<exampleapplication.h> using namespace std; class TutorialApp : public ExampleApplication { protected: public: TutorialApp(); ~TutorialApp(); protected: void chooseSceneManager(void); void createScene(void); }; #endif

TutorialApp.cpp

#include "TutorialApp.h" TutorialApp::TutorialApp() { } TutorialApp::~TutorialApp() { } void TutorialApp::chooseSceneManager(void) { mSceneMgr = mRoot->createSceneManager("OctreeSceneManager", "ETInstance"); void TutorialApp::createScene(void) { }

Main.cpp

#include "windows.h" #include "TutorialApp.h" #include <OgreException.h> int main(int argc, char **argv) { // Create application object TutorialApp app; try { app.go(); } catch( Ogre::Exception& e ) { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 MessageBoxA( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); #else std::cerr << "An exception has occured: " << e.getFullDescription().c_str() << std::endl; #endif } return 0; }

2.    载入场景模型:

首先需要修改资源的路径:

参考网站:http://apps.hi.baidu.com/share/detail/6166638

我在void TutorialApp::createScene(void) 程序中直接用了下面的来设置路径。

(我把资源路径设为,Debug中.exe所在目录(即工作目录)的前两级目录中的一个名叫media2的文件夹,然后是里面的TTLB,再里面的……..

// 支持中文路径,这个一定要加,不然会报错

setlocale( LC_CTYPE, "" );

//增加资源路径   E:/TLBB/天龙八部场景Demo/TTLBSceneDemo/media/TTLB/brush

Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../../media2/TTLB/model","FileSystem","test");

Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../../media2/TTLB/brush","FileSystem","test");

代码:

TutorialApp.h

#ifndef _TuorialApp_H #define _TuorialApp_H #include<exampleapplication.h> #include <Windows.h> #include <tchar.h> #include "tinyxml.h" #include "tinystr.h" #include<iostream> using namespace std; class TutorialApp : public ExampleApplication { protected: public: TutorialApp(); ~TutorialApp(); void chooseSceneManager(void); void createScene(void); void createTLBBSence( const char* sceneName); ///下面是用到的字符转换工具 static bool IsStrEqual( const char* str1, const char* str2 ) { return ( strcmp( str1, str2) == 0 )?true:false; } char * UnicodeToANSI( const wchar_t* str ) { char* result; int textlen; textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL ); result =(char *)malloc((textlen+1)*sizeof(char)); memset( result, 0, sizeof(char) * ( textlen + 1 ) ); WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL ); return result; } wchar_t * UTF8ToUnicode( const char* str ) { int textlen ; wchar_t * result; textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 ); result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t)); memset(result,0,(textlen+1)*sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen ); return result; } char* UTF8ToANSI(const char* str) { wchar_t* temp = UTF8ToUnicode(str); char* res = UnicodeToANSI(temp); delete []temp; return res; } protected: }; #endif

 

TutorialApp.cpp

#include "TutorialApp.h" TutorialApp::TutorialApp() { } TutorialApp::~TutorialApp() { } void TutorialApp::chooseSceneManager(void) { mSceneMgr = mRoot->createSceneManager("OctreeSceneManager", "ETInstance"); //ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); } void TutorialApp::createScene(void) { // 支持中文路径,这个一定要加,不然会报错 setlocale( LC_CTYPE, "" ); //增加资源路径 E:/TLBB/天龙八部场景Demo/TTLBSceneDemo/media/TTLB/brush Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../../media2/TTLB/model","FileSystem","test"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../../media2/TTLB/brush","FileSystem","test"); createTLBBSence( "../../media2/TTLB/scene/shaolin.Scene"); } void TutorialApp::createTLBBSence( const char* sceneName) { TiXmlDocument sceneDoc; bool bLoadSuccess = sceneDoc.LoadFile( sceneName ); //载入文件失败的提示 if( !bLoadSuccess ) { OGRE_EXCEPT(Exception::ERR_INVALID_STATE, "load scene file failed", ""); return; } const char* strTemp; const char* sValue; // Scene TiXmlElement* root = sceneDoc.FirstChildElement(); // terrain TiXmlElement* element = root->FirstChildElement( "Terrain" ); strTemp = element->Attribute("filename"); // <Terrain filename="shaolin.Terrain"/> // load the terrain and insert into scene. // ETM::TerrainManager will do the insertion while( 1 ) { element = element->NextSiblingElement();// <Object name="#FairyEnviroment" type="Enviroment"> strTemp = element->Attribute( "type" ); //Enviroment if( IsStrEqual( strTemp, "StaticEntity" ) ) //当遇到第一个 <Object type="StaticEntity">就跳出该循环 break; TiXmlElement* propriety = element->FirstChildElement( "Property" ); // //设置灯光 if( IsStrEqual( strTemp, "Light" ) ) //type="Light" { const char* lightName = element->Attribute( "name"); // <Object name="#FairyMainLightOne" type="Light"> Ogre::Light* pLight = mSceneMgr->createLight( lightName ); Ogre::SceneNode* pLightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( lightName ); // add light to scene float r,g,b,x,y,z; while( propriety ) { strTemp = propriety->Attribute( "name" ); // <Property name="type" value="directional"/> sValue = propriety->Attribute( "value" ); if( IsStrEqual( "type", strTemp ) ) { //设置灯光的类型 if( IsStrEqual( sValue, "directional") ) pLight->setType( Ogre::Light::LT_DIRECTIONAL ); else if( IsStrEqual( sValue, "point") ) pLight->setType( Ogre::Light::LT_POINT ) ; else if( IsStrEqual( sValue, "spotlight") ) pLight->setType( Ogre::Light::LT_SPOTLIGHT ); else assert( 0 ); //error } else if( IsStrEqual("diffuse", strTemp ) ) { //设置此渲染通路中漫反射系数 数值的取值范围在0.0到1.0之间。 sscanf( sValue, "%f %f %f", &r,&g,&b ); pLight->setDiffuseColour( r,g,b ); } else if( IsStrEqual( "specular", strTemp ) ) { //设置此渲染通路中镜面反射颜色的反射系数 数值的取值范围在0.0到1.0之间 sscanf( sValue, "%f %f %f", &r,&g,&b ); pLight->setSpecularColour( r,g,b ); } else if( IsStrEqual( "position", strTemp ) ) { //设置光源的位置 sscanf( sValue, "%f %f %f", &x, &y, &z ); pLight->setPosition( x,y,z ); } else if( IsStrEqual( "direction", strTemp ) ) { //设置光源的方向 sscanf( sValue, "%f %f %f", &x,&y,&z ); pLight->setDirection( x,y,z ); } else if( IsStrEqual( "cast shadows", strTemp ) ) { //设置是否投影 if( IsStrEqual( sValue, "true" ) ){ pLight->setCastShadows( true ); } else pLight->setCastShadows( false ); } else assert(0); propriety = propriety->NextSiblingElement(); } //pLightNode->attachObject( pLight ); //pLight->setVisible( false ); }//设置环境 else if( IsStrEqual( strTemp, "Enviroment" ) ) { // add fog to scene Ogre::ColourValue ambient; Ogre::ColourValue color; Ogre::FogMode mode; int linerstart =0,linerend=0; while( propriety ) { strTemp = propriety->Attribute( "name" ); sValue = propriety->Attribute( "value" ); //设置此渲染通路中周围环境的反射系数,数值的取值范围在0.0到1.0之间 if( IsStrEqual( "ambient", strTemp ) ) { sscanf( sValue, "%f %f %f", &ambient.r,&ambient.g,&ambient.b ); }//设置是否雾化模式 else if( IsStrEqual( "fog.mode", strTemp ) ) { //设置雾的类型,此中是线性雾 if( IsStrEqual( sValue, "linear") ) mode = FOG_LINEAR; else if( IsStrEqual( sValue, "exp") ) mode = FOG_EXP; else if( IsStrEqual( sValue, "exp2" ) ) mode = FOG_EXP2; else mode = FOG_NONE; } else if( IsStrEqual( "fog.colour", strTemp ) ) { //设置雾的颜色 sscanf( sValue, "%f %f %f", &color.r, &color.g, &color.b ); } //雾这浓范围的起点 else if( IsStrEqual("fog.linear start", strTemp )) { linerstart = _ttoi( sValue ); } //雾变浓范围的终点 else if( IsStrEqual("fog.linear end", strTemp ) ) { linerend = _ttoi( sValue ); } else assert(0); if (propriety) { propriety = propriety->NextSiblingElement(); } } // mSceneMgr->setAmbientLight( ambient ) ; //设置雾 mSceneMgr->setFog( mode, color, 0.001, linerstart, linerend ); } //设置天空盒 else if( IsStrEqual( strTemp, "SkyDome" ) ) { // add skydome while( propriety ) { strTemp = propriety->Attribute( "name" ); sValue = propriety->Attribute( "value" ); if( IsStrEqual( "material", strTemp ) ) { //mSceneMgr->setSkyDome( true, sValue ); } else {assert( 0 ); } propriety = propriety->NextSiblingElement(); } } else{ assert(0); // error! } } //设置场景中静态的实体 static int StaticEntityIndex = 0; while( element ) { strTemp = element->Attribute( "type" ); { if( IsStrEqual( "StaticEntity", strTemp ) ) //静态实体 { SceneNode* pSsceneNode = NULL; Entity* pEntity = NULL; float w,x,y,z; TiXmlElement* propriety = element->FirstChildElement( "Property" ); std::cout<<"实体个数: "<<StaticEntityIndex<<std::endl; while( propriety &&StaticEntityIndex<1800) { strTemp = propriety->Attribute( "name" ); sValue = propriety->Attribute( "value" ); if( IsStrEqual("mesh name", strTemp ) ) { sValue = UTF8ToANSI(sValue); pSsceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( sValue + StringConverter::toString( StaticEntityIndex++ ) ); pEntity = mSceneMgr->createEntity( sValue + StringConverter::toString( StaticEntityIndex++ ), sValue ); pSsceneNode->attachObject( pEntity ); delete []sValue; } else if( IsStrEqual( "position", strTemp ) ) { sscanf( sValue, "%f %f %f", &x, &y, &z ); pSsceneNode->setPosition( x, y, z ); } else if( IsStrEqual( "orientation", strTemp ) ) { sscanf( sValue, "%f %f %f %f", &w, &x, &y, &z ); pSsceneNode->setOrientation( w,x,y,z ); } else if( IsStrEqual( "scale", strTemp ) ) { sscanf( sValue, "%f %f %f", &x, &y, &z ); pSsceneNode->setScale( x,y,z ); } else if( IsStrEqual( "receive shadows", strTemp ) ) { } else if( IsStrEqual( "receive decals", strTemp ) ) { } else assert(0); if (propriety) { propriety = propriety->NextSiblingElement(); } if (!propriety) { break; } // insert the static entity into the scene } } else if( IsStrEqual( "Model", strTemp ) ) { } else if( IsStrEqual( "ParticleSystem", strTemp ) ) { } else if( IsStrEqual( "TerrainLiquid", strTemp ) ) { } else if( IsStrEqual( "Effect", strTemp ) ) { } else assert(0); } if (element) { element = element->NextSiblingElement(); } if (!element) { return; } } }

 

[注:]但这里面需要设置为多使用多字节字符集,且必须加上静态库TinyXML.lib并设置好相应的路径,还有相应的头文件路径。

结果:

     出现了少林寺的场景模型,没有地图纹理等。

轻松创建天龙八部的场景相关推荐

  1. iSpring Suite+PowerPoint,轻松创建小游戏!

    拥有25年教学经验的电子学习开发人员兼HiMark Solutions的高级顾问Mark Simon,分享了他关于如何使用PPT工具将电子学习内容进行游戏化的想法.这是他的演讲摘要. 在他的网络研讨会 ...

  2. Blender创建三维教室场景学习教程 3D Classroom Environment Creation in Blender

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.73 GB 含课程文件 |时长:4h ...

  3. 工作流程怎么安排?用Edraw Max轻松创建工作流程图!

    思维导图软件推荐: MindManager XMind:ZEN TheBrain Edraw Max(亿图图示)是一款综合图形图表制作软件,它包含丰富的实例和模版,帮助您轻松创建流程图.网络拓扑图.组 ...

  4. 盘启动盘_[装机]推荐唯二的两个开源免费的启动盘工具,轻松创建USB启动盘

    不卖关子: ventoy 和 rufus. 官网等: ventoy github​github.comventoy官网 新一代启多系统启动u盘解决方案​www.ventoy.netrufus 轻松创建 ...

  5. 轻松创建Silverlight 4开发环境

    在银光中国网有一篇"轻松创建Silverlight开发环境"文章,相信帮助了不少Silverlight新手,不过该文章介绍的是Silverlight 3开发环境,本篇将基于上文进行 ...

  6. EasyStruct.js轻松创建可填入式html模板结构

    友情提醒:由于旧版本的EasyStruct有一些bug,现在已经全部修复,而且增加了一份详细的demo,如果想要使用的话可以直接下载demo去看了,下面这篇介绍可以跳过了. 友情链接:http://d ...

  7. yeoman_使用yeoman轻松创建Yeoman生成器

    yeoman by Krist Wongsuphasawat 克里斯特·旺苏帕萨瓦(Krist Wongsuphasawat) 使用yeoman轻松创建Yeoman生成器 (Creating Yeom ...

  8. Bootstrap Magic – 轻松创建自己的 Bootstrap 主题

    Bootstrap Magic 是一款基于 Bootstrap 和 AngularJS 的主题创建工具.您可以轻松地创建您自己的 Twitter Bootstrap 主题,可以立即看到你的内容变化.您 ...

  9. redux引用多个中间件_如何轻松创建您的第一个Redux中间件

    redux引用多个中间件 by Gabriele Cimato 加布里埃莱·西马托(Gabriele Cimato) 如何轻松创建您的第一个Redux中间件 (How to create your f ...

最新文章

  1. html css百分比效果,css百分比不起作用是什么原因?
  2. XML配置文件的命名空间与Spring配置文件中的头
  3. 8.2 matlab曲线对象和曲面对象(曲线对象、曲面对象、光照处理、图形对象的反射特性)
  4. 20161104面试题-面试常问问题
  5. 【面试招聘】去不了大厂实习,小厂实习去吗?
  6. JAVA数据结构与算法【队列、数组模拟(环形)队列】
  7. POJ 1287 Prim算法模板
  8. php获得指定目录文件,PHP遍历指定文件夹获取路径及大小(包含子文件夹)
  9. 面试中如何做一个好的自我介绍?
  10. 男女薪酬差异扩大 2018年女性薪酬不及男性8成?
  11. 使用zabbix监控MongoDB
  12. 小程序uniapp基础
  13. 给小米手机安装google框架
  14. vue开发pc端支付方式(支付宝、微信、银联)
  15. 美团加载Dialog(小人奔跑)
  16. 计算机可以关闭家庭组,win10系统禁用(关闭)家庭组功能的具体方法
  17. 三维实景拍摄虚拟现实!- Panorama
  18. Jekins配置Publish over SSH详解
  19. 实验三LED计数静动态显示(附代码和电路图)
  20. HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS+JavaScript 景点静态网页设计 学生DW静态网页设计...

热门文章

  1. win11(amd)+cuda+cudnn+pytorch安装过程
  2. 怎么将图片压缩到50k以内?教你一招将图片缩小的方法
  3. 设计低反射率触摸屏显示器以实现阳光下的可读性
  4. 差旅安全,你了解多少?
  5. 锁相环环路滤波器计算公式_锁相环计算方法.doc
  6. 凸包问题的GRAHAM-SCAN解法(附C++代码)
  7. no transaction is in progresss
  8. 如何自动识别视频语音内容并生成字幕
  9. (论文解读)High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks
  10. 图片查看器插件(带缩略图) - viewer.js