热门标签 | 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;
在这里插入图片描述


推荐阅读
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • This post discusses an issue encountered while using the @name annotation in documentation generation, specifically regarding nested class processing and unexpected output. ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
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社区 版权所有