2.OsgEarth封装

环境:Osg3.6.5         OsgEarth3.2        Qt5.15.2

        基于qt将osgEarth封装,在Qt中作为GLWidget进行呈现。

1.Earth类的封装

        基于地球的初始化顺序进行了封装,并暴露出了一些必要的属性,类似viwer、map、mapNode等。最为重要的是widght属性,它是放置在qt中的重要承载物。

#pragma once#include "../osgqt/GraphicsWindowQt.h"#include <osgViewer/Viewer>
#include <osgDB/Registry>
#include <osgGA/StateSetManipulator> 
#include <osg/MatrixTransform>#include <osgEarth/Map> 
#include <osgEarth/GDAL> 
#include <osgEarth/MapNode> 
#include <osgEarth/EarthManipulator>
#include <osgEarth/Ephemeris>
#include <osgEarth/Sky> 
#include <osgEarth/XYZ>  #include <ctime>#include <QTimer>
#include <qobject.h>namespace Cv {class CvEarth{public:CvEarth();~CvEarth();osg::ref_ptr<osgViewer::Viewer> viewer;osg::ref_ptr<osg::Group> root;osg::ref_ptr<osg::Camera> camera;osg::ref_ptr<osgEarth::Map> map;osg::ref_ptr<osgEarth::MapNode> mapNode;osg::ref_ptr <osg::MatrixTransform> earthForm;osg::ref_ptr<osgEarth::EarthManipulator> em;osgQt::GLWidget* widget;private:void InitOSG();// 初始化设置osgvoid InitOsgearth();//初始化osgearthvoid InitSky();//天空初始化void InitUI();//界面初始化 time_t now_time;tm* t_tm;osg::ref_ptr<osgEarth::SkyNode> m_pSkyNode;//天空盒子节点};}
#include "CvEarth.h"Cv::CvEarth::CvEarth()
{InitOSG();InitOsgearth();InitUI();
}Cv::CvEarth::~CvEarth()
{
}void Cv::CvEarth::InitOSG()
{osgDB::Registry::instance()->addMimeTypeExtensionMapping("image/jpg;charset=utf8", "jpg");osgDB::Registry::instance()->addMimeTypeExtensionMapping("image/jpeg;charset=utf8", "jpg");osgDB::Registry::instance()->addMimeTypeExtensionMapping("image/png", "png");viewer = new osgViewer::Viewer;// 设置模型root = new osg::Group;//获取屏幕分辨率 长宽osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();if (!wsi)return;unsigned int width, height;wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);//设置图形环境特性osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;traits->windowDecoration = false;//声明是否显示窗口的描述traits->x = 0;traits->y = 0;traits->width = width;traits->height = height;traits->doubleBuffer = true;//创建图形窗口是否使用双缓存//设置照相机camera = new osg::Camera;camera->setGraphicsContext(new osgQt::GraphicsWindowQt(traits.get()));camera->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 1.0));camera->setViewport(new osg::Viewport(0, 0, width, height));camera->setProjectionMatrixAsPerspective(30.0f, (double(traits->width)) / (double(traits->height)), 1.0f, 10000.0f);//设置渲染器viewer->setCamera(camera);viewer->setSceneData(root);viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);//创建为单线程viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
}void Cv::CvEarth::InitOsgearth()
{map = new osgEarth::Map();mapNode = new  osgEarth::MapNode(map.get());earthForm = new osg::MatrixTransform;//osgearth操作器 用来设置osgearhem = new osgEarth::Util::EarthManipulator;if (mapNode.valid()){em->setNode(mapNode);}em->getSettings()->setArcViewpointTransitions(true);//设置osg渲染窗口viewer->setCameraManipulator(em);//初始化天空InitSky();
}void Cv::CvEarth::InitSky()
{//获取当前时间 初始化天空now_time = time(0);t_tm = localtime(&now_time);osgEarth::DateTime cur_date_time(now_time);osgEarth::Ephemeris* ephemeris = new osgEarth::Ephemeris;//设置黑夜明暗程度osgEarth::Util::SkyOptions skyOptions;skyOptions.ambient() = 0.3;m_pSkyNode = osgEarth::SkyNode::create(skyOptions);m_pSkyNode->setName("SkyNode");m_pSkyNode->setEphemeris(ephemeris);m_pSkyNode->setDateTime(cur_date_time);viewer->setLightingMode(osg::View::SKY_LIGHT);m_pSkyNode->attach(viewer, 0);m_pSkyNode->setLighting(true);m_pSkyNode->addChild(mapNode);root->addChild(m_pSkyNode);
}void Cv::CvEarth::InitUI()
{// ui布局osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>(camera->getGraphicsContext());widget = (gw->getGLWidget());}

2.窗体中的使用

        将封装的CvEarth引用进来,并添加到对应的布局中。

#include "MainForm.h"MainForm::MainForm(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);cvEarth = new Cv::CvEarth();//ui布局ui.mainLyt->addWidget(cvEarth->widget);_timer = new QTimer;QObject::connect(_timer, SIGNAL(timeout()), this, SLOT(updateFrame()));_timer->start(10);//窗口最大化this->setWindowState(Qt::WindowMaximized);this->setWindowTitle(QString::fromLocal8Bit("CvEarth")); }MainForm::~MainForm()
{}void MainForm::updateFrame()
{cvEarth->viewer->frame();
}

3.效果

空白地球

        运行后将会出现如图所示的空白地球,为啥空白是因为现状场景中我们未添加任何的数据,所以就只有一个白色的地球。

 

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

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

相关文章

CentOS 搭建本地 yum 源方式 安装 httpd 服务

CentOS 搭建本地 yum 源方式 安装 httpd 服务 修改 yum 源 挂载光驱 mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdromvi /etc/fstab追加以下内容&#xff1a; /dev/cdrom /mnt/cdrom iso9660 defaults 0 0手动修改CentOS-Base.repo 备份 yum 源配置文件 mv /etc/yum.re…

Docker仓库

目录 1、registry私有仓库 2、insecure registry 3、配置镜像加速器 4、仓库加密 5、仓库认证 6、harbor企业级私有仓库 1、registry私有仓库 官网&#xff1a; Registry | Docker Docs 拉取registry镜像 docker pull registry 运行registry仓库 docker run -d -p 5000:5…

《论文阅读》LORA:大型语言模型的低秩自适应 2021

《论文阅读》LORA: LOW-RANK ADAPTATION OF LARGE LAN-GUAGE MODELS 前言简介现有方法模型架构优点前言 今天为大家带来的是《LORA: LOW-RANK ADAPTATION OF LARGE LAN-GUAGE MODELS》 出版: 时间:2021年10月16日 类型:大语言模型的微调方法 关键词: 作者:Edward Hu,…

Linux下自动挂载U盘或者USB移动硬盘

最近在折腾用树莓派&#xff08;实际上是平替香橙派orangepi zero3&#xff09;搭建共享文件服务器&#xff0c;有一个问题很重要&#xff0c;如何在系统启动时自动挂载USB移动硬盘。 1 使用/etc/fstab 最开始尝试了用/etc/fstab文件下增加:"/dev/sda1 /home/orangepi/s…

Java 反射机制详解

目录 一. 前言 二. 反射基础 2.1. Class 类 2.2. 类加载 三. 反射的使用 3.1. Class类对象的获取 3.2. Constructor类及其用法 3.3. Field类及其用法 3.4. Method类及其用法 四. 反射机制执行的流程 4.1. 反射获取类实例 4.2. 获取构造器的过程 4.3. 反射获取方法…

javaEE -8(9000字详解网络编程)

一&#xff1a;网络编程基础 1.1 网络资源 所谓的网络资源&#xff0c;其实就是在网络中可以获取的各种数据资源&#xff0c;而所有的网络资源&#xff0c;都是通过网络编程来进行数据传输的。 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff…

什么?Postman也能测WebSocket接口了?

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

PyCharm社区版安装

PyCharm社区版安装 到中国官网下载 https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows 首次创建项目&#xff0c;会自动下载安装Python 3.9 社区版的区别 社区版的区别

数据结构 C语言 2.1 线性表抽象数据类型 2.2 小议顺序表

一、线性表抽象数据类型 线性表的定义 定义&#xff1a;零个或多个数据元素的有限序列 线性表的特点&#xff1a; 1.它是一个序列 数据元素之间是有序的 数据元素之间是一对一的关系 2.有限性 线性表的数据元素个数是有限的 注意&#xff1a;零个数据元素的有限序列又…

可图性判断(图论)

如图所示&#xff1a; 1.去arr[i]首元素&#xff0c; 后面arr[i]个元素减一 2.排序&#xff0c;以此类推 3.最后如果出现负数则不可图 4.最后元素为0&#xff0c;则可图 问题 L: Degree Sequence of Graph G代码如下&#xff1a;

机器视觉3D项目评估的基本要素及测量案例分析

目录 一. 检测需求确认 1、产品名称&#xff1a;【了解是什么产品上的零件&#xff0c;功能是什么】 2、*产品尺寸&#xff1a;【最大兼容尺寸】 3、*测量项目&#xff1a;【确认清楚测量点位】 4、*精度要求&#xff1a;【若客户提出的精度值过大或者过小&#xff0c;可以和客…

hadoop使用简介

git clone hadoop源码地址&#xff1a;https://gitee.com/CHNnoodle/hadoop.git git clone错误&#xff1a; Filename too long错误&#xff0c;使用git config --global core.longpaths true git clone https://gitee.com/CHNnoodle/hadoop.git -b rel/release-3.2.2 拉取指定…