項目實戰:Qt+OSG三維點雲引擎(支持原點,縮放,單獨軸或者組合多軸拽拖旋轉,支持導入點雲文件)

若該文爲原創文章,轉載請註明原文出處
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/115416147微信

長期持續帶來更多項目與技術分享,諮詢請加QQ:2149793六、微信:yangsir198808 網絡

紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中…(點擊傳送門)框架

開發專欄:商業項目實戰

OSG與OsgEarth三維開發專欄


需求

  開發基於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.可復位座標系,可清楚導入的點雲。ui

附贈功能:

  11.支持導入圖片,隨機高度進行點雲模擬。
  12.支持導入cvs點雲文件(當前僅解析點)。spa

體驗下載地址

  CSDN免積分下載地址:https://download.csdn.net/download/qq21497936/16388051
  QQ羣下載地址:1047134658(點擊「文件」搜索「osg3D」,羣內與博文同步更新).net


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/1154161473d

相關文章
相關標籤/搜索