温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Qt+OSG三维点云引擎的示例分析

发布时间:2021-09-18 14:06:46 来源:亿速云 阅读:205 作者:柒染 栏目:编程语言

Qt+OSG三维点云引擎的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

OSG与OsgEarth三维开发专栏

<br>

需求

  开发基于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”,群内与博文同步更新)

<br>

Demo

  Qt+OSG三维点云引擎的示例分析   Qt+OSG三维点云引擎的示例分析   Qt+OSG三维点云引擎的示例分析   Qt+OSG三维点云引擎的示例分析   Qt+OSG三维点云引擎的示例分析   Qt+OSG三维点云引擎的示例分析

<br>

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

<br>

看完上述内容,你们掌握Qt+OSG三维点云引擎的示例分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI