产品分享:Qt+OSG教育学科工具之地理三维星球

简介: 产品分享:Qt+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



相关文章
|
7月前
|
存储 C++
基于Qt的简易文件压缩与解压缩工具设计与实现
基于Qt的简易文件压缩与解压缩工具设计与实现
329 1
|
7月前
|
数据可视化 API vr&ar
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
981 2
|
7月前
|
安全
Qt日志工具--QsLog
Qt日志工具--QsLog
178 1
|
7月前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
1024 4
|
7月前
|
程序员 开发工具 索引
【Qt 学习笔记】认识QtSDK中的重要工具
【Qt 学习笔记】认识QtSDK中的重要工具
91 0
|
7月前
QT实现植物大战僵尸中文版工具代码
QT实现植物大战僵尸中文版工具代码
|
7月前
Qt程序打包发布记录使用windeployqt工具
Qt程序打包发布记录使用windeployqt工具
122 0
|
C++ Python
Python+QT美颜工具源码
Python+QT美颜工具源码
174 0
Python+QT美颜工具源码
|
C++ Python
Python+Qt抽奖点名工具源码窗体程序
Python+Qt抽奖点名工具源码窗体程序
148 0
Python+Qt抽奖点名工具源码窗体程序
QT实现截图工具
最近突发奇想,想实现一个截图软件,于是使用QT写了一个基本的截图软件功能,后续会在优化,接下来我先介绍一下自己的实现思路
110 1