OSG+MFC程序框架(VS2013)

1 篇文章 0 订阅

一、创建MFC项目
1.新建MFC项目,并设置项目名称和制定项目路径
2.按照MFC的向导进行操作,设置好相关的选项
3.选择文件的扩展名为ive,电脑中所有的*.ive文件默认的打开方式就是该应用程序
4.完成其它的类向导操作后,编译运行,出现如下图所示的界面即可

二、添加OSG

1.在项目名称上右击,选择->“添加”->class->C++ Class”,添加一个普通的C++
2.打开osgFrame.h文件,完成osgFrame类的声明
#pragma once
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgViewer/api/win32/GraphicsWindowWin32>
#include <osgGA/TrackballManipulator>

class osgFrame
{
public:
	osgFrame(HWND hWnd);
	~osgFrame();

	void InitOSG();		//初始化OSG
	void InitSceneGraph();	//初始化场景
	void InitCamera();		//初始化相机
	void PreFrameUpdate();	//帧渲染之前更新
	void PostFrameUpdate();		//帧渲染之后更新
	static void Render(void *ptr);	//渲染进程
	osgViewer::Viewer *getViewer();

private:
	HWND m_hWnd;
	osgViewer::Viewer *mViewer;
	osg::ref_ptr<osg::Group> mRoot;

};

3. 设置项目的依赖库:右键项目名称,选择“Property->"VC++ Directories"设置"ExecutableDirectories""Include Directories""LibraryDirectories",这些路径分别对应的就是编译OSG源码时得到的binincludelib路径
4. 在“Linker->Command Line->"Additional Options"中输入:
OpenThreadsd.lib osgAnimation.lib osgd.lib osgdb_osgearth_feature_ogrd.lib osgdb_osgearth_feature_tfsd.lib osgdb_osgearth_feature_wfsd.lib osgdb_osgearth_gdald.lib osgDBd.lib osgEarthAnnotationd.lib osgEarthd.lib osgEarthFeaturesd.lib osgEarthSymbologyd.lib osgEarthUtild.lib osgFXd.lib osgGAd.lib osgManipulatord.lib osgParticled.lib osgPresentationd.lib osgShadowd.lib osgSimd.lib osgTerraind.lib osgTextd.lib osgUtild.lib osgViewerd.lib osgVolumed.lib osgWidgetd.lib glu32.lib opengl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
5. 打开osgFrame.cpp文件,实现osgFrame类的定义
#include "stdafx.h"
#include "osgFrame.h"
osgFrame::osgFrame(HWND hWnd)
{
	m_hWnd = hWnd;
}
osgFrame::~osgFrame()
{
}
void osgFrame::InitOSG()
{
	InitSceneGraph();
	InitCamera();
}
void osgFrame::InitSceneGraph()
{
	mRoot = new osg::Group();
	mRoot->addChild(osgDB::readNodeFile("cow.osg"));
}
void osgFrame::InitCamera()
{
	RECT rect;
	mViewer = new osgViewer::Viewer();
	::GetWindowRect(m_hWnd, &rect);
	osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
	osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);

	traits->x = 0;
	traits->y = 0;
	traits->width = rect.right - rect.left;
	traits->height = rect.bottom - rect.top;
	traits->windowDecoration = false;
	traits->doubleBuffer = true;
	traits->sharedContext = 0;
	traits->setInheritedWindowPixelFormat = true;
	traits->inheritedWindowData = windata;

	osg::GraphicsContext *gc = osg::GraphicsContext::createGraphicsContext(traits);
	osg::ref_ptr<osg::Camera> camera = new osg::Camera();
	camera->setGraphicsContext(gc);
	camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
	camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width) / static_cast<double>(traits->height), 1.0, 1000.0);
	
	mViewer->setCamera(camera);
	mViewer->setCameraManipulator(new osgGA::TrackballManipulator);
	mViewer->setSceneData(mRoot);
	mViewer->realize();
	mViewer->getCamera()->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES);
	mViewer->getCamera()->setNearFarRatio(0.000003f);

}

void osgFrame::PreFrameUpdate()
{
	//
}

void osgFrame::PostFrameUpdate()
{
	//
}

void osgFrame::Render(void* ptr)
{
	osgFrame *osg = (osgFrame*)ptr;
	osgViewer::Viewer *viewer = osg->getViewer();
	while (!viewer->done())
	{
		osg->PreFrameUpdate();
		viewer->frame();
		osg->PostFrameUpdate();
	}
	_endthread();
}

osgViewer::Viewer *osgFrame::getViewer()
{
	return mViewer;
}

6.编译,发现有如下错误
错误原因是静态库为64位,而该项目创建是默认为32位程序,因此指定该版本程序为64位,再次编译就没有错误了。

7. 右键项目名称,打开“MFC Class Wizard”窗口,需要对以下几个事件进行重载,onCreate创建窗口,对应的消息为——WM_CREATEOnEraseBkgnd擦出背景的时候,对应的消息为——WM_ERASEBKGNDOnDestroy在窗口销毁的时候进行处理,对应的消息为——WM_DESTROY;在虚函数的选择栏中对以下虚函数进行重写:OnInitialUpdate程序初始化的时候响应处理函数;
8.打开OsgMFCView.cpp, 包含osgFrame类的头文件osgFrame.h,并声明两个全局变量:

osgFrame* mOSG;

HANDLE mThreadHandle;
9.重载OnCreate()函数,如下

int COsgMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
	{
		return -1;
	}
	else
	{
		mOSG = new osgFrame(m_hWnd);	//创建osgFrame对象
	}

	return 0;
}

10. 重载OnEraseBKgnd()函数,如下:

BOOL COsgMFCView::OnEraseBkgnd(CDC* pDC)
{
	if (0 == mOSG)
	{
		return CView::OnEraseBkgnd(pDC);
	}
	else
	{
		return FALSE;
	}

	return CView::OnEraseBkgnd(pDC);
}

11. 重载OnDestroy()函数

void COsgMFCView::OnDestroy()
{
	CView::OnDestroy();
	if (mOSG != 0)
	{
		delete mOSG;
	}
	WaitForSingleObject(mThreadHandle, 1000);
	
}

12. 重载OnInitialUpdate()函数

void COsgMFCView::OnInitialUpdate()
{
	CView::OnInitialUpdate();
	mOSG->InitOSG();

	mThreadHandle = (HANDLE)_beginthread(&osgFrame::Render, 0, mOSG);
}

13. 编译运行,结果如下

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值