之前的时候写过关于OSG在QT中显示的文章。
OSG在QT的中显示之一和
OSG在QT的中显示之二就是运用了比较简单的方式实现了,OSG在QT中的显示,显示使用QOpenGLWidget来实现。
#pragma once
#include <QOpenGLWidget>
#include <osgViewer/Viewer>
class QMouseEvent;
class View3DWidget :public QOpenGLWidget,public osgViewer::Viewer{
public:
View3DWidget(QWidget * parent = nullptr);
~View3DWidget();
void setOSGData();
private:
virtual void initializeGL()override;
virtual void resizeGL(int w, int h)override;
virtual void paintGL()override;
private:
osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _osgGraphicsWindow;
osg::ref_ptr<osg::Group> _root;
};
#include <QMouseEvent>
#include "View3DWidget.h"
#include "osgViewer/ViewerEventHandlers"
#include "osgDB/ReadFile"
#include "osgGA/TrackballManipulator"
#include "osgGA/StateSetManipulator"
View3DWidget::View3DWidget(QWidget * parent)
:QOpenGLWidget(parent){
_osgGraphicsWindow = new osgViewer::GraphicsWindowEmbedded(0, 0, width(), height());
getCamera()->setGraphicsContext(_osgGraphicsWindow);
getCamera()->setViewport(new osg::Viewport(0, 0, width(), height()));
getCamera()->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 1.0));
getCamera()->setProjectionMatrixAsPerspective(30.0f,
static_cast<double>(width()) / static_cast<double>(height()),
1.0f,
10000.0f);
setCameraManipulator(new osgGA::TrackballManipulator);
setThreadingModel(osgViewer::Viewer::SingleThreaded);//创建为单线程
addEventHandler(new osgGA::StateSetManipulator(getCamera()->getOrCreateStateSet()));
addEventHandler(new osgViewer::WindowSizeHandler);
addEventHandler(new osgViewer::StatsHandler);
}
View3DWidget::~View3DWidget() {
}
void View3DWidget::initializeGL() {
}
void View3DWidget::resizeGL(int w, int h) {
_osgGraphicsWindow->getEventQueue()->windowResize(0, 0, w, h);
_osgGraphicsWindow->resized(0, 0, w, h);
}
void View3DWidget::paintGL() {
frame();
}
void View3DWidget::setOSGData() {
_root = new osg::Group;
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("F:\\cow.osg");
_root->addChild(node);
this->setSceneData(_root);
update();
}
具体引用:
_view3DWidget = new View3DWidget();
_view3DWidget->setOSGData();
ui.verticalLayoutOSG->addWidget(_view3DWidget);
实现效果:
aaa