首先在osg文件夹下的example下面找到osgviewerMFC。注意有关osg的方法声明和实现在MFC_OSG.h和MFC_OSG.cpp的cOSG类中。
代码如下:与官方略有不同
#pragma once
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/api/win32/GraphicsWindowWin32>
#include <osgGA/TrackballManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgDB/DatabasePager>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <string>
class cOSG
{
public:
cOSG(HWND hWnd);
~cOSG();
void InitOSG(std::string filename); //初始化OSG,filename为要加入的模型文件
void InitManipulators(void);//初始化操作器
void InitSceneGraph(void);//初始化操作器
void InitCameraConfig(void);//初始化相机
void SetupWindow(void);//建立窗口
void SetupCamera(void);// 建立相机
void PreFrameUpdate(void);//绘制前处理
void PostFrameUpdate(void);//绘制后处理
void Done(bool value) { mDone = value; }
bool Done(void) { return mDone; }
//static void Render(void* ptr);// 渲染
osgViewer::Viewer* getViewer() { return mViewer; }
private:
bool mDone;
std::string m_ModelName;// 模型名
HWND m_hWnd; // 窗口句柄
osgViewer::Viewer* mViewer;
osg::ref_ptr<osg::Group> mRoot;//场景根节点
osg::ref_ptr<osg::Node> mModel;//场景模型
osg::ref_ptr<osgGA::TrackballManipulator> trackball;// trackball操作器
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator;// keyswitch操作器
};
class CRenderingThread : public OpenThreads::Thread
{
public:
CRenderingThread( cOSG* ptr );
virtual ~CRenderingThread();
virtual void run();
protected:
cOSG* _ptr;
bool _done;
};
// MFC_OSG.cpp : implementation o