zoukankan      html  css  js  c++  java
  • ogre sample分析(一)

    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


  • 相关阅读:
    js之面向对象
    常用功能
    html圆环(该代码非原创,具体出处已不详)
    关于jsonp的一篇文章(传播好的东西)
    当切换select时,获取select选中的值;获取选中的单选按钮的val,判断复选框是否选中
    js类型判断(数字、0、""、undefined、null)
    js获取窗口可视范围的高度、获取窗口滚动条高度、文档内容实际高度
    66
    55
    44
  • 原文地址:https://www.cnblogs.com/pangblog/p/3297253.html
Copyright © 2011-2022 走看看