美文网首页
项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组

项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组

作者: 红模仿_红胖子 | 来源:发表于2021-04-06 22:55 被阅读0次

    需求

    开发基于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

    相关文章

      网友评论

          本文标题:项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组

          本文链接:https://www.haomeiwen.com/subject/jjtykltx.html