Qt 集成OSG

2024-04-23 15:20
文章标签 qt 集成 osg

本文主要是介绍Qt 集成OSG,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt 你好 | 专注于Qt的技术分享平台

一,新建一个 QOsgWidget 类,继承自osgQOpenGLWidget

#ifndef QOSGWIDGET_H
#define QOSGWIDGET_H#include <QObject>
#include <osgViewer/Viewer>
#include <osgQOpenGL/osgQOpenGLWidget>
class QOsgWidget: public osgQOpenGLWidget
{public:explicit QOsgWidget(QWidget *parent = nullptr);QSize sizeHint() const;void InitQOsgWidget();};#endif // QOSGWIDGET_H
#include "qosgwidget.h"
#include <QDebug>
QOsgWidget::QOsgWidget(QWidget *parent):osgQOpenGLWidget(parent)
{//多重采样QSurfaceFormat surfaceFormat;surfaceFormat.setSamples(6);setFormat(surfaceFormat);
}QSize QOsgWidget::sizeHint() const
{return QSize(this->width(),this->height());
}

二,UI中创建一个QWidget 并提升为QOsgWidget

三,主窗初始化这个QOsgWidget。 这里以一个 网格 节点为例。

#ifndef WIDGET_H
#define WIDGET_H#include <osg/Node>
#include <QWidget>
#include "qosgwidget.h"QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;void InitQOsgWidget();osg::ref_ptr<osg::Group> _Root = nullptr;osg::ref_ptr<osgViewer::Viewer> _Viewer = nullptr;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"#include <osgGA/TrackballManipulator>
#include <osgUtil/Optimizer>
#include <osgGA/GUIEventHandler>
#include <osgViewer/ViewerEventHandlers>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->widget, &osgQOpenGLWidget::initialized, this, &Widget::InitQOsgWidget);
}Widget::~Widget()
{delete ui;
}void Widget::InitQOsgWidget()
{_Root = new osg::Group();QSize size = ui->widget->size();osg::ref_ptr<osgGA::TrackballManipulator> trackball = new osgGA::TrackballManipulator;trackball->setAllowThrow(false);trackball->setAutoComputeHomePosition(true);trackball->setThreadSafeRefUnref(true);osgUtil::Optimizer optimizer;optimizer.optimize(_Root.get());_Viewer = ui->widget->getOsgViewer();_Viewer->addEventHandler(new osgViewer::StatsHandler);_Viewer->getCamera()->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1));_Viewer->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(size.width())/static_cast<double>(size.height()), 1.0f, 10000.0f );_Viewer->setCameraManipulator(trackball);_Viewer->setRunMaxFrameRate(60);osg::ref_ptr<osg::Geode> grid = new osg::Geode;osg::Geometry* geom = new osg::Geometry;grid->addChild(geom);osg::Vec3Array* vertex = new osg::Vec3Array;geom->setVertexArray(vertex);//沿xy平面画线,间隔500米,从-10000,画到100000for (int i = -10; i <= 10; i += 1){vertex->push_back(osg::Vec3(i, -10, 0));vertex->push_back(osg::Vec3(i, 10, 0));vertex->push_back(osg::Vec3(-10, i, 0));vertex->push_back(osg::Vec3(10, i, 0));}geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, vertex->size()));osg::Vec4Array* color = new osg::Vec4Array();color->push_back(osg::Vec4(0.7, 0.7, 0.7, 1.0));geom->setColorArray(color, osg::Array::BIND_OVERALL);geom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);_Root->addChild(grid);_Viewer->setSceneData(_Root.get());
}

四,效果

集成OSG | Qt 你好

这篇关于Qt 集成OSG的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929165

相关文章

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

SpringBoot3集成swagger文档的使用方法

《SpringBoot3集成swagger文档的使用方法》本文介绍了Swagger的诞生背景、主要功能以及如何在SpringBoot3中集成Swagger文档,Swagger可以帮助自动生成API文档... 目录一、前言1. API 文档自动生成2. 交互式 API 测试3. API 设计和开发协作二、使用

SpringBoot如何集成Kaptcha验证码

《SpringBoot如何集成Kaptcha验证码》本文介绍了如何在Java开发中使用Kaptcha生成验证码的功能,包括在pom.xml中配置依赖、在系统公共配置类中添加配置、在控制器中添加生成验证... 目录SpringBoot集成Kaptcha验证码简介实现步骤1. 在 pom.XML 配置文件中2.

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho