QT调用OpenSceneGraph

OSG和osgQt编译教程,实测通过 

一、下载OpenSceneGraph

OpenSceneGraphhttps://github.com/openscenegraph/OpenSceneGraph

 二、使用CMAKE编译OpenSceneGraph

1.打开cmake,配置源代码目录

2. CMAKE_INSTALL_PREFIX设置为install文件夹,生成VS工程

3. 使用VS2022打开工程,编译ALL_BUILD和INSTALL,在OpenSceneGraph-master\install目录下生成头文件、lib文件和动态库 

三、下载osgQt

osgQthttps://github.com/openscenegraph/osgQt

四、使用CMAKE编译osgQt

1.修改osgQt-master/CMakeLists.txt,配置OSG和QT依赖(重点,不修改cmake会报错

找到以下的行,在FIND_PACKAGE(OpenSceneGraph...上面添加一行,set(CMAKE_PREFIX_PATH  "path1;paht2"),注意path1和ath2使用分号分隔,path1为上面的OSG生成目录,即OpenSceneGraph-master/install,path2为QT的安装目录,本案例为Qt/5.15.2/msvc2019_64。版本号3.7.0为OSG的版本号

如下:

PROJECT(osgQt)set(CMAKE_PREFIX_PATH "C:/Users/115627/Desktop/OpenSceneGraph-master/OpenSceneGraph-master/install;C:/Qt/5.15.2/msvc2019_64")
FIND_PACKAGE(OpenSceneGraph 3.7.0 REQUIRED osgDB osgGA osgUtil osgText osgViewer osgWidget)
SET(OPENSCENEGRAPH_SOVERSION 145)SET(OSG_PLUGINS osgPlugins-${OPENSCENEGRAPH_VERSION})SET(OSG_PLUGIN_PREFIX "")IF (CYGWIN)SET(OSG_PLUGIN_PREFIX "cygwin_")
ENDIF()IF(MINGW)SET(OSG_PLUGIN_PREFIX "mingw_")
ENDIF()

2..打开cmake,配置源代码目录

3. CMAKE_INSTALL_PREFIX设置为install文件夹,生成VS工程

4. 使用VS2022打开工程,编译ALL_BUILD和INSTALL,在install目录下生成头文件、lib文件和动态库 

 五、配置环境变量

将OSG和osgQt的动态库加入到系统环境变量,方便后续测试测序找到

六、Qt 测试程序

启动qt creator,新建测试项目,配置头文件路径, lib路径即lib文件,pro配置如下:

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17 opengl# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetINCLUDEPATH += C:/Users/115627/Desktop/OpenSceneGraph-master/OpenSceneGraph-master/install/include \C:/Users/115627/Desktop/OpenSceneGraph-master/osgQt-master/install/includeCONFIG(debug,debug|release){LIBS += -LC:\Users\115627\Desktop\OpenSceneGraph-master\OpenSceneGraph-master\install\lib \-LC:\Users\115627\Desktop\OpenSceneGraph-master\osgQt-master\install\lib \-lOpenThreadsd \-losgd \-losgDBd \-losgGAd \-losgUtild \-losgViewerd \-losgQOpenGLd
}else {LIBS += -LC:\Users\115627\Desktop\OpenSceneGraph-master\OpenSceneGraph-master\install\lib \-LC:\Users\115627\Desktop\OpenSceneGraph-master\osgQt-master\install\lib \-lOpenThreads \-losg \-losgDB \-losgGA \-losgUtil \-losgViewer \-losgQOpenGL
}

 头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include <osgQOpenGL/osgQOpenGLWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected slots:void initOSG();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;osgQOpenGLWidget* osgWidget;
};#endif // WIDGET_H

CPP文件

#include "widget.h"
#include "ui_widget.h"
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osg/MatrixTransform>
#include <osg/ShapeDrawable>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);osgWidget = new osgQOpenGLWidget(ui->widget);          // 指定osg窗口显示位置osgWidget->setGeometry(ui->widget->geometry());        // 指定osg窗口显示大小// connect(osgWidget, SIGNAL(initialized()), this, SLOT(initOSG()));
}Widget::~Widget()
{delete ui;
}void Widget::initOSG()
{osgViewer::Viewer* pViewer = osgWidget->getOsgViewer();pViewer->setCameraManipulator(new osgGA::TrackballManipulator);auto root = new osg::Group;auto transform = new osg::MatrixTransform;osg::Cylinder* cylinder    = new osg::Cylinder( osg::Vec3( 0.f, 0.f, 0.f ), 1.f, 1.f );osg::ShapeDrawable* sd = new osg::ShapeDrawable( cylinder );sd->setColor( osg::Vec4( 0.8f, 0.5f, 0.2f, 1.f ) );osg::ref_ptr<osg::Geode> geode = new osg::Geode();geode->addDrawable(sd);pViewer->setSceneData(geode);
}void Widget::on_pushButton_clicked()
{initOSG();
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法面试专题——引入及归并排序

数据结构与算法引入 我们都知道数据结构与算法很重要&#xff0c;甚至会将其称为程序员的“内功”&#xff0c;但是我们花了很多时间学的算法和数据结构&#xff0c;好像就只是为了应对算法面试&#xff0c;对日常的开发工作没有什么帮助。 这点对于我们数据工程师来说&#…

《鸿蒙 HarmonyOS 应用开发从入门到精通(第 2 版)》学习笔记 ——HarmonyOS 环境搭建之安装DevEco Studio

作为一款开发工具&#xff0c;除了具有基本的代码开发、编译构建及调测等功能外&#xff0c;DevEco Studio还具有如下特点&#xff1a; 高效智能代码编辑&#xff1a;支持Java、XML、ArkTS、JS、C/C等语言的代码高亮、代码智能补齐、代码错误检查、代码自动跳转、代码格式化、…

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一&#xff0c;它为用户提供了丰富的编辑功能来美化和保护文档。其中&#xff0c;“水印”是一种特别有用的功能&#xff0c;它可以用于标识文档状态&#xff08;如“草稿”或“机密”&#xff09;、公司标志或是版权信息等。本…

学习记录之原型,原型链

构造函数创建对象 Person和普通函数没有区别&#xff0c;之所以是构造函数在于它是通过new关键字调用的&#xff0c;p就是通过构造函数Person创建的实列对象 function Person(age, name) {this.age age;this.name name;}let p new Person(18, 张三);prototype prototype n…

logback日志自定义占位符

前言 在大型系统运维中&#xff0c;很大程度上是需要依赖日志的。在java大型web工程中&#xff0c;一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用&#xff0c;比如线程号【%t】、时间【%d】、日志等级【%p】&#xff0c;…

Android系统开发(八):从麦克风到扬声器,音频HAL框架的奇妙之旅

引言&#xff1a;音浪太强&#xff0c;我稳如老 HAL&#xff01; 如果有一天你的耳机里传来的不是《咱们屯里人》&#xff0c;而是金属碰撞般的杂音&#xff0c;那你可能已经感受到了 Android 音频硬件抽象层 (HAL) 出问题的后果&#xff01;在 Android 音频架构中&#xff0c…

数据恢复常用方法(三)如何辨别固态硬盘故障类型

数据恢复首先需要辨别固态硬盘故障类型&#xff0c;只有先确认故障类型&#xff0c;才能进行下一步动作 如下是一种常见的场景&#xff0c;固态硬盘无法识别&#xff0c;接入电源与数据线&#xff0c;电脑的磁盘管理不显示任何信息。 第一步&#xff1a;确认硬件状态&#xff…

【大数据】机器学习----------强化学习机器学习阶段尾声

一、强化学习的基本概念 注&#xff1a; 圈图与折线图引用知乎博主斜杠青年 1. 任务与奖赏 任务&#xff1a;强化学习的目标是让智能体&#xff08;agent&#xff09;在一个环境&#xff08;environment&#xff09;中采取一系列行动&#xff08;actions&#xff09;以完成一个…

StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级

自 StarRocks 3.0 起&#xff0c;社区明确了以 Lakehouse 为核心的发展方向。Lakehouse 的价值在于融合数据湖与数据仓库的优势&#xff0c;能有效应对大数据量增长带来的存储成本压力&#xff0c;做到 single source of truth 的同时继续拥有极速的查询性能&#xff0c;同时也…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库&#xff08;Monorepo&#xff09;搭建指南&#xff1a;从零开始 单体仓库&#xff08;Monorepo&#xff09;是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置&#xff0c;并简化依赖管理。本文将通过实际代码示例&#xff0…

基于python的博客系统设计与实现

摘要&#xff1a;目前&#xff0c;对于信息的获取是十分的重要&#xff0c;我们要做到的不是裹足不前&#xff0c;而是应该主动获取和共享给所有人。博客系统就能够实现信息获取与分享的功能&#xff0c;博主在发表文章后&#xff0c;互联网上的其他用户便可以看到&#xff0c;…

Spring Boot AOP实现动态数据脱敏

依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…

SparkSQL函数综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建项目2.2 添加依赖2.3 设置源目录2.4 创建日志属性文件2.5 创建hive配置文件2.6 创建数据分析对象2.6.1 导入相关类2.6.2 创建获取Spark会话方法2.6.3 创建表方法2.6.4 准备数据文件2.6.5 创建加载数据方法2.6.6 创建薪水排行榜方法2.6.…

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中&#xff0c;默认情况下&#xff0c;查询结果是根据 相关度 评分&#xff08;score&#xff09;进行排序的。我们之前已经了解过&#xff0c;相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…

《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维修技师》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维修技师》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;北方联合出版传媒&#xff08;…

【中国电信-安全大脑产品介绍】

座右铭&#xff1a;人生的道路上无论如何选择总会有遗憾的&#xff01; 文章目录 前言一、安全大脑介绍二、中国电信-安全大脑产品分类1.防护版2.审计版 三、安全大脑-部署方案总结 前言 安全占据我们日常生活中首要地位&#xff0c;它时时刻刻提醒着我们出入平安。当然网络安…

洛谷P8837

[传智杯 #3 决赛] 商店 - 洛谷 代码区&#xff1a; #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void *b){return *(int*)b-*(int*)a; } int main(){int n,m;scanf("%d%d",&n,&m);int w[n];int c[m];for(int i0;i<n;…

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈&#xff0c;帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作&#xff08;cmp & swap&#xff09; 线程控制&#xff1a;两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…

三分钟简单了解HTML的一些语句

1.图片建议建立一个文件夹如下图所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"keywords"><title>魔神羽落</title><style>.testone{background-color: #ff53e…

HCIP笔记4--OSPF域内路由计算

1. 域内LSA 1.1 一类LSA 一类LSA: 路由器直连状态&#xff0c;Router LSA。 串口需要两端配置好IP,才会产生一类LSA; 以太网口只需要一端配置了IP就会直接产生一类LSA。 LSA通用头部 Type: Router 直连路由LS id: 12.1.1.1 路由器router idAdv rtr: 12.1.1.1 通告的路由器&…