当前位置: 首页 > article >正文

告别osgQt!用osgQOpenGLWidget在Qt6中轻松加载OsgEarth三维地球(附完整代码)

现代Qt6与OsgEarth集成实战osgQOpenGLWidget替代方案详解如果你正在使用Qt6开发三维地理可视化应用却苦于找不到合适的OpenSceneGraph(OSG)集成方案这篇文章将为你提供一条清晰的迁移路径。随着Qt和OSG版本的迭代传统的osgQt模块已无法满足现代开发需求而osgQOpenGLWidget的出现恰好填补了这一空白。1. 技术栈变迁与迁移必要性十年前osgQt曾是Qt中集成OSG的首选方案。但随着Qt5向Qt6的演进以及OSG 3.6的架构调整这套方案暴露出诸多兼容性问题。最典型的莫过于setWindowingSystemInterface接口的移除这直接导致旧代码在新环境下无法编译。新旧技术栈对比特性传统osgQt方案osgQOpenGLWidget方案Qt版本支持仅限Qt5及以下完整支持Qt6OSG版本要求3.4及更早版本3.6推荐渲染性能依赖Qt原生渲染管道直接使用OpenGL上下文维护状态已废弃活跃维护多窗口支持有限完整支持迁移到osgQOpenGLWidget不仅解决了兼容性问题还带来了额外优势更直接的OpenGL集成减少渲染管线中间层更好的Qt事件系统整合更现代的代码架构便于长期维护2. 环境配置与项目搭建2.1 依赖准备开始前需确保已安装以下组件Qt6开发环境建议6.2OSG 3.6.5或更高版本OsgEarth最新稳定版osgQOpenGL源码从GitHub获取关键配置步骤编译osgQOpenGL库git clone https://github.com/OpenSceneGraph/osgQt mkdir build cd build cmake .. -DOSG_DIR/path/to/osg -DQt6_DIR/path/to/Qt6 make -j8配置项目文件(.pro)QT core gui widgets opengl CONFIG c17 # OSG相关路径配置 OSG_DIR /path/to/osg OSGEARTH_DIR /path/to/osgearth INCLUDEPATH $${OSG_DIR}/include $${OSGEARTH_DIR}/include LIBS -L$${OSG_DIR}/lib -losgQOpenGL -losgEarth -losgEarthUtil2.2 常见编译问题解决问题1未找到osgQOpenGL头文件提示确保CMake正确生成了导出头文件并在项目中包含osgQOpenGL/osgQOpenGLWidget问题2链接时缺少符号LIBS -lOpenThreads -losgDB -losgGA -losgUtil -losgViewer问题3Qt6 OpenGL相关错误QT openglwidgets # 必须添加此模块3. 核心集成代码解析3.1 基础窗口搭建创建一个基本的Qt窗口并嵌入osgQOpenGLWidget#include osgQOpenGL/osgQOpenGLWidget #include QHBoxLayout class EarthViewer : public QWidget { public: EarthViewer(QWidget* parent nullptr) : QWidget(parent) { resize(1024, 768); QHBoxLayout* layout new QHBoxLayout(this); layout-setContentsMargins(0, 0, 0, 0); osgWidget new osgQOpenGLWidget(); layout-addWidget(osgWidget); connect(osgWidget, osgQOpenGLWidget::initialized, this, EarthViewer::initScene); } private slots: void initScene(); private: osgQOpenGLWidget* osgWidget; };3.2 地球场景初始化在initialized信号触发后设置地球场景void EarthViewer::initScene() { auto viewer osgWidget-getOsgViewer(); // 使用EarthManipulator实现地理导航 viewer-setCameraManipulator(new osgEarth::Util::EarthManipulator()); // 配置地形参数 osgEarth::Config terrainConfig; terrainConfig.add(elevation_smoothing, false); osgEarth::TerrainOptions terrainOpts(terrainConfig); // 加载.earth文件 osgEarth::MapNodeOptions mapNodeOpts; mapNodeOpts.setTerrainOptions(terrainOpts); osg::ref_ptrosgDB::Options options new osgDB::Options(); options-setPluginStringData(osgEarth.defaultOptions, mapNodeOpts.getConfig().toJSON()); osg::Node* earthNode osgDB::readNodeFile(world.earth, options); if (earthNode) { osgUtil::Optimizer optimizer; optimizer.optimize(earthNode); viewer-setSceneData(earthNode); } }4. 高级功能扩展4.1 多视口配置实现多窗口协同浏览// 创建第二个视口 osgQOpenGLWidget* secondaryView new osgQOpenGLWidget(); layout-addWidget(secondaryView); // 同步相机 auto syncCamera [] { auto mainCam osgWidget-getOsgViewer()-getCamera(); secondaryView-getOsgViewer()-getCamera()-setViewMatrix( mainCam-getViewMatrix()); }; QObject::connect(osgWidget, osgQOpenGLWidget::frameSwapped, syncCamera);4.2 性能优化技巧渲染优化配置// 在initScene中添加 viewer-getCamera()-setComputeNearFarMode( osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES); viewer-setThreadingModel(osgViewer::Viewer::SingleThreaded);推荐的场景图优化策略使用LOD节点管理不同缩放级别的内容对静态几何体应用顶点缓冲对象(VBO)合理设置纹理压缩格式启用视锥体剔除4.3 Qt-OSG事件交互处理鼠标悬停获取地理坐标bool EarthViewer::eventFilter(QObject* watched, QEvent* event) { if (event-type() QEvent::MouseMove) { auto mouseEvent static_castQMouseEvent*(event); osg::Vec3d worldCoord; if (osgWidget-getCoordinateAt(mouseEvent-pos(), worldCoord)) { qDebug() 经度: worldCoord.x() 纬度: worldCoord.y(); } } return QWidget::eventFilter(watched, event); }5. 调试与问题排查5.1 常见运行时错误黑屏问题检查清单验证.earth文件路径是否正确检查OSG_FILE_PATH环境变量设置确认所有插件都已正确加载查看控制台是否有着色器编译错误5.2 日志与调试输出启用详细日志记录osg::setNotifyLevel(osg::INFO); osgEarth::setNotifyLevel(osg::INFO);关键日志信息解读[info] Loading earth file: world.earth # 文件加载状态 [warn] Could not find imagery layer bing # 缺少图层 [fatal] Failed to create terrain # 地形创建失败5.3 内存管理最佳实践始终使用osg::ref_ptr管理OSG对象避免在Qt槽函数中直接创建OSG对象定期检查引用计数osgEarth::Registry::instance()-getObjectCount(); // 获取当前对象数量在实际项目中我发现最耗时的往往不是核心功能的实现而是各种环境配置和依赖管理问题。建议采用容器化技术如Docker来统一开发环境可以大幅减少在我机器上能运行的问题。

相关文章:

告别osgQt!用osgQOpenGLWidget在Qt6中轻松加载OsgEarth三维地球(附完整代码)

现代Qt6与OsgEarth集成实战:osgQOpenGLWidget替代方案详解 如果你正在使用Qt6开发三维地理可视化应用,却苦于找不到合适的OpenSceneGraph(OSG)集成方案,这篇文章将为你提供一条清晰的迁移路径。随着Qt和OSG版本的迭代,传统的osgQt…...

从CMIP6到SCI论文:气候降尺度全流程实战(含偏差校正与未来预估)-GCM数据降尺度、泰勒图评估及XGBoost机器学习建模指南

做水文气象、气候学、地理遥感、生态环境等领域的科研人&#xff0c;是不是都逃不过这些噩梦&#xff1a;尺度鸿沟难跨越&#xff1a;GCM 粗网格&#xff08;>100km&#xff09;和流域 / 城市精细尺度&#xff08;<10km&#xff09;不匹配&#xff0c;动力降尺度成本太高…...

Visio高效安装与激活全攻略:从零开始到成功运行

1. Visio安装前的准备工作 第一次安装Visio的朋友们&#xff0c;我强烈建议先做好这些准备工作。我自己在帮同事安装Visio时&#xff0c;经常遇到因为前期准备不足导致安装失败的情况。首先&#xff0c;检查你的电脑是否已经安装了其他版本的Office软件。如果之前安装过Office …...

2026.3.31 TRO成功和解案例 案件号:25-cv-25717,1000美金和解Palmer律所3000美金索赔,沃尔玛店铺全额解冻!

TRO经典案例案件概述案件号&#xff1a;25-cv-25717&#xff08;点击查看案件详情&#xff09;案件时间&#xff1a;2025-12-8收到TRO时间&#xff1a;2025-12-20销售平台&#xff1a;沃尔玛冻结金额&#xff1a;$209美金Palmer律所索赔额&#xff1a;$3,000美金侵权产品销售量…...

从v4l2-ctl命令到media拓扑:手把手教你调试RK3568上的OV8858摄像头图像

RK3568平台OV8858摄像头深度调试实战&#xff1a;从硬件链路到图像优化的全流程解析 当你在RK3568平台上调试OV8858摄像头时&#xff0c;是否遇到过这样的场景&#xff1a;设备树配置看似正确&#xff0c;但摄像头输出的图像却出现花屏、颜色异常或干脆没有信号&#xff1f;作为…...

CHORD-X构建自动化运维报告系统:服务器日志分析与日报生成

CHORD-X构建自动化运维报告系统&#xff1a;服务器日志分析与日报生成 最近和几个运维朋友聊天&#xff0c;发现他们每天都要花一两个小时写日报、周报。服务器状态、错误日志、性能趋势……这些数据分散在各个系统里&#xff0c;手动整理起来特别费劲。关键是&#xff0c;这种…...

文墨共鸣大模型入门指南:Ubuntu 20.04系统下的保姆级部署教程

文墨共鸣大模型入门指南&#xff1a;Ubuntu 20.04系统下的保姆级部署教程 想试试最近挺火的文墨共鸣大模型&#xff0c;但被复杂的部署步骤劝退了&#xff1f;别担心&#xff0c;这篇教程就是为你准备的。咱们今天不谈复杂的原理&#xff0c;就手把手教你&#xff0c;如何在Ub…...

Zotero中文文献管理终极指南:茉莉花插件一键解决三大痛点

Zotero中文文献管理终极指南&#xff1a;茉莉花插件一键解决三大痛点 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 如果你正在使…...

3个关键步骤:在电视盒子上完美运行Armbian系统的终极指南

3个关键步骤&#xff1a;在电视盒子上完美运行Armbian系统的终极指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk358…...

BUUCTF-[HITCON 2017]SSRFme

代码分析<?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) { //HTTP_X_FORWARDED_FOR可以获取客户端真正ip地址&#xff0c;和各个代理IP地址$http_x_headers explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]); //拆分字符串&#xff0c;以&#xff0c;分割$_SERVER[REMOTE…...

数据宝藏库:Awesome Public Datasets完整入门指南

数据宝藏库&#xff1a;Awesome Public Datasets完整入门指南 【免费下载链接】awesome-public-datasets A topic-centric list of HQ open datasets. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-public-datasets 你是否曾经为了寻找高质量的数据集而烦…...

别再死磕理论了!用Python+Pytorch实战多示例学习(MIL)图像分类,附完整代码

用PythonPytorch实战多示例学习图像分类&#xff1a;从数据到模型的完整指南 当你第一次听说"多示例学习"&#xff08;Multiple Instance Learning, MIL&#xff09;时&#xff0c;是不是也被那些抽象的理论弄得一头雾水&#xff1f;作为计算机视觉领域的重要技术&am…...

避开这5个坑!用MediaRecorder+Vue3实现高兼容性语音输入

Vue3MediaRecorder实战&#xff1a;5个关键技巧打造高兼容语音输入方案 在移动优先的时代&#xff0c;语音输入已成为提升用户体验的重要交互方式。但当你兴奋地在Vue3项目中集成MediaRecorder API时&#xff0c;可能会遇到iOS设备上的静默失败、Android机型上的格式兼容性问题…...

Claude技能开发实战指南:从入门到精通的认知升级路径

Claude技能开发实战指南&#xff1a;从入门到精通的认知升级路径 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-…...

SQL 基础及 MySQL DBA 运维实战 - 6:Mycat代理技术

MySQL DBA运维实战&#xff1a;集群与代理技术深度解析 引言 在现代互联网应用中&#xff0c;数据库的高可用性、可扩展性和性能是企业级应用的核心需求。随着业务量的增长&#xff0c;单一数据库服务器往往无法满足需求&#xff0c;此时数据库集群和代理技术成为解决这些问题…...

实战应用:使用快马平台为vmware17部署生成企业级健康检查与配置方案

在实际的企业IT环境中&#xff0c;部署VMware vSphere 17&#xff08;以下简称VMware 17&#xff09;这类虚拟化平台往往不是简单的安装过程&#xff0c;而是需要综合考虑硬件兼容性、系统配置、安全策略等多方面因素。为了确保部署过程的顺利和后续运行的稳定&#xff0c;我们…...

AI赋能开发:让快马平台智能理解并生成产区标准图交互应用

AI赋能开发&#xff1a;让快马平台智能理解并生成产区标准图交互应用 最近在做一个农产品产区标准查询系统的项目&#xff0c;发现用传统方式开发这类需求特别费时。比如要处理用户自然语言查询、动态生成地图、实现智能推荐逻辑&#xff0c;光写基础代码就得花好几天。后来尝…...

新手必看:在快马平台学习排列组合公式的代码实现

新手必看&#xff1a;在快马平台学习排列组合公式的代码实现 作为一个编程新手&#xff0c;当我第一次接触排列组合公式时&#xff0c;那些数学符号和递归逻辑让我一头雾水。直到在InsCode(快马)平台上找到了带详细注释的示例代码&#xff0c;才真正理解了Cn和An公式的实现原理…...

赋能音乐自由:Unlock Music技术解密与全场景应用指南

赋能音乐自由&#xff1a;Unlock Music技术解密与全场景应用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:…...

告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块

告别重复造轮子&#xff1a;用快马AI一键生成高复用性imToken集成代码模块 开发涉及钱包集成的DApp时&#xff0c;最让人头疼的就是那些重复性的基础代码。每次新项目都要重新写一遍连接钱包、处理授权、监听网络切换的逻辑&#xff0c;不仅浪费时间&#xff0c;还容易引入安全…...

终极窗口尺寸编辑器:SRWE让你的应用程序窗口自由伸缩

终极窗口尺寸编辑器&#xff1a;SRWE让你的应用程序窗口自由伸缩 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE Simple Runtime Window Editor (SRWE) 是一款革命性的开源工具&#xff0c;它能让你实时调整任何…...

音乐标签编辑器:让本地音乐元数据管理效率提升90%的开源工具

音乐标签编辑器&#xff1a;让本地音乐元数据管理效率提升90%的开源工具 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mu/…...

FanControl完全指南:5分钟掌握Windows风扇智能控制

FanControl完全指南&#xff1a;5分钟掌握Windows风扇智能控制 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...

如何用3dsconv解决3DS游戏格式兼容问题:从入门到精通的转换指南

如何用3dsconv解决3DS游戏格式兼容问题&#xff1a;从入门到精通的转换指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv …...

M2LOrder模型在STM32项目中的潜在应用:边缘设备情绪反馈

M2LOrder模型在STM32项目中的潜在应用&#xff1a;边缘设备情绪反馈 最近在捣鼓一个基于STM32的智能硬件项目&#xff0c;想给它加点“人情味”。比如&#xff0c;当用户对它说话时&#xff0c;它能感知到用户的情绪是开心还是沮丧&#xff0c;并给出更贴切的反馈。这听起来很…...

Audio2Face深度解析:音频驱动面部动画的技术架构与实战指南

Audio2Face深度解析&#xff1a;音频驱动面部动画的技术架构与实战指南 【免费下载链接】FACEGOOD-Audio2Face http://www.facegood.cc 项目地址: https://gitcode.com/gh_mirrors/fa/FACEGOOD-Audio2Face 在虚拟数字人快速发展的今天&#xff0c;如何让虚拟角色拥有自然…...

安卓应用按钮样式问题及解决方案

在开发安卓应用的过程中,我们常常会遇到一些看似简单但实际上隐藏着复杂问题的样式问题。今天我们来探讨一个在更换设备后按钮样式发生变化的问题。 问题描述 一位开发者在Android Studio中开发了一个食谱应用。当他从一台手机切换到另一台手机运行应用时,发现所有的按钮都…...

Sketch Measure: 设计标注自动化的创新实践

Sketch Measure: 设计标注自动化的创新实践 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在数字化产品开发流程中&#xff0c;设计稿到代码实现的转化始终…...

如何使用usearch构建精准视频内容推荐系统:基于观看历史的向量匹配方案

如何使用usearch构建精准视频内容推荐系统&#xff1a;基于观看历史的向量匹配方案 【免费下载链接】usearch Fast Open-Source Search & Clustering engine for Vectors & Arbitrary Objects in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoL…...

NSSCTF做题记录九 | [HUBUCTF 2022 新生赛]checkin

[HUBUCTF 2022 新生赛]checkin <?php show_source(__FILE__); //高亮显示当前代码 $username "this_is_secret"; //给$username赋值 $password "this_is_not_known_to_you"; //给$password赋值 include("flag.php");//here I chan…...