OSG嵌入到Qt5

在QT中搭建OSG开发环境 一、前言 之所以想在QT中搭建OSG开发环境,主要是因为工作中用QT为比较多(虽然目前用的不多,但师傅说我们主要用这个),前段时间开始研究OSG这个东东,发现绝大多数教程介绍的便是用VS进行开发,很少有用QT进行开发的例子,甚至有网友直接建议不要用QT进行OSG开发。但一是本人确实需要用QT,二是,我的犟脾气确实是想试试…… 二、具体方法  之前在博客里转了一篇相关的博文,提到的是要添加外部... 阅读详情

OSG版本:3.6.5    32位

Qt版本:5.12.4      32位

VS版本:VS2017

找了一天,发现了这样一段代码,实现了OSG嵌入到Qt5中。

代码如下:

#include <QApplication>
#include <QMainWindow>
#include <QOpenGLWidget>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QDesktopWidget>
#include <QScreen>
#include <QtGlobal>
#include <QWindow>

#include <osg/ref_ptr>
#include <osgViewer/GraphicsWindow>
#include <osgViewer/Viewer>
#include <osg/Camera>
#include <osg/ShapeDrawable>
#include <osg/StateSet>
#include <osg/Material>
#include <osgGA/EventQueue>
#include <osgGA/TrackballManipulator>

#include <iostream>
#include <stdio.h>

class QtOSGWidget : public QOpenGLWidget
{
public:
	QtOSGWidget(qreal scaleX, qreal scaleY, QWidget* parent = 0)
		: QOpenGLWidget(parent)
		, _mGraphicsWindow(new osgViewer::GraphicsWindowEmbedded(this->x(), this->y(),
			this->width(), this->height()))
		, _mViewer(new osgViewer::Viewer)
		, m_scaleX(scaleX)
		, m_scaleY(scaleY)
	{
		osg::Cylinder* cylinder = new osg::Cylinder(osg::Vec3(0.f, 0.f, 0.f), 0.25f, 0.5f);
		osg::ShapeDrawable* sd = new osg::ShapeDrawable(cylinder);
		sd->setColor(osg::Vec4(0.8f, 0.5f, 0.2f, 1.f));
		osg::Geode* geode = new osg::Geode;
		geode->addDrawable(sd);

		osg::Camera* camera = new osg::Camera;
		camera->setViewport(0, 0, this->width(), this->height());
		camera->setClearColor(osg::Vec4(0.9f, 0.9f, 1.f, 1.f));
		float aspectRatio = static_cast<float>(this->width()) / static_cast<float>(this->height());
		camera->setProjectionMatrixAsPerspective(30.f, aspectRatio, 1.f, 1000.f);
		camera->setGraphicsContext(_mGraphicsWindow);

		_mViewer->setCamera(camera);
		_mViewer->setSceneData(geode);
		osgGA::TrackballManipulator* manipulator = new osgGA::TrackballManipulator;
		manipulator->setAllowThrow(false);
		this->setMouseTracking(true);
		_mViewer->setCameraManipulator(manipulator);
		_mViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
		_mViewer->realize();
	}


	virtual ~QtOSGWidget() {}

	void setScale(qreal X, qreal Y)
	{
		m_scaleX = X;
		m_scaleY = Y;
		this->resizeGL(this->width(), this->height());
	}

protected:

	virtual void paintGL() {
		_mViewer->frame();
	}

	virtual void resizeGL(int width, int height)
	{
		this->getEventQueue()->windowResize(this->x()*m_scaleX, this->y() * m_scaleY, width*m_scaleX, height*m_scaleY);
		_mGraphicsWindow->resized(this->x()*m_scaleX, this->y() * m_scaleY, width*m_scaleX, height*m_scaleY);
		osg::Camera* camera = _mViewer->getCamera();
		camera->setViewport(0, 0, this->width()*m_scaleX, this->height()* m_scaleY);
	}

	virtual void initializeGL() {
		osg::Geode* geode = dynamic_cast<osg::Geode*>(_mViewer->getSceneData());
		osg::StateSet* stateSet = geode->getOrCreateStateSet();
		osg::Material* material = new osg::Material;
		material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
		stateSet->setAttributeAndModes(material, osg::StateAttribute::ON);
		stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
	}

	virtual void mouseMoveEvent(QMouseEvent* event)
	{
		this->getEventQueue()->mouseMotion(event->x()*m_scaleX, event->y()*m_scaleY);
	}

	virtual void mousePressEvent(QMouseEvent* event)
	{
		unsigned int button = 0;
		switch (event->button()) {
		case Qt::LeftButton:
			button = 1;
			break;
		case Qt::MiddleButton:
			button = 2;
			break;
		case Qt::RightButton:
			button = 3;
			break;
		default:
			break;
		}
		this->getEventQueue()->mouseButtonPress(event->x()*m_scaleX, event->y()*m_scaleY, button);
	}

	virtual void mouseReleaseEvent(QMouseEvent* event)
	{
		unsigned int button = 0;
		switch (event->button()) {
		case Qt::LeftButton:
			button = 1;
			break;
		case Qt::MiddleButton:
			button = 2;
			break;
		case Qt::RightButton:
			button = 3;
			break;
		default:
			break;
		}
		this->getEventQueue()->mouseButtonRelease(event->x()*m_scaleX, event->y()*m_scaleY, button);
	}

	virtual void wheelEvent(QWheelEvent* event)
	{
		int delta = event->delta();
		osgGA::GUIEventAdapter::ScrollingMotion motion = delta > 0 ?
			osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN;
		this->getEventQueue()->mouseScroll(motion);
	}

	virtual bool event(QEvent* event)
	{
		bool handled = QOpenGLWidget::event(event);
		this->update();
		return handled;
	}

private:

	osgGA::EventQueue* getEventQueue() const {
		osgGA::EventQueue* eventQueue = _mGraphicsWindow->getEventQueue();
		return eventQueue;
	}

	osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _mGraphicsWindow;
	osg::ref_ptr<osgViewer::Viewer> _mViewer;
	qreal m_scaleX, m_scaleY;
};

int main(int argc, char** argv)
{
	QApplication qapp(argc, argv);

	QMainWindow window;
	QtOSGWidget* widget = new QtOSGWidget(1, 1, &window);
	window.setCentralWidget(widget);
	window.show();

	return qapp.exec();
}

原文地址:https://gist.github.com/vicrucann/874ec3c0a7ba4a814bd84756447bc798

一、QT中创建OSG项目运行实例,初步实现版本 一般osg在vs2019编译器运行,只要配置相应的环境就能正常运行,但是如果要在qt中运行需要自己手动配置类才能正常运行,以下是qt中运行osg的一个示例。 阅读详情

相关推荐

OSG基础教程(二)osg嵌入Qt窗口(兼容Qt5)

将osg嵌入Qt。

hongfei_163的博客 4428

Osg使用osgQt与Qt结合使用(附项目)(1)

概述 在使用Qt成功编译出来Osg之后下一个将编写Qt应用,首先要应用的就是使用osgQt实现将Osg放入一个控件之中 Osg使用osgQt与Qt结合使用在网上有很多教程,但是都是一些代码,没有成完整的体系,这里后续将可运行的项目附上方便使用 开始的环境配置可以参考(win7也可使用): https://blog.youkuaiyun.com/weixin_40331125/article/det...

Outlier的博客 1万+

避坑指南:OSG嵌入Qt时你可能遇到的5大问题(附Qt5/Qt6差异对比)

本文深入探讨了将OSG嵌入Qt窗口时开发者常遇到的五大核心问题,包括架构选型、Qt5与Qt6版本差异、编译链接、运行时异常及性能优化。重点对比了基于QOpenGLWidget的自定义集成与使用osgQt模块的优劣,并提供了Qt5到Qt6迁移的关键注意事项与实战解决方案,帮助开发者高效避坑。

weixin_29306261的博客 368

使用Qt构建osgQt静态库在osg3.6.4中使用(附osgQt源码下载地址)

osgQt库在osg3.4以后就给取消了,现在一般使用osgQOpenGL库替代,但是网上能搜到的教程里,常见的使用方法,还是以osgQt居多,因此,逼得我只能自己去编译一套osgQt的库文件。有如下几个注意点。 首先是下载osgQt的地址,github上的osgQt实际上是osgQOpenGL的代码,我们要找osgQt的源码。 所使用的环境是ubuntu20.04,x86,Qt,qtCreator,系统自带的gcc和g++编译器。 注意,生成动态库可能会不太好用,最好生成静态库,即libosgQt.a文

baidu_31788709的博客 2194

避坑指南:osgEarth嵌入Qt常见问题及解决方案(基于OSG3.6.5)

本文详细解析了将三维地理引擎osgEarth嵌入Qt应用时,在环境配置、窗口渲染、事件循环及内存管理等方面的常见问题与解决方案。重点介绍了基于OSG3.6.5的编译依赖管理、osgQt的轻量级集成策略,以及如何协调Qt事件循环与OSG渲染线程,为开发者提供了一套实用的避坑指南和实现方式。

weixin_28339967的博客 111

OSG 3.6与Qt 5.13集成实践:将三维渲染嵌入Qt界面

三维可视化应用通常需要将高性能渲染引擎与桌面界面框架深度融合。OSG作为开源场景图系统,负责模型加载、光照与渲染;Qt则提供成熟的窗口、控件与事件机制。要让两者在同一进程协同工作,关键在于将OSG的渲染结果直接绘制到Qt控件上,并妥善管理渲染循环与事件分发。基于osgQt的GraphicsWindowQt控件,可以快速实现这一目标;通过CMake正确配置编译选项,并选择SingleThreaded线程模型,可避免常见的白屏、崩溃与交互卡顿问题。此类集成广泛适用于三维模型查看器、仿真软件、地理信息工具等需要“

weixin_33770878的博客 235

Centos7.2系统下,在Qt5.0中嵌入OSG

最近也是因为项目需求,需要在Centos7.2系统下用Qt5.0(现在最新版本已经到达Qt5.10.1),然后进行二三维场景的开发。对一个Linux系统和Qt的小白来讲,这是一件很痛苦的事,网上在Linux系统下用Qt的资源太少了,后来静下来通过读取网上的示例代码,最后有了一点点效果,现在先来写个总结,以后用着也方便。一、数据获取先给那个Qt的下载链接:http://download.qt.io/...

qq_38378235的博客 2055

Qt5与OSG/osgEarth无缝集成:自定义QOSGViewerWidget实现方案

本文详细介绍了在Qt5项目中实现与OSG/osgEarth无缝集成的自定义QOSGViewerWidget方案。针对官方osgQt模块维护滞后的问题,通过继承QOpenGLWidget和osgViewer::Viewer,并利用GraphicsWindowEmbedded作为桥梁,解决了Qt5界面与新版三维渲染引擎的兼容性问题,实现了事件处理、渲染刷新与窗口调整的自动化。

weixin_29266007的博客 418

qt5.15.2 qml QQuickFramebufferObject 嵌入osg370 GL3

qt5 qt6 qml 嵌入osg,osgearth3.4.0 quick

qq_38130818的博客 92

在Qt中嵌入OSG:使用开源场景图库实现高效可视化

OSG(OpenSceneGraph)是一个强大的开源场景图库,它提供了丰富的功能和性能优化,用于在计算机图形应用程序中创建交互式3D图形。本文将探讨如何在Qt应用程序中嵌入OSG,并展示一些相关的源代码示例。我们创建了一个OSG Viewer,并设置它的线程模型为SingleThreaded,这意味着OSG将在主线程中执行渲染循环。在代码的后面部分,我们将OSG Viewer的渲染窗口嵌入到QWidget中,并将其添加到布局管理器中。接下来,我们将创建一个基于Qt的应用程序,并在其窗口中嵌入OSG场景。

2301_79366106的博客 600

详解Unity中的粒子系统Particle System (三)

上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission、Shape、Renderer模块又在粒子系统中扮演着怎么样的作用吧。

梦小天幼的博客 1万+

OSG3.6集成到Qt5.13:渲染窗口嵌入与交互实践

桌面三维应用开发中,将三维渲染引擎嵌入传统GUI框架是常遇的工程挑战。以三维GIS、仿真可视化和点云浏览为代表的场景,往往需要在一个界面内同时管理场景渲染与窗体交互。OSG负责场景图组织与绘制,Qt则承担事件循环和控件布局,两者集成的核心在于渲染上下文的管理、帧循环驱动方式以及鼠标键盘事件的坐标系转换。理解这些原理,能够有效避免黑屏、事件错乱和退出崩溃等典型问题。在技术选型上,既可以使用官方osgQt模块快速落地,也可以基于QOpenGLWidget自研以实现更灵活的纹理共享。围绕OSG 3.6与Qt 5.

weixin_33755557的博客 242

GD32单片机引脚复用指南:如何让JTAG接口的PA15/PB3发挥第二功能?

本文详细介绍了GD32F103Cx系列单片机如何通过AFIO模块进行引脚复用,特别是将默认用于JTAG调试接口的PA15、PB3等引脚释放为普通IO或复用功能引脚。文章从原理出发,结合代码实践,讲解了如何配置调试端口重映射,将JTAG引脚安全地转换为GPIO或定时器通道,并提供了常见问题排查与最佳实践,帮助开发者高效利用有限的引脚资源。

nept的博客 807

Qt6.5.3与OSG3.6.5实战:从零实现3D模型嵌入窗口(附完整事件处理代码)

本文详细介绍了如何将Qt6.5.3与OSG3.6.5深度整合,实现工业级3D模型嵌入窗口的开发。从环境搭建、核心架构设计到高级渲染控制技巧,提供了完整的解决方案和事件处理代码,特别适合工业仿真和虚拟现实领域的开发者。

weixin_30823001的博客 413

从零开始:EAS2+Elmo+Maxon电机调试全流程(含电流环优化技巧)

本文详细解析了从零开始搭建基于EAS2软件、Elmo驱动器和Maxon电机的运动控制系统的全流程。内容涵盖硬件连接规范、EAS2基础配置、核心的电流环模型辨识与手动优化技巧,以及速度环、位置环的搭建与调试策略,旨在帮助工程师构建稳定、高性能的伺服控制核心。

i0j1k2l3m的博客 502

【深度学习】通俗易懂讲解循环神经网络LSTM

目录 1、循环神经网络(Recurrent Neural Networks) 2、长依赖存在的问题 3、LSTM 网络 4、LSTMs的核心思想 5、一步一步理解LSTM 6、LSTM的变种 7、总结 1、循环神经网络(Recurrent Neural Networks) 人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。...

Nieson2012的专栏 2728

OSG 3.6集成Qt 5.13:嵌入式三维渲染窗口的完整实现与踩坑记录

桌面三维可视化应用中,如何将三维渲染引擎与Qt界面深度融合,是很多开发者面临的现实问题。Qt作为跨平台UI框架,提供了强大的窗口管理和事件分发机制,而OSG则擅长场景图组织与渲染调度。通过理解QOpenGLWidget的渲染上下文与帧缓冲原理,利用GraphicsWindowEmbedded把OSG的帧循环挂接到Qt的绘制事件中,可以有效避免独立窗口带来的焦点错乱、尺寸不同步和交互割裂等痛点。这种嵌入方案不仅让三维视图与列表、表单等控件真正联动,也为水利仿真、设备状态监控等桌面三维应用提供了稳定的技术底座。

weixin_34216107的博客 240

torch.nn.rnn实现循环神经网络

------------------------------------nn.rnn模型实现。#------------------------------------模型实现。#-----------------------------------训练模型。#-----------------------------------训练模型。#--------------------------------读取数据。实现循环神经网络,并在至少一个数据集上进行实验,从训练时间、预测精度、...

matlab_python22的博客 2971

Qt5集成OSG/osgEarth

最近,编译了新版的osg和osgEarth库,发现在新版代码包中,osgQt模块已经单独剥离到一个项目中,不再和osg代码库一块发布了,而且osgQt目前基本已经很少更新,基本停留在之前的状态,对Qt5的支持也迟迟没有添加进来,但是实际使用中又需要将osg/osgEarth嵌入Qt窗体中使用,所以封装了QOSGViewerWidget类,可以很方便的将osgViewer嵌入Qt5中,...

【星天阁】 8515

数字电视中的AD(Audio Description)音频描述技术详解

AD(Audio Description)音频描述是一种辅助技术,旨在帮助视障人士更好地理解视觉内容。通过在节目或视频的自然停顿处插入额外的语音叙述来解释屏幕上的视觉信息,如人物动作、场景变化、文字说明等,从而让视力受损的人士也能获得完整的观影体验。AD服务不仅限于电视广播,也广泛应用于电影、剧院表演、在线视频平台等领域。PID:用于标识和区分不同的音频流。PMT表:提供每个音频流的详细信息,包括PID、编解码器类型和语言代码。时间戳:PTS和DTS用于同步音频与视频内容。解复用。

以实战经验介绍行业知识 739

COSMO-RS理论:流体相热力学预测的核心模型与技术突破

摘要:COSMO-RS模型通过量子化学计算分子表面电荷分布,实现了从微观量子尺度到宏观化工过程的热力学预测。该模型基于介电连续介质理论,将分子表面片段化处理,通过σ-剖面描述电荷分布,并计算片段间的静电失配能和氢键能。其核心算法通过自洽化学势方程求解活度系数,克服了传统模型依赖实验参数的局限。随着技术进步,模型引入了高阶描述符和色散力修正,提升了预测精度。在药物研发、化工分离等领域广泛应用,但仍存在对长程有序结构预测不足等局限性。该模型为复杂体系的热力学性质预测提供了重要理论工具。

ASKCOS博客 972

QT+osg+osgearth显示一个地球(进阶)

曾经我有一个版本,是用的别人的封装好的dll和lib,但是这样无法满足在liunx系统或者别的国产操作系统比如银河麒麟上跑这个程序。于是在网上查了很多资料,终于实现了我的需求,一般在其他系统上运行的osg+osgearth是比较好编译的,但是osgqt在osgearth3.0版本就没有了,在网上找了好久,终于找到了可以运行的源码,直接.h和.cpp的加入到项目中,这样就不影响在liunx系统上运行。

Jinyizhi2233的博客 5830

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

目前认为最简单的:利用VS将OSG嵌入到Qt的一个控件内的方法

参考了:Qt 中嵌套 OSG 窗口(两种思路带源码)https://blog.youkuaiyun.com/qq_34719188/article/details/92806907#_QOpenGLWidget__osgViewerViewer_204 注1:去掉了对外部事件的响应,重写了QOpenGLWidget中的resizeGL函数 注2:环境:OSG3.4.0,QT5.5.1,VS2010 注3:拖Q...

qq_42628900的博客 1071

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

初探OSG+OpenCascade(简称:OCC)在QT上的实践

因本人属于在OCC以及OSG领域是小白水平,因此文章可能存在错误的地方,恳请指正。 因为对几何建模比较有兴趣,而且受身边的人的影响,所以利用晚上和周末的时间写了一个简单的基于QT5+OCC7.0+OSG3.4的初级3D CAD(准确来说不算CAD,算是3D模型查看器)。 主要功能有: 读取3D文件,如图: 视角切换、按住滚轮拖动模型、放大缩小、视觉样式显示、导出文件功能。其他操作在接下来...

XXM的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【转】Qt5集成OSG/osgEarth简单方法,两个文件

最近,编译了新版的osg和osgEarth库,发现在新版代码包中,osgQt模块已经单独剥离到一个项目中,不再和osg代码库一块发布了,而且osgQt目前基本已经很少更新,基本停留在之前的状态,对Qt5的支持也迟迟没有添加进来,但是实际使用中又需要将osg/osgEarth嵌入Qt窗体中使用,所以封装了QOSGViewerWidget类, 可以很方便的将osgViewer嵌入Qt5中,放出来与大家分享,用法也很简单,直接将以下两个文件保存为头文件和源文件,引入工程中 ...

智能指针C++的专栏 891

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 编译OSG3.6.3后无法加载png jpg图片的解决方法
下一篇: 集装箱装箱算法及系统
dreamcs
博客等级 码龄21年 124粉丝 161原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值