热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OSG嵌入Qt窗口中+实时渲染数据输出

实现方式1、首先设置一个Qt下的一个窗口基类;2、窗口基类继承自一个重写的QGLWidget类和一个osgViewer::Viewer类3、重新QGLWidget类&

实现方式
1、首先设置一个Qt下的一个窗口基类;
2、窗口基类继承自一个重写的QGLWidget类和一个osgViewer::Viewer类
3、重新QGLWidget类,实现OSG在windows窗口的使能。
4、更新窗口继承类,重写构造函数和virtual void initializeGL();
virtual void paintGL();函数。
窗口基类

#ifndef QTOSGVRWIDGET_H
#define QTOSGVRWIDGET_H#include
#include "qtosgviewerwidget.h"
#include "Include.h"class QtOSGVRWidget : public QtOSGViewerWidget, public osgViewer::Viewer
{
public:~QtOSGVRWidget();QtOSGVRWidget(QWidget * parent &#61; 0, const char * name &#61; 0, const QGLWidget * shareWidget &#61; 0, WindowFlags f &#61; 0):QtOSGViewerWidget(parent, name, shareWidget, f){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(&m_timer, SIGNAL(timeout()), this, SLOT(updateGL()));m_timer.start(10);}
private:virtual void initializeGL();virtual void paintGL();
private:std::fstream myfile1;std::fstream myfile;QTimer m_timer;unsigned char *buf;unsigned char *buftrtr;unsigned short *buf1;unsigned short *buf2;};#endif // QTOSGVRWIDGET_H#include "qtosgvrwidget.h"QtOSGVRWidget::~QtOSGVRWidget()
{myfile1.close();myfile.close();
}void QtOSGVRWidget::initializeGL()
{glClearColor(1.0, 0.2, 0.3, 1.0);glShadeModel(GL_SMOOTH);glEnable(GL_DEPTH);this->setMaximumSize(512, 512);this->setMinimumSize(512, 512);buf &#61; new unsigned char[width()*height()*3];buftrtr &#61; new unsigned char[width()*height()*3];buf1 &#61; new unsigned short[width()*height()];buf2 &#61; new unsigned short[width()*height()];myfile1.open("F-22-hei.raw", std::ios::binary | std::ios::out | std::ios::app);myfile.open("F-22.raw", std::ios::binary | std::ios::out | std::ios::app);
}void QtOSGVRWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存glLoadIdentity();frame();#if 1int w &#61; width();int h &#61; height();glReadPixels(0, 0, width(), height(), GL_RGB, GL_UNSIGNED_BYTE, buf);for (int i &#61; 0; i < width()*height()*3; i&#43;&#43;){buftrtr[i] &#61; buf[width()*height()*3-1-i];}for (int i &#61; 0; i < width()*height()*3 - 3; ){if (i < width()*height()*3 - 3){unsigned char tmp1 &#61; buftrtr[i];unsigned char tmp2 &#61; buftrtr[i&#43;1];unsigned char tmp3 &#61; buftrtr[i&#43;2];buftrtr[i] &#61; tmp3;buftrtr[i&#43;1] &#61; tmp2;buftrtr[i&#43;2] &#61; tmp1;i&#43;&#61;3;}}myfile.write((char*)buftrtr, width()*height()*3);//delete []buf;//buf &#61; nullptr;glReadPixels(0, 0, width(), height(), GL_RED, GL_UNSIGNED_SHORT, buf1);for (int i &#61; 0; i < width()*height(); i&#43;&#43;){buf2[i] &#61; buf1[width()*height()-1-i];}myfile1.write((char*)buf2, width()*height()*2);#endif//delete []buf1;//buf1 &#61; nullptr;
}

重写的QGLWidget类

#ifndef QTOSGVIEWERWIDGET_H
#define QTOSGVIEWERWIDGET_H#include
#include "Include.h"using Qt::WindowFlags;class QtOSGViewerWidget : public QGLWidget
{Q_OBJECTpublic:QtOSGViewerWidget(QWidget *parent);QtOSGViewerWidget(QWidget * parent &#61; 0, const char * name &#61; 0, const QGLWidget * shareWidget &#61; 0, WindowFlags f &#61; 0);~QtOSGViewerWidget();osgViewer::GraphicsWindow* getGraphicsWindow();const osgViewer::GraphicsWindow* getGraphicsWindow() const;
private:virtual void initializeGL();virtual void resizeGL( int width, int height );virtual void paintGL();
private:osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> m_gw;
};#endif // QTOSGVIEWERWIDGET_H#include "qtosgviewerwidget.h"QtOSGViewerWidget::QtOSGViewerWidget(QWidget *parent): QGLWidget(parent)
{}QtOSGViewerWidget::QtOSGViewerWidget(QWidget * parent /*&#61; 0*/, const char * name /*&#61; 0*/, const QGLWidget * shareWidget /*&#61; 0*/, WindowFlags f /*&#61; 0*/)
{m_gw &#61; new osgViewer::GraphicsWindowEmbedded(0,0,width(),height());setFocusPolicy(Qt::ClickFocus);
}QtOSGViewerWidget::~QtOSGViewerWidget()
{
}osgViewer::GraphicsWindow* QtOSGViewerWidget::getGraphicsWindow()
{return m_gw.get();
}const osgViewer::GraphicsWindow* QtOSGViewerWidget::getGraphicsWindow() const
{return m_gw.get();
}void QtOSGViewerWidget::initializeGL()
{glClearColor(1.0, 0.2, 0.3, 1.0);glShadeModel(GL_SMOOTH);glEnable(GL_DEPTH);
}void QtOSGViewerWidget::resizeGL(int width, int height)
{m_gw->getEventQueue()->windowResize(0, 0, width, height );m_gw->resized(0,0,width,height);
}void QtOSGViewerWidget::paintGL()
{}

嵌入Qt窗口

#ifndef QTMYOSGWIDGET_H
#define QTMYOSGWIDGET_H#include
#include "qtosgvrwidget.h"
#include "SkyModel.h"
#include "MyNodeCallback.h"
#include "ui_qtmyosgwidget.h"class QtMyOSGWidget : public QWidget
{Q_OBJECTpublic:QtMyOSGWidget(QWidget *parent &#61; 0);~QtMyOSGWidget();private:Ui::QtMyOSGWidget ui;CMyNodeCallback *m_pmyNode;
};#endif // QTMYOSGWIDGET_H#include
#include "MyOSGCamera.h"
#include "MyNodeCallback.h"
#include "qtmyosgwidget.h"QtMyOSGWidget::QtMyOSGWidget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);QtOSGVRWidget *myVROSG &#61; new QtOSGVRWidget;osg::ref_ptr<osg::Node> loadedModel &#61; osgDB::readNodeFile("F-22.ive");osg::ref_ptr<osg::Node> myF35Node &#61; osgDB::readNodeFile("F35IR.ive");//设置初始位置osg::ref_ptr<osg::PositionAttitudeTransform> chposF35 &#61; new osg::PositionAttitudeTransform;osg::Quat quat(osg::DegreesToRadians(30.0), osg::Y_AXIS); //姿态chposF35->setAttitude(quat);chposF35->addChild(myF35Node.get());//位置chposF35->setPosition(osg::Vec3(0, 0, 0));chposF35->setName("F-35");//加入天空盒子CSkyBox mysky;osg::ref_ptr<osg::Node> myNodesky &#61; mysky.createSkyBox();//设置初始位置osg::ref_ptr<osg::PositionAttitudeTransform> chposSkyBox &#61; new osg::PositionAttitudeTransform;//姿态chposSkyBox->addChild(myNodesky.get());//chposSkyBox->setPosition(osg::Vec3(10, 10, 10));chposSkyBox->setName("skybox");osg::ref_ptr<osg::Group> myroot &#61; new osg::Group;myroot->addChild(loadedModel);//加入根节点myroot->addChild(chposF35.get());//加入根节点myroot->addChild(myNodesky.get());myVROSG->setCameraManipulator(new MyOSGCamera);m_pmyNode &#61; new CMyNodeCallback();myroot->addEventCallback(m_pmyNode);myVROSG->setSceneData(myroot.get());QGridLayout *playout &#61; new QGridLayout;playout->addWidget(myVROSG);setLayout(playout);
}QtMyOSGWidget::~QtMyOSGWidget()
{}//可以把此处多余的编译的头文件去掉&#xff0c;不影响编译

include.h

#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #ifdef _DEBUG
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "OpenThreadsd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgUtild.lib")
#pragma comment(lib, "osgTextd.lib")
#pragma comment(lib, "osgWidgetd.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "osgShadowd.lib")
#pragma comment(lib, "osgAnimationd.lib")
#pragma comment(lib, "osgParticled.lib")
#pragma comment(lib, "osgQtd.lib")
#else
#pragma comment(lib, "osg.lib")
#pragma comment(lib, "osgDB.lib")
#pragma comment(lib, "osgViewer.lib")
#pragma comment(lib, "OpenThreads.lib")
#pragma comment(lib, "osgGA.lib")
#pragma comment(lib, "osgUtil.lib")
#pragma comment(lib, "osgText.lib")
#pragma comment(lib, "osgWidget.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "osgShadow.lib")
#pragma comment(lib, "osgAnimation.lib")
#pragma comment(lib, "osgParticle.lib")
#pragma comment(lib, "osgQt.lib")
#endif

运行效果图&#xff1a;
在这里插入图片描述


推荐阅读
  • SparkMLlib提供了一些基本的统计学的算法,下面主要说明一下:1、Summarystatistics对于RDD[Vector]类型,SparkMLlib提供了colStats ... [详细]
  • 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员或静态方法#只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变 ... [详细]
  • 1.关于new:new单个对象new在自由空间分配内存,但其无法为其分配的对象命名,因次是无名的,分配之后返回一个指向该对象 ... [详细]
  • 关于自定义View,相信多数开发者都已经非常熟悉了,网络上的例子也非常多,各种炫酷吊炸天的自定义View也层出不穷。本文只是一个初级学习教程,对于初学者有参考价值。下面正式进入主 ... [详细]
  • 一、下载并解压缩wxWidgets  1.到http:www.wxwidgets.orgdownloads下载一个wxMSW版本的wxWidgets。(wxMSW是专门针对Windows系 ... [详细]
  • 自定义RecyclerView添加EmptyView
    你知道RecyclerView里没有Em ... [详细]
  • IEEE754浮点数指针方式转换程序usingSystem;usingSystem.Runtime.InteropServices;namespaceCSPointer{** ... [详细]
  • 1.html页面如何使用swiper对swiper不熟练的小伙伴们可能不知道怎么开始使用它,那么下面就让我来简单讲述一下关于swiper的使用流程,这 ... [详细]
  • 原理:    在父组件中使用axios获取异步数据传给子组件,但是发现子组件在渲染的时候并没有数据,在created里面打印也是空的,结果发现一开始子组件绑定的数据是空的,在请求数据没有返回数据时,子组件就已经加载了,并且他绑定的值也是空的使用vuex全局状态管理,其实简单,利用vuex的辅助函数(mapState,mapMutations)mapState是将st ... [详细]
  • 使用IGP和BGP的配合达到降低路由容量目的的实验与总结
    本文描述了OSPF和BGP配合来降低路由器的容量压力的实验和总结,有助于对IGP协议和BGP协议的互 ... [详细]
  • Python对象特性0x01:所有Python对象都有三个特性以及属性*身份:每一个对象都有一个唯一的身份标识自己,任何一个都可以用内建函数id()来得到。*类型:决定了可以保存什 ... [详细]
  • 文件。C#中的AppendAllText(字符串、字符串、编码)方法,示例 ... [详细]
  • Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[0]情况]
    题目链接题目大意:就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉解题思路& ... [详细]
  • 没有得到任何错误,所有数据似乎都有效.出于某种原因,正在调用与视图相关的方法.我确定了以下内容:getItemCount()是唯一被调用的适配器方法,并返回一个正整数值,(我知道 ... [详细]
  • poj 2421 Constructing Roads 解题报告
    题目链接:http:poj.orgproblem?id2421实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是, ... [详细]
author-avatar
萱筱璧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有