#pragma once
#include <qopenglwidget>
#include <osgViewer/Viewer>
#include <osg/Node>
class OsgCanvas2 :public QOpenGLWidget {
public:
OsgCanvas2(QWidget *parent);
~OsgCanvas2();
private:
void init();
virtual void initializeGL();
virtual void resizeGL(int w, int h);
virtual void paintGL();
private:
osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _graphicsContext;
osg::ref_ptr<osgViewer::Viewer> _viewer;
osg::ref_ptr<osg::Group> _root;
};
#include "OsgCanvas2.h"
#include <osgDB/ReadFile>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osg/GraphicsContext>
OsgCanvas2::OsgCanvas2(QWidget *parent)
:QOpenGLWidget(parent){
init();
}
OsgCanvas2::~OsgCanvas2() {
}
void OsgCanvas2::init() {
int w = width();
int h = height();
_graphicsContext = new osgViewer::GraphicsWindowEmbedded(0, 0, w, h);
_root = new osg::Group;
osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("F:\\OSG_Qt5.10_64\\OpenSceneGraph-Data-3.0.0\\xyz.osgt");
_root->addChild(cow);
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(_graphicsContext);
camera->setViewport(new osg::Viewport(0, 0, w, h));
camera->setProjectionMatrixAsPerspective(30.0, w / (double)h, 1.0, 10000.0);
camera->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 0.5));
_viewer = new osgViewer::Viewer;
#if 1
const osg::BoundingSphere bs = _root->getBound();
osg::Vec3d eye = osg::Vec3(bs.center().x(), -bs.center().y()*10, bs.center().z());
osg::Vec3d center = bs.center();
osg::Vec3d up = osg::Vec3(0.0, 0.0, 1.0);
camera->setViewMatrixAsLookAt(eye, center, up);
#else
_viewer->setCameraManipulator(new osgGA::TrackballManipulator);
#endif
_viewer->setCamera(camera);
_viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
_viewer->addEventHandler(new osgViewer::WindowSizeHandler);
_viewer->setSceneData(_root);
}
void OsgCanvas2::initializeGL() {
}
void OsgCanvas2::resizeGL(int w, int h) {
_graphicsContext->resized(0, 0, w, h);
}
void OsgCanvas2::paintGL() {
_viewer->frame();
}
