现在的位置: 首页 > 综合 > 正文

Ogre导入模型

2014年04月05日 ⁄ 综合 ⁄ 共 7732字 ⁄ 字号 评论关闭

1.注意事项

1.由于Ogre与3Dmax坐标系统的不一致,可能会导致3Dmax导出的模型在Ogre旋转了90°(我使用OgreMax导出模型).这可以在3Dmax里更改模型的轴坐标即可

修改方法 : 选中模型后--->层次--->点击仅影响对象--->变换  即可将轴坐标重置为OgreMax导出的正常Ogre轴
2.NxOgre中是以m为度量单位的.在Ogre中也可以认为是m(Ogre中测量单位是相对的),在制作模型是最好按实际单位制作模型,否则可能会出现很多意想不到的问题.
3.关于在3Dmax中缩放模型后导入Ogre中仍旧以未缩放以前的大小显示,决绝办法为使用OgreCommandLine工具中的MeshMagick工具对mesh模型进行缩放
例如 : MeshMagick transform -scale=0.00120633/0.00110835/0.00110835 car002Glass.mesh

4.关于3Dmax到处模型在Ogre中没有阴影的问题
    可以有两种办法
    1.在OgreMax的SceneSetting中的Mesh中勾选Generate Edge List选项.
    2.生成Entity后设置Entity::getMesh()->setAutoBuildEdgeLists(true)
                        NxOgre导入3Dmax模型注意事项 - 飞天小猪 - 飞天小猪
2.Ogre手动绘制模型以及添加材质 
用Ogre来绘制一个立方体

  1. ManualObject* cube;
  2. cube = mSceneMgr->createManualObject("cube");
  3. cube->begin("cubeMaterial");
  4.    // 顶点
  5.    cube->position( -100, -100, -100);   //0
  6.    cube->colour(0.0, 0.0, 0.0);
  7.    cube->position( 100, -100, -100);    //1
  8.    cube->colour(1.0, 0.0, 0.0);
  9.    cube->position( 100, -100, 100);    //2
  10.    cube->colour(1.0, 0.0, 1.0);
  11.    cube->position( -100, -100, 100);    //3
  12.    cube->colour(0.0, 0.0, 1.0);
  13.    cube->position( -100, 100, -100);    //4
  14.    cube->colour(0.0, 1.0, 0.0);
  15.    cube->position( 100, 100, -100);    //5
  16.    cube->colour(1.0, 1.0, 0.0);
  17.    cube->position( 100, 100, 100);    //6
  18.    cube->colour(1.0, 1.0, 1.0);
  19.    cube->position( -100, 100, 100);    //7
  20.    cube->colour(0.0, 1.0, 1.0);
  21.    //// 索引
  22.    cube->triangle(0, 2, 1);
  23.    cube->triangle(0, 2, 3);
  24.    cube->triangle(3, 4, 0);
  25.    cube->triangle(3, 7, 4);
  26.    cube->triangle(4, 7, 6);
  27.    cube->triangle(4, 6, 5);
  28.    cube->triangle(5, 2, 1);
  29.    cube->triangle(5, 6, 2);
  30.    cube->triangle(0, 4, 1);
  31.    cube->triangle(5, 1, 4);
  32.    cube->triangle(3, 6, 7);
  33.    cube->triangle(3, 2, 6);
  34. cube->end();
  35. SceneNode* sn = mSceneMgr->getRootSceneNode()->createChildSceneNode();
  36. sn->attachObject(cube);
在上个立方体的基础上加上6个贴图

  1. // 创建六个纹理
  2. MaterialPtr material = MaterialManager::getSingletonPtr()->create("q""General");
  3. material->getTechnique(0)->getPass(0)->createTextureUnitState("q.jpg");
  4. material = MaterialManager::getSingletonPtr()->create("a""General");
  5. material->getTechnique(0)->getPass(0)->createTextureUnitState("a.jpg");
  6. material = MaterialManager::getSingletonPtr()->create("z""General");
  7. material->getTechnique(0)->getPass(0)->createTextureUnitState("z.jpg");
  8. material = MaterialManager::getSingletonPtr()->create("x""General");
  9. material->getTechnique(0)->getPass(0)->createTextureUnitState("x.jpg");
  10. material = MaterialManager::getSingletonPtr()->create("s""General");
  11. material->getTechnique(0)->getPass(0)->createTextureUnitState("s.jpg");
  12. material = MaterialManager::getSingletonPtr()->create("w""General");
  13. material->getTechnique(0)->getPass(0)->createTextureUnitState("w.jpg");
  14. ManualObject* cube;
  15. cube = mSceneMgr->createManualObject("cube");
  16. /// 下面, begin的第一个参数为要设置的材质名称
  17. cube->begin("q", RenderOperation::OT_TRIANGLE_FAN);
  18.   cube->position( -100, -100, -100);   //0
  19.   cube->textureCoord(1, 0);
  20.   cube->position( 100, -100, -100);    //1
  21.   cube->textureCoord(0, 0);
  22.   cube->position( 100, -100, 100);    //2
  23.   cube->textureCoord(0, 1);
  24.   cube->position( -100, -100, 100);    //3
  25.   cube->textureCoord(1, 1);
  26. cube->end();
  27. /// 左面
  28. cube->begin("a", RenderOperation::OT_TRIANGLE_FAN);
  29.   cube->position( -100, -100, 100);    //3
  30.   cube->textureCoord(1, 0);
  31.   cube->position( -100, 100, 100);    //7
  32.   cube->textureCoord(0, 0);
  33.   cube->position( -100, 100, -100);    //4
  34.   cube->textureCoord(0, 1);
  35.   cube->position( -100, -100, -100);   //0
  36.   cube->textureCoord(1, 1);
  37. cube->end();
  38. /// 上面
  39. cube->begin("z", RenderOperation::OT_TRIANGLE_FAN);
  40.   cube->position( -100, 100, -100);    //4
  41.   cube->textureCoord(1, 0);
  42.   cube->position( -100, 100, 100);    //7
  43.   cube->textureCoord(0, 0);
  44.   cube->position( 100, 100, 100);    //6
  45.   cube->textureCoord(0, 1);
  46.   cube->position( 100, 100, -100);    //5
  47.   cube->textureCoord(1, 1);
  48. cube->end();
  49.         
  50. /// 右面
  51. cube->begin("x", RenderOperation::OT_TRIANGLE_FAN);
  52.   cube->position( 100, -100, -100);    //1
  53.   cube->textureCoord(1, 0);
  54.   cube->position( 100, 100, -100);    //5
  55.   cube->textureCoord(0, 0);
  56.   cube->position( 100, 100, 100);    //6
  57.   cube->textureCoord(0, 1);
  58.   cube->position( 100, -100, 100);    //2
  59.   cube->textureCoord(1, 1);
  60. cube->end();
  61. /// 前面
  62. cube->begin("s", RenderOperation::OT_TRIANGLE_FAN);
  63.   cube->position( 100, -100, -100);    //1
  64.   cube->textureCoord(1, 0);
  65.   cube->position( -100, -100, -100);   //0
  66.   cube->textureCoord(0, 0);
  67.   cube->position( -100, 100, -100);    //4
  68.   cube->textureCoord(0, 1);
  69.   cube->position( 100, 100, -100);    //5
  70.   cube->textureCoord(1, 1);
  71. cube->end();
  72. /// 后面
  73. cube->begin("w", RenderOperation::OT_TRIANGLE_FAN);
  74.   cube->position( 100, -100, 100);    //2
  75.   cube->textureCoord(1, 0);
  76.   cube->position( 100, 100, 100);    //6
  77.   cube->textureCoord(0, 0);
  78.   cube->position( -100, 100, 100);    //7
  79.   cube->textureCoord(0, 1);
  80.   cube->position( -100, -100, 100);    //3
  81.   cube->textureCoord(1, 1);
  82. cube->end();

3. 

OIS鼠标非独占解决方法 

创建OIS输入设备时指定非独占:InputManager::createInputSystem()创建设备时,参数实际上是一个
std::multimap<std::string,std::string>类型的变量,通过它来传入参数值。  如:  ParamList pl;

  1. OIS::ParamList pl;
  2. size_t windowHnd = 0;
  3. std::ostringstream windowHndStr;
  4. renderWindow->getCustomAttribute("WINDOW", &windowHnd);
  5. windowHndStr << windowHnd;
  6. pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
  7. if (!isNexclusive)
  8. {
  9.     // 非独占模式下鼠标可移出窗口之外
  10.     pl.insert(std::make_pair(std::string("w32_mouse"), "DISCL_FOREGROUND"));     pl.insert(std::make_pair(std::string("w32_mouse"), "DISCL_NONEXCLUSIVE"));
  11. }
  12. mInputManager = OIS::InputManager::createInputSystem( pl );
  13. mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( 
  14.                                         OIS::OISKeyboard, true ));
  15. mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( 
  16.                                         OIS::OISMouse, true ));
  17. // 设置回调
  18. mMouse->setEventCallback(this);
  19. mKeyboard->setEventCallback(this);
  20. // 设置鼠标移动范围,OIS默认范围为50*50
  21. mMouse->getMouseState().width =windowWidth;
  22. mMouse->getMouseState().height = windowHeight;
     
    注入CEGUI鼠标事件:先进行边界判断,当鼠标移出窗体外的时候,OIS会把MouseEvent.state.X.absMouseEvent.state.Y.abs设置成最大或最小值。比如渲染窗口大小为800*600,那么当鼠标移到窗口左边时,MouseEvent.state.X.abs会等于0而不会出现负数;移到窗口右边的时候,MouseEvent.state.Y.abs的值也不会超过800。所以我们可以如下边界判断:
  1. if( mouseEvent.state.X.abs>0 && mouseEvent.state.X.abs<windowWidth && 
  2.     mouseEvent.state.Y.abs>0 && mouseEvent.state.Y.abs<windowHeight )
  3.     CEGUI::System::getSingleton().injectMousePosition( 
  4.                                   mouseEvent.state.X.abs, mouseEvent.state.Y.abs );
    适应窗口大小变化:如果程序可以动态改变窗口大小那么鼠标大小也要修改重新适应窗口。当窗口大小变化后,OIS只需重新调用mMouse->getMouseState().width =windowWidth;
 mMouse->getMouseState().height = windowHeight;
来重新设置鼠标移动范围.当然你可能会发现游戏窗口内的鼠标位置和系统鼠标位置不一致,那就要重新设置CEGUI鼠标显示的范围了,如:mGUIRenderer->setDisplaySize(1024,768)。
 
  全屏与窗口切换:当游戏全屏的时候,输入使用独占模式更好一些,因为鼠标就不会移出游戏界面了。其实在全屏与窗口的切换时,我们可以把OIS设备释放再重新创建。在窗口下使用非独占模式,而在全屏下使用独占模式 

4.
Ogre .Scene文件的读取 
  OgreMaxViewers里找到\Release\OgreMax\Common,其中Code文件包就是读取导出的.Scene文件的源码。

你需要将其包含到你的工程中去。然后,在需要读取的地方包含OgreMaxScene.hpp文件,就可以使用OgreMaxScene了。典型的调用方法如下:

  1. virtual bool CreateScene()
  2. {
  3.         OgreMax::OgreMaxScene *oms = new OgreMax::OgreMaxScene;
  4.         oms->Load("../media/scene/dotscene.scene",mWindow,0,mSceneMgr);
  5.         mSceneMgr=oms->GetSceneManager();
  6.         //others.....
  7.         return true;
  8. }

    注意oms的Load方法,其中的参数mSceneMgr是你自己的场景管理器(原先的),如果你自己没有设定场景管理器,就将此参数置空。这时OgreMax会为你提供一个默认的八叉树场景管理器。

  1. #include "OgreMaxModel.h"
  2. #include "OgreMaxScene.h"
  3. void createScene(void)
  4. {
  5.     ... ...
  6.     m_maxScene = new OgreMax::OgreMaxScene();
  7.     // 1.scene是导出的场景文件名,,当然你也可以用绝对路径,但不建议那样做。
  8.     m_maxScene->Load("1.scene",mWindow,OgreMax::OgreMaxScene::NO_OPTIONS, 0, 0); 
  9.     // 读取Max文件中的设定的Camera
  10.     mSceneMgr = m_maxScene->GetSceneManager();
  11.     mCamera = mSceneMgr->getCamera("Camera02"); // 1.scene文件中指定的照相机名称
  12.     Viewport* vp = mWindow->addViewport(mCamera);
  13.     vp->setBackgroundColour(ColourValue(0,0,0));
  14.     mCamera->setAspectRatio(Real(vp->getActualWidth())/
  15.                             Real(vp->getActualHeight()));
  16.     ... ...
  17. }


【上篇】
【下篇】

抱歉!评论已关闭.