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模型的主要内容,如果未能解决你的问题,请参考以下文章

osg qt 三维模型加载

osg学习(五十二)加载的牛模型cow.osg没有纹理 黑色

osg模型能在osgviewer中显示,不能在vs中显示

改进osg::impostor实现加载很多大模型的功能

通过OSG实现对模型的日照模拟

osg fbx模型删除模型中的某几个节点,实现编辑模型的功能