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


推荐阅读
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
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社区 版权所有