ogre sample分析(一)

来源:互联网 发布:晨光文具淘宝店 编辑:程序博客网 时间:2024/05/09 03:15

ogre自带了一些例子,逐个过一遍并自己动手做一些调整

 

1 Sample_BezierPatch:这个例子直接用数值来构造顶点缓存并创建entity,这种方法一般只能创建简单对象,本人以为复杂对象顶点位置与纹理的数据除非是可以通过什么插件或者用max script等程序方式来创建并导出。

核心代码如下,不做过多分析:

PatchVertex verts[9] =
  {
   {-50, -35, -50, -0.5, 0.5, 0.0, 0.0, 0.0},
   {  0,   0, -50,  0.0, 0.5, 0.0, 0.5, 0.0},
   { 50,  35, -50,  0.5, 0.5, 0.0, 1.0, 0.0},
   {-50,   0,   0, -0.5, 0.5, 0.0, 0.0, 0.5},
   {  0,   0,   0,  0.0, 0.5, 0.0, 0.5, 0.5},
   { 50,   0,   0,  0.5, 0.5, 0.0, 1.0, 0.5},
   {-50,  35,  50, -0.5, 0.5, 0.0, 0.0, 1.0},
   {  0,   0,  50,  0.0, 0.5, 0.0, 0.5, 1.0},
   { 50, -35,  50,  0.5, 0.5, 0.0, 1.0, 1.0}
  };//数据

  mDecl = HardwareBufferManager::getSingleton().createVertexDeclaration();
        mDecl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
        mDecl->addElement(0, sizeof(float) * 3, VET_FLOAT3, VES_NORMAL);
        mDecl->addElement(0, sizeof(float) * 6, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0);

//创建顶点格式

  mPatch = MeshManager::getSingleton().createBezierPatch("patch",
   ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, (float*)verts, mDecl, 3, 3, 5, 5, PatchSurface::VS_BOTH);
   mPatch->setSubdivision(0);//no subdivision

 Entity* ent = mSceneMgr->createEntity("Patch", "patch");
  ent->setMaterialName("Examples/BumpyMetal");
     mSceneMgr->getRootSceneNode()->attachObject(ent);

//创建entity

 

2 Sample_BSP:通过bsp文件 以及pk3文件来创建场景,又有本人用3dmax 所以不太懂得怎么把场景转化bsp文件 所以不做过多的分析

以下是关键代码:

 
ConfigFile cf;
  cf.load(mFSLayer->getConfigFilePath("quakemap.cfg"));
  mArchive = cf.getSetting("Archive");
  mMap = cf.getSetting("Map");

//load config

在quakemap.cfg文件内容如下

Archive: ../../media/packs/chiropteraDM.pk3  pk3文件时一种quake的压缩文件格式 可以包含声音,地图,3D模型,材质贴图 可以用winzp打开
Map: maps/chiropteradm.bsp     bsp是 Quake图形文件的扩展名

mSceneMgr = mRoot->createSceneManager("BspSceneManager"); //创建bspmanager

ResourceGroupManager& rgm = ResourceGroupManager::getSingleton();
  rgm.linkWorldGeometryToResourceGroup(rgm.getWorldResourceGroupName(), mMap, mSceneMgr);
  rgm.initialiseResourceGroup(rgm.getWorldResourceGroupName());
  rgm.loadResourceGroup(rgm.getWorldResourceGroupName(), false);//link load 文件

另外释放的时候需要用如下代码:

 ResourceGroupManager& rgm = ResourceGroupManager::getSingleton();
  rgm.unloadResourceGroup(rgm.getWorldResourceGroupName());
  rgm.removeResourceLocation(mArchive, ResourceGroupManager::getSingleton().getWorldResourceGroupName());

 

3  Sample_CameraTrack 例子主要是NodeAnimationTrack的应用 效果是camera围着ogrehead的一个轨道上运行 因而视口是围着ogrehead为中心运行

nodetrack的这种效果可以用来做围绕的效果 例如dota中召唤师有风雷火3个球体围着转动

主要代码:

  SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
        camNode->attachObject(mCamera);
  
  // set up a 10 second animation for our camera, using spline interpolation for nice curves
        Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);
        anim->setInterpolationMode(Animation::IM_SPLINE);

  // create a track to animate the camera's node
        NodeAnimationTrack* track = anim->createNodeTrack(0, camNode);

        // create keyframes for our track
        track->createNodeKeyFrame(0)->setTranslate(Vector3(200, 0, 0));
        track->createNodeKeyFrame(2.5)->setTranslate(Vector3(0, -50, 100));
        track->createNodeKeyFrame(5)->setTranslate(Vector3(-500, 100, 0));
        track->createNodeKeyFrame(7.5)->setTranslate(Vector3(0, 200, -300));
        track->createNodeKeyFrame(10)->setTranslate(Vector3(200, 0, 0));//这里如果围绕对象是运动的话 只需要将围绕的对象作为被围绕对象的子node即可

        // create a new animation state to track this
        mAnimState = mSceneMgr->createAnimationState("CameraTrack");
        mAnimState->setEnabled(true);

查看animotion.h文件 可以看到类似的track : VertexAnimationTrack NodeAnimationTrack NumericAnimationTrack 关于animotion的分析将在以后在分析

关于ogre animotion可以参考http://blog.csdn.net/leonwei/article/details/5819248