OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/94734036

目录

前言

优势

源码移植过程

步骤一:移动头文件,编译osgQt获得头文件     

步骤二:移动源文件

步骤三:添加进工程文件,卸osgQt库,将头文件和源码添加进代码

步骤四:将osgQt都改为.h

步骤五:编译错误之dll导出

步骤六:编译完成

效果

代码

头文件

源文件

工程模板:对应版本号1.3.0


OSG三维开发专栏

OSG开发笔记(一):OSG介绍、编译

OSG开发笔记(二):OSG帮助文档编译

OSG开发笔记(三):OSG使用osgQt嵌入Qt应用程序

OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序》:

OSG开发笔记(五):OSG场景理解与基础类概述

OSG开发笔记(六):OSG内存管理

OSG开发笔记(七):OSG复现OpenGL入门示例和OSG坐标系

OSG开发笔记(八):OSG模型文件存储与读取

OSG开发笔记(九):OSG模型的基本操作之添加/删除、显示/隐藏、开关节点开/》:

OSG开发笔记(十):OSG模型的变换之平移、旋转和缩放

OSG开发笔记(十一):OSG渲染状态与2D纹理映射

OSG开发笔记(十二):OSG基本几何图形、内置几何类型

OSG开发笔记(十三):OSG三维纹理映射(体渲染)

OSG开发笔记(十四):OSG交互

OSG开发笔记(十五):OSG光照

OSG开发笔记(十六):OSG视口、相机和视点

OSG开发笔记(十七):OSG中的相机移动

OSG开发笔记(十八):OSG鼠标拾取pick、拽托球体以及多光源

OSG开发笔记(十九):OSG文字显示

OSG开发笔记(二十):OSG使用HUD显示文字

OSG开发笔记(二十一):OSG使用HUD绘制图形以及纹理混合模式

OSG开发笔记(二十二):OSG场景背景

OSG开发笔记(二十三):Qt使用QOpenGLWidget渲染OSG地球仪

OSG开发笔记(二十四):OSG漫游之平移、转向和低抬头

OSG开发笔记(二十五):OSG漫游之CS移动、碰撞检测与跳跃

OSG开发笔记(二十六):OSG漫游之上下楼梯

《OSG开发笔记(二十七):OSG路径漫游之录制播放固定路径动画

《OSG开发笔记(二十八):OSG模型固定路径动画

  持续补充中…

 

          OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序

 

前言

       前面编译了osg库(没有带任何插件),本章节不依赖osgQt

       使用osgQt的弊端是每次不能自定义消息,若要自定义消息则需求修改osgQt中源码,重新编译,所以此种方法灵活性较高。

优势

       移植osgQt源码,上一章节使用osgQt的工程实现代码,优点如下:

  • 使用osgQt库与不使用osgQt库工程代码兼容
  • 不需要自己手动写代码,但是需要移植一下,属于一劳永逸
  • 消息点击触摸等操作,不需要重编库,直接修改osgQt源码即可。

 

源码移植过程

步骤一:移动头文件,编译osgQt获得头文件     

      OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第1张图片

步骤二:移动源文件

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第2张图片

步骤三:添加进工程文件,卸osgQt库,将头文件和源码添加进代码

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第3张图片

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第4张图片

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第5张图片

 

步骤四:将osgQt都改为.h

        其对应的源文件包含头文件也修改

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第6张图片

步骤五:编译错误之dll导出

        

        此处不再是导出dll,重定义一下

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第7张图片

步骤六:编译完成

       删掉libosgQt进一步确认

效果

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第8张图片

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第9张图片

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第10张图片

 

代码

        OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序_第11张图片

头文件

#ifndef OSGWIDGET_H
#define OSGWIDGET_H

#include 
#include 
#include "osgQt/GraphicsWindowQt.h"

namespace Ui {
class OsgWidget;
}

class OsgWidget : public QWidget
{
    Q_OBJECT

public:
    explicit OsgWidget(QWidget *parent = 0);

protected:
    void resizeEvent(QResizeEvent *event);

protected:
    void initOsg();
    void loadOsg(QString osgFilePath);

private slots:
    void on_pushButton_open_clicked();

private:
    Ui::OsgWidget *ui;

private:
    osg::ref_ptr _pViewer;
    osg::ref_ptr _pViewport;
    osgQt::GLWidget * _pGLWidget;
    osgQt::GraphicsWindowQt* _pGraphicsWindowQt;

};

#endif // OSGWIDGET_H

源文件

#include "OsgWidget.h"
#include "ui_OsgWidget.h"

#include "osgQt/GraphicsWindowQt.h"
#include 
#include 
#include 
#include 
#include 

#include "define.h"
#include 

OsgWidget::OsgWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::OsgWidget),
    _pViewer(0),
    _pGLWidget(0),
    _pGraphicsWindowQt(0)
{
    ui->setupUi(this);
    QString version = "V1.3.0";
    setWindowTitle(QString("OsgDemo %1(作者:红模仿 QQ21497936 博客地址: blog.csdn.net/qq21497936)").arg(version));
    initOsg();
}

void OsgWidget::resizeEvent(QResizeEvent *event)
{
    if(_pGLWidget != 0)
    {
        _pGLWidget->move(0,0);
        _pGLWidget->resize(rect().size());
    }
}

void OsgWidget::initOsg()
{
    // 使用osgQt步骤示例
    // 定义
//    osg::ref_ptr _pViewer;
//    osg::ref_ptr _pViewport;
//    osgQt::GLWidget * _pGLWidget;
//    osgQt::GraphicsWindowQt* _pGraphicsWindowQt;
    // 步骤一:初始化qt窗口系统
    osgQt::initQtWindowingSystem();
    // 步骤二:创建视口
    _pViewer = new osgViewer::Viewer;
    // 步骤三:视口设为单线程(Qt5必须)
    _pViewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
    // 步骤四:对视图的操作,必须,否则无法显示黑屏
    _pViewer->setCameraManipulator(new osgGA::TrackballManipulator);
    // 步骤五:视口操作
//    _pViewer->setSceneData(osgDB::readNodeFile("glider.osg"));
    // 步骤六:设置osgQt视口(一个应用程序用opgQt同一时刻只能设置一个视口)
    osgQt::setViewer(_pViewer.get());
    // 步骤七:创建窗口(2个都要,只创建osgQt::GLWidget会挂掉)
//    _pGLWidget = new osgQt::GLWidget();
    _pGLWidget = new osgQt::GLWidget(this);
    _pGraphicsWindowQt = new osgQt::GraphicsWindowQt(_pGLWidget);
    // 步骤八:设置视口
    _pViewport = new osg::Viewport(0, 0, _pGLWidget->width(), _pGLWidget->height());
    // 步骤九:设置摄像机视口范围,未设置不会显示,即窗口一片黑(刷新窗口但没有内容显示)
    _pViewer->getCamera()->setViewport(_pViewport);
    // 步骤十:设置刷新显示内容,未设置不会显示,即一片白(不会刷新窗口)
    _pViewer->getCamera()->setGraphicsContext(_pGraphicsWindowQt);
    // 步骤十一:显示
    _pGLWidget->show();
    _pGLWidget->lower();
}

void OsgWidget::loadOsg(QString osgFilePath)
{
    _pViewer->setSceneData(osgDB::readNodeFile(osgFilePath.toStdString()));
}

void OsgWidget::on_pushButton_open_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(0, "打开...", QString(""), "osg(*.osg)");
    if(!filePath.isEmpty())
    {
        _pViewer->setSceneData(osgDB::readNodeFile(filePath.toStdString()));
    }
}

工程模板:对应版本号1.3.0

        对应版本号v1.3.0

 

原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/94734036

你可能感兴趣的:(Qt开发专栏,OSG,OSG三维开发专栏)