OSG嵌入QT的简明总结2
正文
我之前在这篇博文《OSG嵌入QT的简明总结》中论述了OSG在QT中显示的可视化问题。其中提到官方提供的osgQt项目(地址:https://github.com/openscenegraph/osgQt )很久前已经更新了。但是我一直没有时间同步更新,最近重新尝试了一下,还是有一些问题。
原先的osgQt版本是兼容Qt4的QGLWidget,这个类Qt官方准备废弃了,现在使用的OpenGL支持组件是QOpenGLWidget,新的osgQt项目就是基于这个类来进行扩展的。在项目中提供了一个例子osgviewerQt,我稍微试用了一下,将其修改成自己的代码时发现了问题,就是渲染的场景宽高比不正确,尤其是将窗体设置成很长或者很窄的时候。我还特意在这个项目中提交了issue:I tried the demo in the project, and the correct aspect ratio cannot be displayed。
后续也有人回答了这个问题,一个解决方案就是需要在初始化响应函数中设置相机投影矩阵的宽高比。我改写的例子如下:
#include <QApplication>
#include <QSurfaceFormat>
#include <iostream>
#include <osgDB/ReadFile>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <osgQOpenGL/osgQOpenGLWidget>
#include <osgUtil/Optimizer>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>int main(int argc, char* argv[]) {QSurfaceFormat format = QSurfaceFormat::defaultFormat();#ifdef OSG_GL3_AVAILABLEformat.setVersion(3, 2);format.setProfile(QSurfaceFormat::CoreProfile);format.setRenderableType(QSurfaceFormat::OpenGL);format.setOption(QSurfaceFormat::DebugContext);
#elseformat.setVersion(2, 0);format.setProfile(QSurfaceFormat::CompatibilityProfile);format.setRenderableType(QSurfaceFormat::OpenGL);format.setOption(QSurfaceFormat::DebugContext);
#endifformat.setDepthBufferSize(24);// format.setAlphaBufferSize(8);format.setSamples(8);format.setStencilBufferSize(8);format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);QSurfaceFormat::setDefaultFormat(format);QApplication app(argc, argv);osgQOpenGLWidget widget;QObject::connect(&widget, &osgQOpenGLWidget::initialized, [&widget] {// set up the camera manipulators.widget.getOsgViewer()->setCameraManipulator(new osgGA::TrackballManipulator());// add the state manipulatorwidget.getOsgViewer()->addEventHandler(new osgGA::StateSetManipulator(widget.getOsgViewer()->getCamera()->getOrCreateStateSet()));// add the thread model handlerwidget.getOsgViewer()->addEventHandler(new osgViewer::ThreadingHandler);// add the window size toggle handlerwidget.getOsgViewer()->addEventHandler(new osgViewer::WindowSizeHandler);// add the stats handlerwidget.getOsgViewer()->addEventHandler(new osgViewer::StatsHandler);// add the record camera path handlerwidget.getOsgViewer()->addEventHandler(new osgViewer::RecordCameraPathHandler);// add the LOD Scale handlerwidget.getOsgViewer()->addEventHandler(new osgViewer::LODScaleHandler);// add the screen capture handlerwidget.getOsgViewer()->addEventHandler(new osgViewer::ScreenCaptureHandler);// load the datastd::string filename = "C:/Data/001/010137001.obj";osg::ref_ptr<osg::Node> loadedModel = osgDB::readRefNodeFile(filename);// optimize the scene graph, remove redundant nodes and state etc.osgUtil::Optimizer optimizer;optimizer.optimize(loadedModel);widget.getOsgViewer()->setSceneData(loadedModel);//增加宽高比设置QSize size = widget.size(); float aspectRatio =static_cast<float>(size.width()) / static_cast<float>(size.height());widget.getOsgViewer()->getCamera()->setProjectionMatrixAsPerspective(60.f, aspectRatio, 1.f, 1000.f);return 0;});widget.resize(200, 600);widget.show();return app.exec();
}
上述例子确实可以让场景显示正常,即使窗体宽设置为200,高设置为600。不过我发现了另外一个问题,按S显示帧数的时候帧数比之前的解决方案低很多。之前的解决方案帧数可以达到200帧,但是这个解决方案帧数大概在90帧左右。
具体看了一下其封装的osgQOpenGLWidget的实现,我觉得可能有两个原因,第一个是渲染的帧函数中有同步锁,不知道会不会有所影响。第二个是这个解决方案获取的帧数好像是自己计算的,与OSG内部计算的帧数不同似乎也正常。不过我这里是不太敢用这个解决方案了,目前还是使用之前的解决方案,以后有机会还是自己研究一下其中的实现。
参考
- OpenSceneGraph + QOpenGLWidget - minimal example
- OSG 使用Qt的QOpenGLWidget
相关文章:
OSG嵌入QT的简明总结2
正文 我之前在这篇博文《OSG嵌入QT的简明总结》中论述了OSG在QT中显示的可视化问题。其中提到官方提供的osgQt项目(地址:https://github.com/openscenegraph/osgQt )很久前已经更新了。但是我一直没有时间同步更新,最近重新尝试了…...
日常中msvcp71.dll丢失怎样修复?分享5个修复方法
在 Windows 系统中,msvcp71.dll 是一个非常重要的动态链接库文件,它承载了许多应用程序和游戏的运行。如果您的系统中丢失了这个文件,那么您可能会遇到无法打开程序、程序崩溃或出现错误提示等问题。本文将介绍 5 个快速修复 msvcp71.dll 丢失…...
【腾讯云TDSQL-C Serverless 产品体验】使用 Python向TDSQL-C添加读取数据实现词云图
关于TDSQL-C Serverless介绍 TDSQL-C 是腾讯云自主研发的新一代云原生关系型数据库。 它融合了传统数据库、云计算和新硬件技术的优势,100%兼容 MySQL,为用户提供具有极致弹性、高性能、高可用性、高可靠性和安全性的数据库服务。 TDSQL-C 实现了超过百万每秒的高吞吐量,支持…...
服务器感染了.360、.halo勒索病毒,如何确保数据文件完整恢复?
导言: 数据的安全性至关重要,但威胁不断进化,.360、.halo勒索病毒是其中的令人担忧的勒索软件。本文91数据恢复将深入介绍.360、.halo勒索病毒,包括其威胁本质、数据恢复方法和如何采取预防措施来保护您的数据。 如果受感染的数据…...
BAT028:批量将文件修改日期后缀更新为最新修改日期
引言:编写批处理程序,实现批量将文件修改日期后缀更新为最新修改日期。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【…...
Visual Studio C++ 的 头文件和源文件
在Visual Studio C中,头文件(Header Files)和源文件(Source Files)是两种不同的文件类型,用于组织和管理C代码。 头文件(Header Files): 后缀名为.h或.hpp的文件…...
Scrapy框架中的Middleware扩展与Scrapy-Redis分布式爬虫
在爬虫开发中,Scrapy框架是一个非常强大且灵活的选择。在本文中,我将与大家分享两个关键的主题:Scrapy框架中的Middleware扩展和Scrapy-Redis分布式爬虫。这些主题将帮助你更好地理解和应用Scrapy框架,并提升你的爬虫开发技能。 …...
[论文笔记]Sentence-BERT[v2]
引言 本文是SBERT(Sentence-BERT)论文1的笔记。SBERT主要用于解决BERT系列模型无法有效地得到句向量的问题。很久之前写过该篇论文的笔记,但不够详细,今天来重新回顾一下。 BERT系列模型基于交互式计算输入两个句子之间的相似度是非常低效的(但效果是很好的)。当然可以通过…...
虚拟机ubantu系统突然重启失去网络
1.进入 root用户 cd /var/lib/NetworkManager然后查看网络服务状态 如果网络状态和我一样不可用 ,就先停止网络服务 service ModemManager stop#删除状态rm networker.stateservice ModemManager start此时右上交的网络标志回复正常...
三款经典的轮式/轮足机器人讲解,以及学习EG2133产生A/B/C驱动电机。个人机器人学习和开发路线(推荐)
1,灯哥开源(有使用指南,适合刚入门新手) 机械部分:2个foc无刷电机 硬件和软件部分:没有驱动板子。只有驱动器,主控板esp32和驱动器通过pwm直接通讯。驱动器板子上有蓝色电机接口,直…...
apache开启https
本文基于windows平台。 个人感觉使用apache配置起来比较繁琐,而使用upupw或者xmpp等集成开发工具更方便。 在httpd.conf中,将下一行的注释去掉:LoadModule ssl_module modules/mod_ssl.so。另外,千万不要注释掉下面的一行&#…...
绝地求生游戏缺少msvcp140.dll丢失打不开怎么办?这6个方法都能修复
计算机系统中,我们经常遇到各种错误和问题。其中,“MSCVCP140.DLL丢失”是一个常见的错误,它通常出现在运行某些程序或游戏时。这个DLL文件是Microsoft Visual C 2015 Redistributable的一部分,如果它丢失或损坏,可能会…...
【广州华锐互动】石油钻井井控VR互动实训系统
随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为人们的生活和工作带来了前所未有的便利。在石油钻井行业,VR技术的应用也日益受到重视,为钻井工人提供了更加安全、高效的培训方式。 广州华锐…...
单链表算法经典OJ题
目录 1、移除链表元素 2、翻转链表 3、合并两个有序链表 4、获取链表的中间结点 5、环形链表解决约瑟夫问题 6、分割链表 1、移除链表元素 203. 移除链表元素 - 力扣(LeetCode) typedef struct ListNode LSNode; struct ListNode* remove…...
Picnic master project interview
picnic Picnic master project interview1. Topics1.1 Systematically identify similar/interchangeable articles1.2 Understanding changing customer behaviour 2. interview等后续 Picnic master project interview 1. Topics 1.1 Systematically identify similar/inte…...
nginx部署vue项目(访问路径加前缀)
nginx部署vue项目(访问路径加前缀) nginx部署vue项目,访问路径加前缀分为两部分: (1)修改vue项目; (2)修改nginx配置; vue项目修改 需注意,我这是vue-cli3配置&#x…...
element-ui中表格树类型数据的显示
项目场景: 1:非懒加载的情况 1:效果展示 2:问题描述以及解决 1:图片展示 2:html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…...
【扩散模型】如何用最几毛钱生成壁纸
通过学习扩散模型了解到了统计学的美好,然后顺便记录下我之前文生图的基础流程~ 扩散模型简介 这次是在DataWhale的组队学习里学习的,HuggingFace开放扩散模型学习地址 扩散模型训练时通过对原图增加高斯噪声,在推理时通过降噪来得到原图&…...
零基础Linux_17(进程间通信)VSCode环境安装+进程间通信介绍+pipe管道mkfifo
目录 1. VSCode环境安装 1.1 使用VSCode 1.2 远程链接到Linux机器 1.3 VSCode调试 2. 进程间通讯介绍 2.1 进程间通讯的概念和意义 2.2 进程间通讯的策略和本质 3. 管道 3.1 管道介绍 3.2 匿名管道介绍 3.3 匿名管道示例代码 3.3.1 建立管道的pipe 3.3.2 匿名管道…...
Redis的BitMap使用
Redis的BitMap使用 Redis 为我们提供了位图这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间。 位图不是实际的数据类型,而是一组面向位的操作 在被视为…...
Ltspice-线性电流控制电流源F/电压源H
上一篇我们聊了功能强大的任意行为源(BV/BI),它们像是一个可以编写任意公式的“万能计算器”。而在实际电路中,还有一类更基础、更经典的元件,它们遵循严格的线性比例关系,这就是我们今天要介绍的线性受控源…...
告别手动压缩!用Python的shutil.make_archive()自动备份你的项目文件
告别手动压缩!用Python的shutil.make_archive()自动备份你的项目文件 深夜赶项目时,你是否经历过这样的崩溃瞬间——修改了三天的重要代码突然消失,而上次备份还是一周前的手动压缩包?作为开发者,我们常陷入"明天…...
在Ubuntu 24.04上从源码编译PETSc:一个给计算科学新手的保姆级避坑指南
在Ubuntu 24.04上从源码编译PETSc:一个给计算科学新手的保姆级避坑指南 第一次在Ubuntu上编译科学计算库的经历,往往像闯进了一个满是隐藏陷阱的迷宫。作为过来人,我完全理解当看到满屏红色错误提示时的无助感——那些神秘的configure参数、突…...
DeepLabV3+语义分割环境配置、DeepLabV3+语义分割模型代跑训练、DeepLabV3+语义分割模型改进创新DeepLabV3+语义分割环境配置:Windows、Ubuntu、Cen
DeepLabV3语义分割环境配置、 DeepLabV3语义分割模型代跑训练、 DeepLabV3语义分割模型改进创新 DeepLabV3语义分割环境配置:Windows、Ubuntu、Centos、Macos等系统环境,如果电脑拥有显卡,可配置GPU版本的DeepLabV3语义分割环境。 DeepLabV3语…...
什么是 Harness Engineering?OpenAI Codex 团队亲自给出答案
过去五个月,OpenAI 的一个团队做了一件听起来有点疯狂的事:从零开始交付一款软件产品的内测版本,全程没有一行代码是人手写的。 这不是玩具项目。这个产品有真实的内部日活用户和外部 Alpha 测试者,经历了完整的交付、部署、故障…...
突破音频格式壁垒:QMCDecoder开源工具实现无损音频自由转换
突破音频格式壁垒:QMCDecoder开源工具实现无损音频自由转换 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 问题:当音乐被数字锁链束缚——QMC格式的…...
4大维度全面掌控Cyber Engine Tweaks:打造专属赛博朋克2077体验
4大维度全面掌控Cyber Engine Tweaks:打造专属赛博朋克2077体验 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks 🌟 引擎核心&#x…...
AppImageLauncher:Linux系统AppImage应用管理的革新方案
AppImageLauncher:Linux系统AppImage应用管理的革新方案 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: https://gitcode.com/g…...
终极指南:如何轻松提取Xbox Game Pass游戏存档,实现跨平台无缝迁移
终极指南:如何轻松提取Xbox Game Pass游戏存档,实现跨平台无缝迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor …...
gcc编译与gdb使用
一、GCC介绍1.1 GNU工具集GNU 工具集是由自由软件基金会发起的 GNU 项目孕育而生,始于20世纪80年代初,旨在构建完全自由的操作系统,其核心原则强调用户自由使用、修改和分发软件的权利,极大推动了自由软件运动和开源生态系统发展&…...
