• 项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)


    需求

      开发基于osg的三维点云引擎模块。
      1.基于x,y,z坐标轴。
      2.可设置原点,设置缩放比例。
      3.可设置y轴和z轴单位。
      4.三轴中,XY为2D图的水平、竖直方向;Z轴,对应高度图中的double型高度。
      5.引擎中心可设置。
      6.可设置引擎中心点,可以拽拖绕中心点旋转模型。
      7.可以单独以引擎中心点绕X,Y,Z轴旋转,拽拖时旋转.
      8.可以组合XY,XZ,YZ轴旋转,拽拖时旋转。
      9.根据输入的bmp图片以及建模的txt高度文件,呈现点云。
      10.可复位坐标系,可清楚导入的点云。

    附赠功能:

      11.支持导入图片,随机高度进行点云模拟。
      12.支持导入cvs点云文件(当前仅解析点)。

    体验下载地址

      CSDN免积分下载地址:https://download.csdn.net/download/qq21497936/16388051
      QQ群下载地址:1047134658(点击“文件”搜索“osg3D”,群内与博文同步更新)

     

    Demo

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

     

    Demo部分源码

    #ifndef OSGWIDGET_H
    #define OSGWIDGET_H
    
    /************************************************************
     * 控件名称: osg3D点云定制
     * 控件描述:
     *          1.基础三维框架
     *          2.可设置中心点
     *          3.鼠标中键按下后可移动中心点
     *          4.支持导入bmp,bmp+z文件,cvs点云文件
     *          5.支持清空数据,复位视角等操作
     * 作者:红模仿    联系方式:QQ21497936
     * 博客地址:https://blog.csdn.net/qq21497936
     * 著作权信息
     *      作者:红胖子(AAA红模仿)
     *      公司:长沙红胖子网络科技有限公司
     *      博客专家地址:blog.csdn.net/qq21497936/article/details/102478062
     *      联系方式:QQ(21497936) 微信(yangsir198808)
     * 版本信息
     *       日期             版本         描述
     *       ...             ...          ...
     *   2021年04月02日     v2.0.0     3D点云导入,XYZ周固定旋转,复位,清空
                                      导入文件格式支持导入bmp,定制bmp+z,cvs文件
    ************************************************************/
    
    #include <QWidget>
    #include "OsgViewerWidget.h"
    #include "MyManipulator.h"
    
    class AnimationPathCameraMainpulator;
    
    namespace Ui {
    class OsgWidget;
    }
    
    class OsgWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit OsgWidget(QWidget *parent = 0);
        ~OsgWidget();
    
    public:
        bool getFixXAxis() const;
        void setFixXAxis(bool fixXAxis);
    
        bool getFixYAxis() const;
        void setFixYAxis(bool fixYAxis);
    
        bool getFixZAxis() const;
        void setFixZAxis(bool fixZAxis);
    
    public:
        bool loadFile(QString imageFile, int minZ, int maxZ);
        bool loadFile(QString imageFile, float z);
        bool loadFile(QString imageFile, QString cloudZFile);
        bool loadFile(QString cvsFile, QColor color);
        void clear();
        void resetCoordinate();
    
    protected:
        void initOsg();                 // osg初始化
        void loadNode(osg::ref_ptr<osg::Node> pNode);
                                        // 加载场景根节点
    protected:
        osg::ref_ptr<osg::Node> create3DPointCloud();   // 创建总场景
        osg::ref_ptr<osg::Node> createAxisAndGrid();    // 创建坐标轴和线格
        osg::ref_ptr<osg::Node> createTickLabel();      // 创建坐标轴的tickLabel和单位
        osg::ref_ptr<osg::Node> createCloud(std::vector<osg::Vec3> &vectorVec3Vectex,
                                            std::vector<osg::Vec4> &vectorVec4VectexColor);
                                                        // 创建点云
    
    protected:
        void resizeEvent(QResizeEvent *event);
        void keyPressEvent(QKeyEvent* event);
        void keyReleaseEvent(QKeyEvent* event);
        void mousePressEvent(QMouseEvent* event);
        void mouseReleaseEvent(QMouseEvent* event);
        void mouseDoubleClickEvent(QMouseEvent* event);
        void mouseMoveEvent(QMouseEvent* event);
        void wheelEvent(QWheelEvent* event);
    
    private:
        Ui::OsgWidget *ui;
    
    private:
        OsgViewerWidget *_pViewer;                  // osg场景嵌入Qt核心类
        osg::ref_ptr<osg::MatrixTransform> _pRoot;  // osg场景根节点
    
    private:
        float _xDistance;                           // x轴单个tick间距
        int _xTickNumber;                           // x轴tick数(例如:5的时候,是6个,0~5)
    
        float _yDistance;                           // y轴单个tick间距
        int _yTickNumber;                           // y轴tick数(例如:5的时候,是6个,0~5)
    
        float _zDistance;                           // z轴单个tick间距
        int _zTickNumber;                           // z轴tick数(例如:5的时候,是6个,0~5)
    
        QString _zUnit;                             // z轴单位
        float _zTickLabelOffset;                    // z轴坐标偏移
        QString _yUnit;                             // y轴单位
        float _zTickUnitLabelOffset;                // z轴坐标偏移
    
        QColor _gridColor;                          // 轴颜色
        QColor _labelColor;                         // 轴tickLabel的颜色
        osg::ref_ptr<osg::Node> _pNode;             // 模型
    
        osg::ref_ptr<MyManipulator> _pManipulator;  // 自定义漫游器
    
        osg::Vec3d _eyeVect3D;                      // 原始坐标,用于复位原始视角
        osg::Vec3d _centerVect3D;                   // 原始坐标,用于复位原始视角
        osg::Vec3d _upVect3D;                       // 原始坐标,用于复位原始视角
    };
    
    #endif // OSGWIDGET_H
    
    
     

    若该文为原创文章,转载请注明原文出处
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/115416147

  • 相关阅读:
    NS3之路---NS3Tutorial解读---Introduction & Resource
    NS3之路---在NS3中添加openflow模块
    NS3之路---代码编辑器VIM
    2019.9.5绘图
    2019.9.4拖拽事件
    2019.9.3视频播放
    2019.08.30数组去重的几种方法以及所需时间对比
    2019.08.29定时器以及轮播图
    2019.08.27BOM的六个子对象(2)
    2019.08.27BOM的六个子对象(1)
  • 原文地址:https://www.cnblogs.com/qq21497936/p/14624476.html
Copyright © 2020-2023  润新知