2.OsgEarth封装

news2025/2/23 12:34:39

环境: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();// 初始化设置osg
		void InitOsgearth();//初始化osgearth
		void 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操作器 用来设置osgearh
	em = 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.coloradmin.cn/o/1142421.html

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

相关文章

Fourier分析导论——第1章——Fourier分析的起源(E.M. Stein R. Shakarchi)

第 1 章 Fourier分析的起源 (The Genesis of Fourier Analysis) Regarding the researches of dAlembert and Euler could one not add that if they knew this expansion, they made but a very imperfect use of it. They were both persuaded that an arbitrary and d…

基于单片机的空气质量检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、主要内容二、系统方案设计2.1 系统方案设计2.2 主控制器模块选择 三、 系统软件设计4.1 程序结构分析4.2系统程序…

汇编学习(1)

汇编、CPU架构、指令集、硬编码之间的关系 ● 汇编语言&#xff1a;这是一种低级语言&#xff0c;用于与硬件直接交互。它是由人类可读的机器码或指令组成的&#xff0c;这些指令告诉CPU如何执行特定的任务。每条汇编指令都有一个对应的机器码指令&#xff0c;CPU可以理解和执…

25 行为型模式-备忘录模式

1 备忘录模式介绍 备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 2 备忘录模式原理 3 备忘录模式实现 /*** 发起人角色**/ public class Originator {private Strin…

城中村智能电表改造解决方案

随着我国城市化进程的加快&#xff0c;城中村作为城市发展的矛盾焦点&#xff0c;其居住环境、管理水平等问题日益凸显。城中村用电管理存在着用电安全隐患、电费核算不准确、偷电现象屡禁不止等问题。为了提高城中村用电管理水平&#xff0c;确保用电安全&#xff0c;推进智能…

通过pip,查看tensorflow和tensorflow-probaility版本

查看tensorflow和tensorflow-probability版本 如果在加载tensorflow 和 tensorflow-probablity时&#xff0c;没有成功的话&#xff0c;可以看下这两个包的版本&#xff0c;网上可以搜一下&#xff0c;这两个包版本是否搭配。 从上述信息总可以看到tensorflow包的版本是2.13.0…

DSP开发例程(4): logbuf_print_to_uart

目录 DSP开发例程: logbuf_print_to_uart新建工程源码编辑app.cfgos.cmain.c 调试说明 DSP开发例程: logbuf_print_to_uart SYS/BIOS 提供了 xdc.runtime.Log, xdc.runtime.LoggerBuf 和 xdc.runtime.LoggerSys 这几个模块用于日志记录. 日志信息在 应用程序调试和状态监控中非…

Web服务器与Http协议

Web服务器与Http协议 一.Web服务器 1.简介 Web服务器一般指网站服务器&#xff0c;也称之为WWW(World Wide Web)服务器Web服务器是指驻留于因特网上某种类型计算机的程序Web服务器不是硬件服务器&#xff0c;而是软件服务器。Web服务器其主要功能是提供网上信息浏览服务&…

论文阅读——BERT

ArXiv&#xff1a;https://arxiv.org/abs/1810.04805 github&#xff1a;GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT 一、模型及特点&#xff1a; 1、模型&#xff1a; 深层双向transformer encoder结构 BERT-BASE&#xff1a;(L12, H…

2.19每日一题(分段函数求定积分)

注意&#xff1a;当x>1时需要分区间求定积分 用变上限积分的定理&#xff1a;如果 f(x) 连续&#xff0c;则 F(x) 的导数 f(x) 变上限积分的导数为 f(x) 1、先判断 f(x) 是否连续———>判断在分界点的值是否相等&#xff0c;相等则 f(x) 连续&#xff0c;则 F(x&#…

实体店做商城小程序如何

互联网电商深入各个行业&#xff0c;传统线下店商家无论产品销售还是服务业&#xff0c;仅靠以往的经营模式&#xff0c;很难拓展到客户&#xff0c;老客流失严重&#xff0c;同时渠道单一&#xff0c;无法实现外地客户购物及线上客户赋能等。 入驻第三方平台有优势但也有不足…

Java练习题2020-4

小明今天收了N个鸡蛋&#xff0c;每个鸡蛋各有重量&#xff0c;现在小明想找M个重量差距最小的鸡蛋摆成一盒出售&#xff0c;输出符合条件的最重一盒鸡蛋的总重量 输入说明&#xff1a;第一行&#xff0c;鸡蛋个数N(N<1000) 每盒个数M(M<N)&#xff1b;第二行&#xff0…

如何使用PHPicker在iOS系统无授权下获取资源

本文字数&#xff1a;2766字 预计阅读时间&#xff1a;18分钟 自iOS14系统开始&#xff0c;苹果加强了用户隐私和安全功能。新增了“Limited Photo Library Access”模式&#xff0c;同时在授权弹窗中增加了“Select Photo”选项。这意味着用户可以在应用程序请求访问相册时选择…

Unity编辑器扩展之自定义Inspector面板

首先找到的是这个[CustomEditor(typeof(Class), true)]&#xff0c;这个东西能够自己绘制在Inspector视图的显示规则&#xff0c;但是&#xff01;如果这个类被另一个类持有&#xff0c;他就没作用了&#xff0c; 效果图&#xff1a; 1.对CustomClass类编辑自定义面板 2. 对M…

为什么Facebook运营需使用IP代理?

随着互联网的快速发展和全球用户规模的不断增长&#xff0c;Facebook已成为了全球最大的社交媒体平台之一。然而&#xff0c;大批量地运营Facebook账号往往需要借助IP代理这一工具&#xff0c;提高账号的安全性和可靠性&#xff0c;使得运营Facebook更加流畅。那么Facebook为什…

QGIS008:QGIS拓扑检查、修改及验证

摘要&#xff1a;本文介绍使用QGIS拓扑检查器和几何图形检查器检查图层的拓扑错误&#xff0c;修改拓扑错误&#xff0c;并对修改后的图层进行错误验证。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Vy2s-KYS-XJevqHNdavv9A?pwdf06o 提取码&#xff1a…

源码角度分析Java 循环中删除数据为什么会报异常

一、源码角度分析Java 循环中删除数据为什么会报异常 相信大家在之前或多或少都知道 Java 中在增强 for中删除数据会抛出&#xff1a;java.util.ConcurrentModificationException 异常&#xff0c;例如&#xff1a;如下所示程序&#xff1a; public class RmTest {public sta…

系统架构师-第10章-软件架构的演化和维护-学习笔记

软件架构一般会经历初始设计、实际使用、修改完善和退化弃阳的过程&#xff0c;其中修改完善的过程实际上就是软件架构的演化和维护过程&#xff0c;演化和维护的H 的就是为f 侦软件能够适应环境的变化而进行的纠铺性修改和完善性修改等。 软件架构演化和定义的关系 演化的重…

069:mapboxGL加载GPX,转换为geojson,显示图形

第069个 点击查看专栏目录 本示例是演示如何在vue+mapbox中加载GPX,转换为geojson,在地图上显示图形。这里面用到了大剑师的gpx2geojson插件,很方便的做了数据的转换。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果所用的gpx文件配置方…

【开源】基于SpringBoot的衣物搭配系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…