最近也是因为项目需求,需要在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,后面就可以根据需要加载自己的三维场景进行自己的三维开发了!!!