若该文为原创文章,转载请注明原文出处
本文章博客地址:产品分享:Qt+OSG教育学科工具之地理三维星球_长沙红胖子-CSDN博客
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中..
自研产品专栏:自主研发的产品和产品解决方案
OSG开发专栏(点击传送门)
产品
三维地理学科工具。
原理
使用Qt+Osg三维研发地理星球学科工具。
Demo v3.2.0
在v3.1.0版本基础上:
1.优化内存占用率。
下载地址
Demo v3.2.0运行包下载地址:osgEarthPlayerv3.2.0.rar-教育文档类资源-CSDN下载
QQ群:1047134658(点击“文件”搜索“教育学科工具”,群内与博文同步更新)
v3.1.0
1.修复了星球纹理贴图存在缝隙的问题;
2.修复了缩放无限制的bug;
3.对球体、贴图、2d/3d切换、缩放、旋转增加了序列化接口(demo为启动应用后恢复之前关闭的状态)。
v2.0.0
1.增加了地球以外的八大行星;
2.对布局进行了调整,适配了多种分辨率
3.并且优化了部分代码;
v1.0.0
1.地理星球中地球的研发,包括基本操作、鼠标pick旋转、缩放等
2.地区包含海洋分布、人口分布、气候分布、海平线等等功能;
Demo演示
关键代码
#ifndef OSGSTARWIDGET_H
#define OSGSTARWIDGET_H
/************************************************************\
* 控件名称: OsgStarWidget(地理教学三维星球)
* 控件描述:
* 1.支持地球等九大行星
* 2.支持查看海洋分部、人口分布、气候分布、海平线等等
* 著作权信息
* 作者:红胖子(AAA红模仿)
* 公司:长沙红胖子网络科技有限公司
* 网址:hpzwl.blog.csdn.net
* 联系方式:QQ(21497936) 微信(yangsir198808) 电话(15173255813)
* 日期 版本 描述
* ... ... ...
* 2020年05月09日 v3.0.0 优化球体边界圆滑,修复球体贴图黑色缝隙
* 2020年06月22日 v3.1.0 增对对星球状态、位置、缩放大小,贴图等所有状态的序列化接口;修复缩放bug
* 2020年06月29日 v3.2.0 优化内存消耗
\************************************************************/
#include <QWidget>
#include "MapWidget.h"
#include "ViewMapWidget.h"
#include "OsgViewerWidget.h"
#include "eventHandler/MyUserPickEventHandler.h"
#include <QApplication>
#include <QJsonObject>
#include <QFile>
#include <QJsonDocument>
#define TEST_SERIALIZE (1) // 测试序列化,打开后,关闭该demo会自动保存为1.txt的文件,直接打开则可以恢复上次的状态
#define POS_Y (-6.0)
#define RADIUS (1.0)
#define MIN_SCALE (0.5)
#define MAX_SCALE (2.5)
#define CONTENT_DIR ("image")
//#define CONTENT_DIR (":/osgStarWidget/image") // 内存直接爆掉
#define DIR ("image/osg")
#define BACKGROUND_IMAGE_NAME ("background.png")
#define EARTH_IMAGE_NAME ("earth.jpg")
#define NEPTUNE_IMAGE_NAME ("neptune.jpg")
#define MARS_IMAGE_NAME ("mars.jpg")
#define VENUS_IMAGE_NAME ("venus.jpg")
#define JUPITER_IMAGE_NAME ("jupiter.jpg")
#define MERCURY_IMAGE_NAME ("mercury.jpg")
#define SUNLIGHT_IMAGE_NAME ("sun.jpg")
#define URANUS_IMAGE_NAME ("uranus.jpg")
#define SATURN_IMAGE_NAME ("saturn.jpg")
namespace Ui {
class OsgStarWidget;
}
class OsgStarWidget : public QWidget
{
Q_OBJECT
public:
enum STAR_TYPE { // 输入星球类型
STAR_TYPE_EARTH = 0x00, // 地球
STAR_TYPE_NEPTUNE = 0x01, // 海王星
STAR_TYPE_MARS = 0x02, // 火星
STAR_TYPE_VENUS = 0x03, // 金星
STAR_TYPE_JUPITER = 0x04, // 木星
STAR_TYPE_MERCURY = 0x05, // 水星
STAR_TYPE_SUNLIGHT = 0x06, // 太阳
STAR_TYPE_URANUS = 0x07, // 天王星
STAR_TYPE_SATURN = 0x08 // 土星
};
public:
explicit OsgStarWidget(QWidget *parent = 0); // 构造函数,默认为地球
~OsgStarWidget();
public:
QString getSerialize(); // 获取序列化
void setSerialize(QString json); // 设置序列化
STAR_TYPE getStarType() const; // 获取星球类型
void setStarType(const STAR_TYPE &starType); // 设置星球类型,设置后会重置
QString getScaleAndRotate(); // 获取缩放和角度
void setScaleAndRotate(QString scaleAndRotate); // 设置缩放和角度
protected:
void updateStarType(); // 更换星球好,需要重新更新
void updateButtons(); // 更新按钮
void updateContent(); // 更新左下角的详解
void updateScale(); // 更新缩放比例
protected slots:
void slot_clearWidget();
void slot_changle3DImage(QString imageName);
protected:
void init3D();
void changeCamera(float x, float y, float z);
void change3DImage(QString imageFile);
protected:
osg::ref_ptr<osg::Node> getBackgroundNode(QString imageFile);
osg::ref_ptr<osg::Node> getSphereNode();
protected:
void resizeEvent(QResizeEvent *event);
#if TEST_SERIALIZE
void closeEvent(QCloseEvent *event);
#endif
private slots:
void on_pushButton_map_clicked(bool checked);
void on_pushButton_2Dor3D_clicked(bool checked);
void on_pushButton_zoomIn_clicked();
void on_pushButton_zoomOut_clicked();
void on_pushButton_reset_clicked();
void on_comboBox_starType_activated(const QString &arg1);
private:
Ui::OsgStarWidget *ui;
STAR_TYPE _starType; // 星球类型
float _radius; // 原始半径,缩放比例为1.0f时
MapWidget *_pMapWidget;
ViewMapWidget *_pViewMapWidget;
OsgViewerWidget *_pOsgViewerWidget; // 渲染窗口
osg::ref_ptr<osg::Group> _pGroup; // 场景根节
osg::ref_ptr<osg::MatrixTransform> _pMatrixTransform; // 球体:用于变换
osg::ref_ptr<osg::Geode> _pGeode; // 球体:用于贴纹理
osg::ref_ptr<osg::Switch> _pSwitch; // 开关:用于隐藏
MyUserPickEventHandler *_pMyUserPickEventHandler; // 事件过滤器
QString _dir;
QString _imageName;
QHash<STAR_TYPE, QString> _hashStarType2ImageName;
};
#endif // OSGSTARWIDGET_H
若该文为原创文章,转载请注明原文出处
本文章博客地址:案例分享:Qt+OSG教育学科工具之地理三维星球_长沙红胖子-CSDN博客