产品
三维地理学科工具。
原理
使用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