zoukankan      html  css  js  c++  java
  • Ogre碰撞检测

    转自:http://blog.csdn.net/weiqubo/article/details/7108363

    Ogre采用树桩管理场景中的各种"元素"(摄像机、灯光、物体等),所有的东西都挂在"树"上,不在"树"上的东西不会被渲染。
    Ogre::SceneManager就是"树"的管理者,Ogre::SceneNode是从SceneManager中创建的(当然BSP和8*树的管理也和这两个类有关,这暂时不讨论)。

    AABB(轴对齐包围盒)

    这个东西是碰撞检测的基础,和它类似的还有OBB(有向包围盒),由于OBB创建复杂,所以Ogre采用了AABB。

    最简单的碰撞检测

    通过Ogre::SceneNode::_getWorldAABB()可以取得这个叶子节点的AABB(Ogre::AxisAlignedBox),Ogre::AxisAlignedBox封装了对AABB的支持,该类的成员函数Ogre::AxisAlignedBox::intersects()可以判断一个AABB和"球体、点、面以及其他面"的相交情况(碰撞情况)。

    m_SphereNode树的叶子,挂了一个"球"
    m_CubeNode树的叶子,挂了一个"正方体"

    1. AxisAlignedBox spbox = m_SphereNode->_getWorldAABB();  
    2. AxisAlignedBox cbbox = m_CubeNode->_getWorldAABB();  
    3. if(spbox.intersects(cbbox))  
    4. {  
    5.       //相交  
    6. }  
    AxisAlignedBox spbox = m_SphereNode->_getWorldAABB();
    AxisAlignedBox cbbox = m_CubeNode->_getWorldAABB();
    if(spbox.intersects(cbbox))
    {
          //相交
    }
    



     
    附上简单的AABB测试程序,碰撞之后模型放大十倍,当然碰撞之后的事情你可以随意修改
    1. #include"ExampleApplication.h"  
    2. #include <stdio.h>  
    3. class CollionFrameListener:public ExampleFrameListener  
    4. {  
    5. private:  
    6.  SceneNode* m_node;  
    7.  SceneNode*m_node2;  
    8.  SceneManager* mSceneMgr;  
    9. public:  
    10.  CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneNode*node22,SceneManager* manager)  
    11.   :ExampleFrameListener(win,cam),m_node(node),m_node2(node22),mSceneMgr(manager)  
    12.  {  
    13.  }  
    14.  bool frameStarted(const FrameEvent& evt)  
    15.  {  
    16.   AxisAlignedBox spbox=m_node->_getWorldAABB();  
    17.   AxisAlignedBox cbbox=m_node2->_getWorldAABB();  
    18.   if(spbox.intersects(cbbox))  
    19.   {  
    20.    m_node2->setScale(10,10,10);  
    21.   }  
    22.   return ExampleFrameListener::frameStarted(evt);  
    23.  }  
    24. };  
    25.   
    26. class CollionApplication:public ExampleApplication  
    27. {  
    28. protected:  
    29.  SceneNode*node1;  
    30.  SceneNode* node2;  
    31.  void createScene()  
    32.  {  
    33.   mSceneMgr->setAmbientLight(ColourValue(1,1,1));  
    34.   Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");  
    35.   node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");  
    36.   node1->attachObject(ent1);  
    37.   Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");  
    38.   node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));  
    39.   node2->attachObject(ent2);  
    40.     
    41.  }  
    42. void createFrameListener()  
    43.  {  
    44.   mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,node2,mSceneMgr);  
    45.   mFrameListener->showDebugOverlay(true);  
    46.   mRoot->addFrameListener(mFrameListener);  
    47.  }  
    48. };  
    49. INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,  LPSTRint )  
    50. {  
    51.  CollionApplication app;  
    52.  app.go();  
    53. }  
    #include"ExampleApplication.h"
    #include <stdio.h>
    class CollionFrameListener:public ExampleFrameListener
    {
    private:
     SceneNode* m_node;
     SceneNode*m_node2;
     SceneManager* mSceneMgr;
    public:
     CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneNode*node22,SceneManager* manager)
      :ExampleFrameListener(win,cam),m_node(node),m_node2(node22),mSceneMgr(manager)
     {
     }
     bool frameStarted(const FrameEvent& evt)
     {
      AxisAlignedBox spbox=m_node->_getWorldAABB();
      AxisAlignedBox cbbox=m_node2->_getWorldAABB();
      if(spbox.intersects(cbbox))
      {
       m_node2->setScale(10,10,10);
      }
      return ExampleFrameListener::frameStarted(evt);
     }
    };
    
    class CollionApplication:public ExampleApplication
    {
    protected:
     SceneNode*node1;
     SceneNode* node2;
     void createScene()
     {
      mSceneMgr->setAmbientLight(ColourValue(1,1,1));
      Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");
      node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
      node1->attachObject(ent1);
      Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");
      node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));
      node2->attachObject(ent2);
      
     }
    void createFrameListener()
     {
      mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,node2,mSceneMgr);
      mFrameListener->showDebugOverlay(true);
      mRoot->addFrameListener(mFrameListener);
     }
    };
    INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,  LPSTR, int )
    {
     CollionApplication app;
     app.go();
    }
    
    
    区域查询

    简单的讲就是,查询某一区域中有什么东西,分为AABB、球体、面查询。

    1. //创建一个球体查询,这里的100是m_SphereNode挂着的那个球体的半径  
    2. SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));  
    3. //执行这个查询  
    4. SceneQueryResult QResult=pQuery->execute();  
    5. //遍历查询列表找出范围内的物体  
    6. for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)  
    7. {  
    8.  MovableObject* pObject=static_cast<MovableObject*>(*iter);  
    9.  if(pObject)  
    10.  {  
    11.   if(pObject->getMovableType()=="Entity")  
    12.   {  
    13.    Entity* ent = static_cast<Entity*>(pObject);  
    14.    //这里简化了操作,由于只有一个"球体"和一个"正方体",  
    15.    //所以只判断了球体和正方体的相交  
    16.   
    17.    if(ent->getName()=="cube")  
    18.    {  
    19.     //改变位置防止物体重叠  
    20.     vtl=-vtl;  
    21.     m_SphereNode->translate(vtl);  
    22.     break;  
    23.    }  
    24.   }  
    25.  }  
    26. }  
        //创建一个球体查询,这里的100是m_SphereNode挂着的那个球体的半径
        SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));
        //执行这个查询
        SceneQueryResult QResult=pQuery->execute();
        //遍历查询列表找出范围内的物体
        for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
        {
         MovableObject* pObject=static_cast<MovableObject*>(*iter);
         if(pObject)
         {
          if(pObject->getMovableType()=="Entity")
          {
           Entity* ent = static_cast<Entity*>(pObject);
           //这里简化了操作,由于只有一个"球体"和一个"正方体",
           //所以只判断了球体和正方体的相交
    
           if(ent->getName()=="cube")
           {
            //改变位置防止物体重叠
            vtl=-vtl;
            m_SphereNode->translate(vtl);
            break;
           }
          }
         }
        }
    


    新建一个空的ogre程序,将这个代码添加到你的cpp文件中就可以运行,这个例子是如果碰撞就将模型放大十倍,当然碰撞之后的代码你可以随便修改
    1. #include"ExampleApplication.h"  
    2. #include <stdio.h>  
    3. class CollionFrameListener:public ExampleFrameListener  
    4. {  
    5. private:  
    6.  SceneNode* m_node;  
    7.  SceneManager* mSceneMgr;  
    8. public:  
    9.  CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneManager* manager)  
    10.   :ExampleFrameListener(win,cam),m_node(node),mSceneMgr(manager)  
    11.  {  
    12.  }  
    13.  bool frameStarted(const FrameEvent& evt)  
    14.  {  
    15.    SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(m_node->getPosition(),10));  
    16.    SceneQueryResult QResult=pQuery->execute();  
    17.    for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)  
    18.    {  
    19.     MovableObject* pObject=static_cast<MovableObject*>(*iter);  
    20.     if(pObject)  
    21.     {  
    22.      if(pObject->getMovableType()=="Entity")  
    23.      {  
    24.       Entity* ent = static_cast<Entity*>(pObject);  
    25.       if(ent->getName()=="ogrehead")  
    26.       {  
    27.        m_node->setScale(10,10,10);  
    28.        break;  
    29.       }  
    30.      }  
    31.     }  
    32.    }  
    33.   return ExampleFrameListener::frameStarted(evt);  
    34.  }  
    35. };  
    36.   
    37. class CollionApplication:public ExampleApplication  
    38. {  
    39. protected:  
    40.  SceneNode*node1;  
    41.  void createScene()  
    42.  {  
    43.   mSceneMgr->setAmbientLight(ColourValue(1,1,1));  
    44.   Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");  
    45.   node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");  
    46.   node1->attachObject(ent1);  
    47.   Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");  
    48.   SceneNode* node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));  
    49.   node2->attachObject(ent2);  
    50.  }  
    51.  void createFrameListener()  
    52.  {  
    53.   mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,mSceneMgr);  
    54.   mFrameListener->showDebugOverlay(true);  
    55.   mRoot->addFrameListener(mFrameListener);  
    56.  }  
    57. };  
    58.   
    59.   
    60. INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,  LPSTRint )  
    61. {  
    62.  CollionApplication app;  
    63.  app.go();  
    64. }  
    #include"ExampleApplication.h"
    #include <stdio.h>
    class CollionFrameListener:public ExampleFrameListener
    {
    private:
     SceneNode* m_node;
     SceneManager* mSceneMgr;
    public:
     CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneManager* manager)
      :ExampleFrameListener(win,cam),m_node(node),mSceneMgr(manager)
     {
     }
     bool frameStarted(const FrameEvent& evt)
     {
       SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(m_node->getPosition(),10));
       SceneQueryResult QResult=pQuery->execute();
       for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
       {
        MovableObject* pObject=static_cast<MovableObject*>(*iter);
        if(pObject)
        {
         if(pObject->getMovableType()=="Entity")
         {
          Entity* ent = static_cast<Entity*>(pObject);
          if(ent->getName()=="ogrehead")
          {
           m_node->setScale(10,10,10);
           break;
          }
         }
        }
       }
      return ExampleFrameListener::frameStarted(evt);
     }
    };
    
    class CollionApplication:public ExampleApplication
    {
    protected:
     SceneNode*node1;
     void createScene()
     {
      mSceneMgr->setAmbientLight(ColourValue(1,1,1));
      Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");
      node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
      node1->attachObject(ent1);
      Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");
      SceneNode* node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));
      node2->attachObject(ent2);
     }
     void createFrameListener()
     {
      mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,mSceneMgr);
      mFrameListener->showDebugOverlay(true);
      mRoot->addFrameListener(mFrameListener);
     }
    };
    
    
    INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,  LPSTR, int )
    {
     CollionApplication app;
     app.go();
    }
    
    相交查询:

    遍历所有的对象,找到一对一对的相交物体(废话呀,相交当然至少两个物体)。    
    1. //创建相交检测  
    2.  IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();  
    3.  //执行查询  
    4.  IntersectionSceneQueryResult QResult=pISQuery->execute();  
    5.  //遍历查询列表找出两个相交的物体  
    6.  for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();  
    7.  iter != QResult.movables2movables.end();++iter)  
    8.  {  
    9.    
    10. SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);  
    11.  //if(pObject)  
    12.  {  
    13.  String strFirst=pObject.first->getName();  
    14.  String strSecond=pObject.second->getName();  
    15.  //下面加入你自己的两个物体相交判断代码,或者简单的用AABB的判断方法,  
    16.  }  
    17.  }  
    //创建相交检测
     IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();
     //执行查询
     IntersectionSceneQueryResult QResult=pISQuery->execute();
     //遍历查询列表找出两个相交的物体
     for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();
     iter != QResult.movables2movables.end();++iter)
     {
     
    SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);
     //if(pObject)
     {
     String strFirst=pObject.first->getName();
     String strSecond=pObject.second->getName();
     //下面加入你自己的两个物体相交判断代码,或者简单的用AABB的判断方法,
     }
     }

    在Ogre中,可以创建一个查询器,比如球体查询器,AABB查询器,面查询器等。下面我们以最常用的球形查询器为例来说明:

    如下面的代码,我们首先创建一个球形查询器,它需要定义一个球体,我们把它的位置,设置为摄像机的位置,半径为10,掩码为第二个参数,默认为-1,

    通过掩码,可以把碰撞的物体分成不同的组,比如我们设置球形场景查询器的掩码为0x1,则它只检测和它掩码相同物体的碰撞。该摄像机检测到entity对象后,就把摄像机位置沿摄像机方向,向后移动一个单位,这样会实现碰撞检测,但是摄像机因为向后有个移动,所以会有抖动。

    1. //创建球形查询器,第二个参数表示掩码,默认情况下为-1  
    2.       SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(mCamera->getPosition(),10));  
    3.       SceneQueryResult QResult=pQuery->execute();  
    4.       for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)  
    5.       {  
    6.           MovableObject* pObject=static_cast<MovableObject*>(*iter);  
    7.           if(pObject)  
    8.           {  
    9.               if(pObject->getMovableType()=="Entity")  
    10.               {  
    11.                   Entity* ent = static_cast<Entity*>(pObject);  
    12.                   //if(ent->getName()=="Head")  
    13.                   //{  
    14.                   //    //m_node->setScale(10,10,10);  
    15.                   //    pObject->getParentNode()->scale(0.5,0.5,0.5);  
    16.                   //    break;  
    17.                   //}  
    18.                   Ogre::Vector3 v = mCamera->getPosition();  
    19.                   Ogre::Vector3 d = mCamera->getDirection();  
    20.                   v = v + d*(-1);  
    21.                   mCamera->setPosition(v);  
    22.   
    23.               }  
    24.           }  
    25.       }全部的代码:  
      //创建球形查询器,第二个参数表示掩码,默认情况下为-1
            SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(mCamera->getPosition(),10));
            SceneQueryResult QResult=pQuery->execute();
            for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
            {
                MovableObject* pObject=static_cast<MovableObject*>(*iter);
                if(pObject)
                {
                    if(pObject->getMovableType()=="Entity")
                    {
                        Entity* ent = static_cast<Entity*>(pObject);
                        //if(ent->getName()=="Head")
                        //{
                        //    //m_node->setScale(10,10,10);
                        //    pObject->getParentNode()->scale(0.5,0.5,0.5);
                        //    break;
                        //}
                        Ogre::Vector3 v = mCamera->getPosition();
                        Ogre::Vector3 d = mCamera->getDirection();
                        v = v + d*(-1);
                        mCamera->setPosition(v);
    
                    }
                }
            }全部的代码:
    1. #include "ExampleApplication.h"  
    2.   
    3. RaySceneQuery* raySceneQuery = 0;  
    4.   
    5. // Event handler to add ability to alter curvature  
    6. class TerrainFrameListener : public ExampleFrameListener  
    7. {  
    8. public:  
    9.     SceneManager* mSceneMgr;  
    10.     TerrainFrameListener(SceneManager *sceneMgr,RenderWindow* win, Camera* cam)  
    11.         : ExampleFrameListener(win, cam)  
    12.     {  
    13.         // Reduce move speed  
    14.         mMoveSpeed = 50;  
    15.         mSceneMgr = sceneMgr;  
    16.     }  
    17.   
    18.     bool frameRenderingQueued(const FrameEvent& evt)  
    19.     {  
    20.         if( ExampleFrameListener::frameRenderingQueued(evt) == false )  
    21.         return false;  
    22.   
    23.         // clamp to terrain  
    24.         static Ray updateRay;  
    25.         updateRay.setOrigin(mCamera->getPosition());  
    26.         updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);  
    27.         raySceneQuery->setRay(updateRay);  
    28.         RaySceneQueryResult& qryResult = raySceneQuery->execute();  
    29.         RaySceneQueryResult::iterator i = qryResult.begin();  
    30.         if (i != qryResult.end() && i->worldFragment)//把摄像机定在地形10个单位高的地方。  
    31.         {  
    32.             mCamera->setPosition(mCamera->getPosition().x,   
    33.                 i->worldFragment->singleIntersection.y + 10,   
    34.                 mCamera->getPosition().z);  
    35.         }  
    36.         //创建球形查询器,第二个参数表示掩码,默认情况下为-1  
    37.         SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(mCamera->getPosition(),10));  
    38.         SceneQueryResult QResult=pQuery->execute();  
    39.         for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)  
    40.         {  
    41.             MovableObject* pObject=static_cast<MovableObject*>(*iter);  
    42.             if(pObject)  
    43.             {  
    44.                 if(pObject->getMovableType()=="Entity")  
    45.                 {  
    46.                     Entity* ent = static_cast<Entity*>(pObject);  
    47.                     //if(ent->getName()=="Head")  
    48.                     //{  
    49.                     //    //m_node->setScale(10,10,10);  
    50.                     //    pObject->getParentNode()->scale(0.5,0.5,0.5);  
    51.                     //    break;  
    52.                     //}  
    53.                     Ogre::Vector3 v = mCamera->getPosition();  
    54.                     Ogre::Vector3 d = mCamera->getDirection();  
    55.                     v = v + d*(-1);  
    56.                     mCamera->setPosition(v);  
    57.   
    58.                 }  
    59.             }  
    60.         }  
    61.   
    62.         return true;  
    63.   
    64.     }  
    65.   
    66. };  
    67.   
    68.   
    69.   
    70. class TerrainApplication : public ExampleApplication  
    71. {  
    72. public:  
    73.     TerrainApplication() {}  
    74.   
    75.     ~TerrainApplication()  
    76.     {  
    77.         delete raySceneQuery;  
    78.     }  
    79.   
    80. protected:  
    81.   
    82.   
    83.     virtual void chooseSceneManager(void)  
    84.     {  
    85.         // Get the SceneManager, in this case a generic one  
    86.         mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");  
    87.     }  
    88.   
    89.     virtual void createCamera(void)  
    90.     {  
    91.         // Create the camera  
    92.         mCamera = mSceneMgr->createCamera("PlayerCam");  
    93.   
    94.         // Position it at 500 in Z direction  
    95.         mCamera->setPosition(Vector3(128,25,128));  
    96.         // Look back along -Z  
    97.         mCamera->lookAt(Vector3(0,0,-300));  
    98.         mCamera->setNearClipDistance( 1 );  
    99.         mCamera->setFarClipDistance( 1000 );  
    100.   
    101.     }  
    102.      
    103.     // Just override the mandatory create scene method  
    104.     void createScene(void)  
    105.     {  
    106.   
    107.         // Set ambient light  
    108.         mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));  
    109.   
    110.         // Create a light  
    111.         Light* l = mSceneMgr->createLight("MainLight");  
    112.         // Accept default settings: point light, white diffuse, just set position  
    113.         // NB I could attach the light to a SceneNode if I wanted it to move automatically with  
    114.         //  other objects, but I don't  
    115.         l->setPosition(20,80,50);  
    116.   
    117.         // Fog  
    118.         // NB it's VERY important to set this before calling setWorldGeometry   
    119.         // because the vertex program picked will be different  
    120.         ColourValue fadeColour(0.93, 0.86, 0.76);  
    121.         mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);  
    122.         mWindow->getViewport(0)->setBackgroundColour(fadeColour);  
    123.   
    124.         std::string terrain_cfg("terrain.cfg");  
    125.         mSceneMgr -> setWorldGeometry( terrain_cfg );  
    126.         // Infinite far plane?  
    127.         if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))  
    128.         {  
    129.             mCamera->setFarClipDistance(0);  
    130.         }  
    131.   
    132.         // Set a nice viewpoint  
    133.         mCamera->setPosition(707,2500,528);  
    134.         mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));  
    135.         //mRoot -> showDebugOverlay( true );  
    136.   
    137.         raySceneQuery = mSceneMgr->createRayQuery(  
    138.             Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y));//光线的位置和方向,垂直向下  
    139.   
    140.         Entity* ogreHead = mSceneMgr->createEntity("Head""ogrehead.mesh");  
    141.   
    142.         //创建ogre head实体,测试通过射线查询movable来实现摄像机碰撞检测  
    143.         SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreHead");  
    144.         headNode->attachObject(ogreHead);  
    145.         headNode->setPosition(500.0, 100.0, 500.0);  
    146.         headNode->scale(Vector3(2,2,2));  
    147.   
    148.     }  
    149.     // Create new frame listener  
    150.     void createFrameListener(void)  
    151.     {  
    152.         mFrameListener= new TerrainFrameListener(mSceneMgr,mWindow, mCamera);  
    153.         mRoot->addFrameListener(mFrameListener);  
    154.     }  
    155.   
    156. };  
  • 相关阅读:
    Hibernate 项目查询数据报 UnknownEntityTypeException
    C# 实现保留两位小数的方法
    在vs中安装和引用科学计算库 Math.NET Numerics
    C# 特性(Attribute)
    Modbus测试工具ModbusPoll与Modbus Slave使用方法
    StarUML3.0学习笔记
    转载:接近开关NPN型与PNP型的相互代替
    C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
    DateTime.ToString() Patterns
    _056_根据年份判断十二生肖
  • 原文地址:https://www.cnblogs.com/hnfxs/p/3167249.html
Copyright © 2011-2022 走看看