OSGEarth嵌入Qt的QGraphicsView框架(二)
来源:互联网 发布:淘宝卖玉的哪家好 编辑:程序博客网 时间:2024/06/03 05:33
上一篇处理了QGraphicsView的鼠标、按键事件,本篇接着嵌入OSGEarth。
新建一继承自EventAdapter(一)的类GraphicsView,完成OSGEarth的嵌入工作。实现思路是QGraphicsView的Viewport用OpenGL来绘制,这样才可以完全OSG的update。而要完成每帧的更新,则需要一个定时器,每隔10ms更新一次,即每10ms调用一次OSG的frame操作。
实现代码:graphicsview.h
class GraphicsView : public EventAdapter{ Q_OBJECTpublic: GraphicsView(QWidget* parent = 0); ~GraphicsView(); osgViewer::Viewer* getOSGViewer(){ return m_pViewer; } osg::Group* getRoot(){ return m_pSceneData; } osgEarth::MapNode* getMapNode(){ return m_pMapNode; } const osgEarth::SpatialReference* getSRS(){ return m_pMapSRS; } osgEarth::Util::EarthManipulator* getManipulator(){ return m_pEarthManipulator; }protected: // 完成OSG每一帧的update操作 virtual void drawBackground(QPainter *painter, const QRectF& rect); virtual void timerEvent(QTimerEvent *event);private: void init();private: osgEarth::Map* m_pMap; osg::Group* m_pSceneData; osg::StateSet* m_pStateSet; osgViewer::Viewer* m_pViewer; osgEarth::MapNode* m_pMapNode; osgEarth::Util::SkyNode* m_pSkyNode; const osgEarth::SpatialReference* m_pMapSRS; osgEarth::Util::EarthManipulator* m_pEarthManipulator;};
几个get方法,获取OSGEarth相关的Viewer、Group、MapNode、SpatialReference、EarthManipulator等给外部使用。
实现代码:graphicsview.cpp
GraphicsView::GraphicsView(QWidget *parent){ this->setScene(new QGraphicsScene); init();}GraphicsView::~GraphicsView(){}void GraphicsView::init(){ // QGraphicsView的Viewport一定要设置为QGLWidget,因为只有这样才能用OpenGL来对OSG进行更新 QGLWidget* glViewPort = new QGLWidget; glViewPort->setMouseTracking(true); glViewPort->setMaximumSize(2000, 2000); this->setViewport(glViewPort); this->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); startTimer(10); osg::Group* pRoot = new osg::Group; pRoot->setName("root"); m_pSceneData = new osg::Group; m_pSceneData->setName("SceneData"); m_pStateSet = new osg::StateSet; m_pStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); pRoot->setStateSet(m_pStateSet); pRoot->addChild(m_pSceneData); // 使用earth文件的方式进行数据加载,驱动为TMS osg::Node* node = osgDB::readNodeFile("../LiuPanShui.earth"); if (node) { m_pMapNode = osgEarth::MapNode::findMapNode(node); m_pMapNode->setName("MapNode"); m_pMap = m_pMapNode->getMap(); m_pMapSRS = m_pMapNode->getMapSRS(); } m_pViewer = new osgViewer::Viewer; m_pEarthManipulator = new osgEarth::Util::EarthManipulator; m_pEarthManipulator->getSettings()->setMinMaxPitch(-90.0, -7.0); m_pViewer->setCameraManipulator(m_pEarthManipulator); m_pViewer->addEventHandler(new osgViewer::StatsHandler); m_pViewer->addEventHandler(new osgGA::StateSetManipulator(m_pViewer->getCamera()->getOrCreateStateSet())); m_pViewer->getCamera()->addCullCallback(new osgEarth::Util::AutoClipPlaneCullCallback(m_pMapNode)); m_pViewer->getCamera()->setNearFarRatio(0.0000002); m_pViewer->getCamera()->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES); m_pViewer->setUpViewerAsEmbeddedInWindow(0, 0, width(), height()); m_pViewer->setSceneData(pRoot); m_pGraphicsWindow = dynamic_cast<osgViewer::GraphicsWindow*>( m_pViewer->getCamera()->getGraphicsContext()); m_pEarthManipulator->setViewpoint(osgEarth::Util::Viewpoint( 104.81443, 26.60379, 1811.2336, 0.0, -90.0, 5000)); m_pSkyNode = osgEarth::Util::SkyNode::create(m_pMapNode); m_pSkyNode->setName("SkyNode"); // 设置时间; osgEarth::DateTime dateTime(2015, 8, 15, 6); osgEarth::Util::Ephemeris* ephemeris = new osgEarth::Util::Ephemeris; m_pSkyNode->setEphemeris(ephemeris); m_pSkyNode->setDateTime(dateTime); m_pSkyNode->attach(m_pViewer, 0); m_pSkyNode->setLighting(true); m_pSkyNode->addChild(m_pMapNode); pRoot->addChild(m_pSkyNode);}void GraphicsView::timerEvent(QTimerEvent *event){ this->scene()->update();}void GraphicsView::drawBackground(QPainter *painter, const QRectF& rect){ if (painter->paintEngine()->type() != QPaintEngine::OpenGL2) { return; } // Save the painter state painter->save(); painter->beginNativePainting(); // OSG帧更新 m_pViewer->frame(); painter->endNativePainting(); painter->restore();}
0 0
- OSGEarth嵌入Qt的QGraphicsView框架(二)
- OSGEarth嵌入Qt的QGraphicsView框架(一)
- Qt的QGraphicsView框架
- Qt的QGraphicsView框架
- Qt的QGraphicsView框架
- Qt的QGraphicsView框架
- Qt的QGraphicsView框架
- Qt的QGraphicsView框架
- osgEarth嵌入QT的QWidget
- Qt QGraphicsView framwork 图形视图框架
- QT QGraphicsView
- QGraphicsView 框架学习(一)、图形元素的编辑
- QGraphicsView 框架学习(一)、图形元素的编辑
- Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现
- Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现
- QGraphicsView 框架
- Ogre3D嵌入Qt框架
- Ogre3D嵌入Qt框架
- Java连接MySQL数据库
- 提取IP 地址(算法)
- SharePoint 2013 配置基于表单的身份认证
- HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源码泄露
- 算法复习之选择排序
- OSGEarth嵌入Qt的QGraphicsView框架(二)
- Java抽象类与接口的区别
- kotlin实现罗马数字和阿拉伯数字转换
- 学习笔记1
- IE浏览器开启对JavaScript脚本的支持
- Object-c中的点语法
- 牛人看过来
- [LeetCode]Regular Expression Matching(Unsolved)
- mysql通过DATE_FORMAT将错误数据恢复