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


  • 相关阅读:
    adb 连接 Android 手机的两种方式
    Jmeter GUI及NON GUI下实现分布式
    史上最全最细 App 自动化环境部署
    不懂Java代码,照样把jmeter指定数据写入execl
    Dockerfile 让你轻松创建属于你的镜像 (下)
    Dockerfile 让你轻轻松松创建属于你的镜像 (上)
    Python vs Java (一):史上最全变量类型区别,99.99%的人都收藏了
    浏览器F12调试器定位系统前后端bug
    cookie,session
    App 抓包提示网络异常怎么破?(抓包HTTPS)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3297253.html
Copyright © 2011-2022 走看看