MFC加载osg模型
Posted herd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC加载osg模型相关的知识,希望对你有一定的参考价值。
创建MFC单文档项目,
OSGObject.h
#pragma once #include <osgViewer\\Viewer> #include <osgDB\\ReadFile> #include <osgViewer\\api\\Win32\\GraphicsWindowWin32> #include <osgGA\\TrackballManipulator> #include <osg\\Group> class COSGObject public: COSGObject(HWND hWnd); ~COSGObject(); void InitOSG(); void InitSceneGraph(); void InitCameraConfig(); void PreFrameUpdate(); void PostFrameUpdate(); static void Render(void* ptr); osgViewer::Viewer* getOsgViewer(); private: HWND m_hwnd; osgViewer::Viewer* mViewer; osg::ref_ptr<osg::Group> mRoot; ;
OSGObject.cpp
#pragma once #include <osgViewer\\Viewer> #include <osgDB\\ReadFile> #include <osgViewer\\api\\Win32\\GraphicsWindowWin32> #include <osgGA\\TrackballManipulator> #include <osg\\Group> class COSGObject public: COSGObject(HWND hWnd); ~COSGObject(); void InitOSG(); void InitSceneGraph(); void InitCameraConfig(); void PreFrameUpdate(); void PostFrameUpdate(); static void Render(void* ptr); osgViewer::Viewer* getOsgViewer(); private: HWND m_hwnd; osgViewer::Viewer* mViewer; osg::ref_ptr<osg::Group> mRoot; ;
View.h
// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 // (“Fluent UI”)。该示例仅供参考, // 用以补充《Microsoft 基础类参考》和 // MFC C++ 库软件随附的相关电子文档。 // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。 // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 // http://go.microsoft.com/fwlink/?LinkId=238214。 // // 版权所有(C) Microsoft Corporation // 保留所有权利。 // View.h : View 类的接口 // #pragma once #include "Doc.h" #include "OSGObject.h" class View : public CView protected: // 仅从序列化创建 CMFC_OsgEarth20190901View(); DECLARE_DYNCREATE(View) // 特性 public: Doc* GetDocument() const; // 操作 public: COSGObject* mOsgObj; HANDLE mThreadHandle; // 重写 public: virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: // 实现 public: virtual ~View(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 protected: afx_msg void OnFilePrintPreview(); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); DECLARE_MESSAGE_MAP() public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnDestroy(); virtual void OnInitialUpdate(); ; #ifndef _DEBUG // View.cpp 中的调试版本 inline Doc* View::GetDocument() const return reinterpret_cast<Doc*>(m_pDocument); #endif
View.cpp
// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 // (“Fluent UI”)。该示例仅供参考, // 用以补充《Microsoft 基础类参考》和 // MFC C++ 库软件随附的相关电子文档。 // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。 // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 // http://go.microsoft.com/fwlink/?LinkId=238214。 // // 版权所有(C) Microsoft Corporation // 保留所有权利。 // View.cpp : View 类的实现 // #include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #endif #include "Doc.h" #include "View.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // View IMPLEMENT_DYNCREATE(View, CView) BEGIN_MESSAGE_MAP(View, CView) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_WM_CREATE() ON_WM_ERASEBKGND() ON_WM_DESTROY() END_MESSAGE_MAP() // View 构造/析构 View::View() // TODO: 在此处添加构造代码 mOsgObj = 0; mThreadHandle = 0; View::~View() BOOL View::PreCreateWindow(CREATESTRUCT& cs) // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); // View 绘制 void View::OnDraw(CDC* /*pDC*/) Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 void View::OnRButtonUp(UINT /* nFlags */, CPoint point) ClientToScreen(&point); OnContextMenu(this, point); void View::OnContextMenu(CWnd* /* pWnd */, CPoint point) #ifndef SHARED_HANDLERS //theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif // View 诊断 #ifdef _DEBUG void View::AssertValid() const CView::AssertValid(); void View::Dump(CDumpContext& dc) const CView::Dump(dc); Doc* View::GetDocument() const // 非调试版本是内联的 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Doc))); return (Doc*)m_pDocument; #endif //_DEBUG // View 消息处理程序 int View::OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 mOsgObj = new COSGObject(m_hWnd); return 0; BOOL View::OnEraseBkgnd(CDC* pDC) // TODO: 在此添加消息处理程序代码和/或调用默认值 if (0 == mOsgObj) return CView::OnEraseBkgnd(pDC); else return FALSE; return CView::OnEraseBkgnd(pDC); void View::OnDestroy() CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 if (mOsgObj != 0) delete mOsgObj; WaitForSingleObject(mThreadHandle, 1000); void View::OnInitialUpdate() CView::OnInitialUpdate(); // TODO: 在此添加专用代码和/或调用基类 mOsgObj->InitOSG(); mThreadHandle = (HANDLE)_beginthread(&COSGObject::Render, 0, mOsgObj);
以上是关于MFC加载osg模型的主要内容,如果未能解决你的问题,请参考以下文章