Centos7.2系统下,在Qt5.0中嵌入OSG

14 篇文章 2 订阅

最近也是因为项目需求,需要在Centos7.2系统下用Qt5.0(现在最新版本已经到达Qt5.10.1),然后进行二三维场景的开发。对一个Linux系统和Qt的小白来讲,这是一件很痛苦的事,网上在Linux系统下用Qt的资源太少了,后来静下来通过读取网上的示例代码,最后有了一点点效果,现在先来写个总结,以后用着也方便。

一、数据获取

先给那个Qt的下载链接:http://download.qt.io/archive/qt/

OSG下载链接:https://pan.baidu.com/s/1WqN9tjdSpiIJnwIUlxS3wQ 密码:i9nv

二、Linux系统下OSG编译及环境变量配置

OSG下载好以后需要对其进行编译。在Windows系统下使用编译比较简单,直接用CMake就行,网上教程很多,之前也编译过,现在主要给出Centos7.2系统下的编译,先安装CMake,然后从命令窗口直接进入到OpenSceneGraph下:

cd OpenSceneGraph  

./configure  

make  

sudo make install  

接着环境变量配置:

# vim ~/.bashrc

在打开的文件最后添加如下内容,具体地址要根据你的osg放置的地方和osg数据放置的位置来确定

export PATH = “${PATH}:/home/vge/OSG/OpenSceneGraph-3.0.1/bin”  

export LD_LIBRARY_PATH = “${LD_LIBRARY_PATH}:/home/vge/OSG/OpenSceneGraph-3.0.1/lib”  

export OSG_FILE_PATH = “/home/vge/OSG/OpenSceneGraph-Data-3.0.0:/home/vge/OSG/OpenSceneGraph-Data-3.0.0/Images”  

检验OSG是否可以在Linux系统下正常使用

cd /home/vge/OSG/OpenSceneGraph-3.0.1/bin

./osgviewer /home/vge/OSG/OpenSceneGraph-Data-3.0.0/cow.osg

此时就行出现OSG中提供的3D模型了

三、在Qt5.0中嵌入OSG

在进行这部分操作的时候最后对OpenGL或者OSG有一定的熟悉,不然很难调出一个最简单的代码,网上给的示例中,代码比较多,在初调试阶段有些完全用不上。

(1)      新建工程这块选择基类为QWidget

(2)      在.pro文件中加上

QT      +=opengl

(3)      右击项目,通过“添加库->外部库”将需要用到的OSG模块引入到项目中,

(4)      然后就可以写代码了

AdapterWidget.h】将原来继承的QWIDget改为QGLWidget

AdapterWidget.h

#ifndef ADAPTERWIDGET_H
#define ADAPTERWIDGET_H

#include <QWidget>
#include <QtOpenGL/QGLWidget>
#include <QApplication>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <QtCore/QString>
#include <QtCore/QTimer>
#include <QtGui/QKeyEvent>
#include <QtOpenGL/QGLWidget>
#include <QMainWindow>
#include <QMdiSubWindow>
#include <QMdiArea>
#include <iostream>



using Qt::WindowFlags;
class AdapterWidget : public QGLWidget
{
    Q_OBJECT
    
public:
    AdapterWidget(QWidget *parent = 0);
//    AdapterWidget(QWidget *parent = 0,const char*name=0,const QGLWidget*shareWidget=0,Qt::WindowFlags f=0 );
    ~AdapterWidget();

    osgViewer::GraphicsWindow* getGraphicsWindow()
    {
        return _gw.get();
    }
    const osgViewer::GraphicsWindow* getGraphicsWindow() const
    {
        return _gw.get();
    }

protected:
    void initializeGL();
    virtual void resizeGL(int width,int height);


    osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _gw;

};

#endif // ADAPTERWIDGET_H

【adapterwidget.cpp】

#include "adapterwidget.h"

AdapterWidget::AdapterWidget(QWidget *parent)
    : QGLWidget(parent)
{
    _gw=new osgViewer::GraphicsWindowEmbedded(0,0,width(),height());
    setFocusPolicy(Qt::ClickFocus);

}

AdapterWidget::~AdapterWidget()
{
    
}

void AdapterWidget::initializeGL()
{
}

void AdapterWidget::resizeGL(int width, int height)
{
    _gw->getEventQueue()->windowResize(0,0,width,height);
    _gw->resized(0,0,width,height);
}


//AdapterWidget::AdapterWidget(QWidget *parent, const char *name, const QGLWidget *shareWidget, Qt::WindowFlags f)
//{

//}

然后在新建一个类ViewerQt继承前面的AdapterWidget用来控制视角,鼠标键盘交互操作等,这里没有写交互功能的代码

【ViewerQt.h】

#ifndef VIEWERQT_H
#define VIEWERQT_H

#include "adapterwidget.h"
#include <osgViewer/Viewer>

class ViewerQT:public osgViewer::Viewer,public AdapterWidget
{
public:
//    ViewerQT();
    ViewerQT(QWidget *parent = 0);

    virtual void paintGL()
    {
        frame();
    }

protected:
    QTimer _timer;
};

#endif // VIEWERQT_H

【ViewerQt.cpp】

#include "viewerqt.h"

//ViewerQT::ViewerQT()
//{
//}


ViewerQT::ViewerQT(QWidget *parent):AdapterWidget(parent)
{
    getCamera()->setViewport(new osg::Viewport(0,0,width(),height()));
    getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width())/static_cast<double>(height()), 1.0f, 10000.0f);
    getCamera()->setGraphicsContext(getGraphicsWindow());

    setThreadingModel(osgViewer::Viewer::SingleThreaded);
    connect(&_timer,SIGNAL(timeout()),this,SLOT(updateGL()));//并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

    _timer.start(10);//使用start()来开始
}

接着就是在main函数中创建一个窗口,并获取一个OSG提供的3D模型在窗口中显示出来,这块需要提前将数据放在工程的根目录下。

【main.cpp】

#include "adapterwidget.h"
#include <QApplication>
#include "viewerqt.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    osg::ref_ptr<osg::Node>  loadedModel=osgDB::readNodeFile("cow.osg");
    ViewerQT * ViewerWindow=new ViewerQT;
    ViewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
    ViewerWindow->setSceneData(loadedModel.get());


    QMainWindow* mw=new QMainWindow();
    mw->showMaximized();
    mw->setCentralWidget(ViewerWindow);
    mw->show();
    a.connect(&a,SIGNAL(lastWindowClosed()),&a,SLOT(quit()));

//    AdapterWidget w;
//    w.show();
    
    return a.exec();
}

最后运行即可得到效果,

此刻大功告成,已经在Qt5.0中成功嵌入了OSG,后面就可以根据需要加载自己的三维场景进行自己的三维开发了!!!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值