MFC窗口系统下的OSG简单框架

来源:互联网 发布:淘宝的经营模式分析 编辑:程序博客网 时间:2024/06/07 05:54

最近学习OSG,下载了FreeSouth大侠的一个MFC框架RambleSystem,自己学习了一下,新建了一个单文档程序,改了其中一些bug,和大家分享一下。单文档程序实现的功能非常简单,就是打开显示osg文件。不过仍存在一个问题,例如打开一些osg文件显示模型不理想,估计是视口设置有问题;另外打开一些osg文件出现内存泄露。

我使用的是osg 2.8.2的版本,下载地址为(在这个页面也可下载测试数据):
OpenSceneGraph-2.8.2预编译包(for vs9)下载


      下载完后我把它放在D:/Program Files/OpenSceneGraph-2.8.2(你也可以把它放在其它位置),然后添加相应的环境变量,具体是运行编译包中的osg_env.bat。


        把头文件和库文件包含进来(具体在附加包含文件和附加库目录设置),建一个单文档程序osgSdi (MFC Standard)。

OSG核心类CCoreOSG的接口如下(具体实现请下载源代码):


[cpp] view plaincopy
  1. /* -*-c++-*- OpenSceneGraph - 2008.3.14 by FreeSouth 
  2.  * 
  3.  * 该框架是FreeSouth基于原MDI框架修改,如果您发现该框架有BUG可以到 
  4.  * bbs.osgChina.org上发帖声明,或是致件作者:ieysx@163.com 
  5.  *谢谢您支持www.osgChina.org 
  6.  *您可以随意的复制,修改,传播该框架 
  7. */  
  8. //------------------------------//------------------------------  
  9. #pragma once  
  10. #include <osgViewer/Viewer>  
  11. #include <osgViewer/ViewerEventHandlers>  
  12. #include <osgViewer/api/win32/GraphicsWindowWin32>  
  13. #include <osgGA/TrackballManipulator>  
  14. #include <osgGA/KeySwitchMatrixManipulator>  
  15. #include <osgDB/DatabasePager>  
  16. #include <osgDB/Registry>  
  17. #include <osgDB/ReadFile>  
  18. #include <osgUtil/Optimizer>  
  19. #include <string>  
  20. //------------------------------//------------------------------  
  21. /**OSG核心类,在这里执行MFC对OSG的大部分的管理功能*/  
  22. class CCoreOSG  
  23. {  
  24. public:  
  25.     /**构造函数获取上一级窗口句柄*/  
  26.     CCoreOSG(HWND hWnd);  
  27.     ~CCoreOSG();  
  28.     /**初始化OSG,参数filename为要加入的模型文件*/  
  29.     void InitOSG(std::string filename);  
  30.     /**初始化操作器*/  
  31.     void InitManipulators(void);  
  32.     /**初始化场景*/  
  33.     void InitSceneGraph(void);  
  34.     /**初始化相机配置*/  
  35.     void InitCameraConfig(void);  
  36.     /**建立窗口*/  
  37.     void SetupWindow(void);  
  38.     /**建立相机*/  
  39.     void SetupCamera(void);  
  40.     /**每帧绘制前处理*/  
  41.     void PreFrameUpdate(void);  
  42.     //每帧绘制后处理  
  43.     void PostFrameUpdate(void);  
  44.     //SetDone  
  45.     void Done(bool value) { mDone = value; }  
  46.     //getDone  
  47.     bool Done(void) { return mDone; }  
  48.     //渲染,注意这里是静态的,可启用为全局线程  
  49.     static void Render(void* ptr);  
  50.     //使用一个名称为filename的模型代替当前场景中的所有模型  
  51.     void ReplaceSceneData(std::string filename) ;  
  52.     //getViewer  
  53.     osgViewer::Viewer* getViewer() { return mViewer; }  
  54. private:  
  55.     //Done  
  56.     bool mDone;  
  57.     //模型文件名称  
  58.     std::string m_ModelName;  
  59.     //窗口句柄  
  60.     HWND m_hWnd;  
  61.     //viewer  
  62.     osgViewer::Viewer* mViewer;  
  63.     //场景根结点  
  64.     osg::ref_ptr<osg::Group> mRoot;  
  65.     //场景模型文件  
  66.     osg::ref_ptr<osg::Node> mModel;  
  67.     //trackball操作器  
  68.     osg::ref_ptr<osgGA::TrackballManipulator> trackball;  
  69.     //加入KeySwitch选择操作器  
  70.     osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator;  
  71. };//end class CCoreOSG   
  72. //------------------------------//------------------------------  


视图类的渲染模型文件的接口如下:


[cpp] view plaincopy
  1.     /*! 
  2.     *  /brief 渲染模型文件。 
  3.     * 
  4.     *  /param pszSrc 模型文件全路径。 
  5.     *  /return 是否成功。TRUE为成功,FALSE为失败。 
  6.     */  
  7. BOOL CosgSdiView::RenderModelFile(string strModelFielName)  
  8. {  
  9.      assert(_T("")!=strModelFielName);  
  10.      // m_OSG为上面提到的CCoreOSG类的一个指针变量  
  11.      if (NULL==m_OSG)  
  12.      {  
  13.          // 假如没有渲染接口,就新建一个并启动渲染线程  
  14.          m_OSG = new CCoreOSG(m_hWnd ) ;  
  15.          m_OSG ->InitOSG(strModelFielName);  
  16.          m_ThreadHandle = (HANDLE)_beginthread(&CCoreOSG::Render, 0, m_OSG) ;     
  17.      }  
  18.      else  
  19.      {  
  20.           // 直接替掉模型就可以了  
  21.           m_OSG->ReplaceSceneData(strModelFielName) ;  
  22.      }  
  23.       return TRUE;  
  24. }  


         
源码下载地址:


       MFC窗口系统下的OSG简单框架源码下载


       再次感谢FreeSouth大侠!


0 0
原创粉丝点击