案例分享:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)

简介: 案例分享: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.可动态调整中心点和相机视口点坐标。

附赠功能:

  13.支持导入图片,随机高度进行点云模拟。

  14.支持导入cvs点云文件(当前仅解析点)。

体验下载地址

  CSDN免积分下载地址:https://download.csdn.net/download/qq21497936/16388051

  QQ群下载地址:1047134658(点击“文件”搜索“osg3D”,群内与博文同步更新)


Demo v2.1.0(2021年04月09日补充)

  


Demo v2.0.0

  

  

  

  

  

  


头文件源码

#ifndef OSGWIDGET_H
#define OSGWIDGET_H
#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;               // 获取X轴固定状态
    bool getFixYAxis() const;               // 获取Y轴固定状态
    bool getFixZAxis() const;               // 获取Z轴固定状态
    void getCenter(double &x, double &y, double &z);
                                            // 获取引擎中心点坐标
    void getPersonPoint(double &x, double &y, double &z);
                                            // 获取初始化人眼的角度(看向引擎中心点)
public:
    void setFixXAxis(bool fixXAxis);        // 设置固定X轴
    void setFixYAxis(bool fixYAxis);        // 设置固定Y轴
    void setFixZAxis(bool fixZAxis);        // 设置固定Z轴
    void setCenter(double x, double y, double z);
                                            // 设置引擎中心点坐标
    void setPersonPoint(double x, double y, double z);
public:
    bool loadFile(QString imageFile, int minZ, int maxZ);
    bool loadFile(QString imageFile, float z);
    bool loadFile(QString imageFile, QString cloudZFile, bool bSurface = false);
    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);
                                                    // 创建点云
    osg::ref_ptr<osg::Node> createCloudSurface(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



相关文章
|
21天前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
27 2
|
1月前
|
监控 安全 Linux
Qt 文件类实战:解锁文件操作的无限可能
Qt 文件类实战:解锁文件操作的无限可能
47 1
|
1月前
|
数据可视化 API vr&ar
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
探索Qt 3D之旅:从基础到实战,打造引人入胜的三维界面与应用
107 2
|
2月前
|
IDE 开发工具 C++
QT案例IDE编写 -- 创建项目
QT案例IDE编写 -- 创建项目
25 0
|
27天前
|
数据可视化 图形学 开发者
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
152 4
|
29天前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
22 0
|
1月前
|
存储 JSON C++
Qt cmake 增加qml文件:深度剖析Qt cmake 的qt_add_qml_module函数
Qt cmake 增加qml文件:深度剖析Qt cmake 的qt_add_qml_module函数
27 0
|
1月前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
107 4
|
1月前
|
监控 C++
C++ Qt开发:QFileSystemWatcher文件监视组件
QFileSystemWatcher 是 Qt 框架中提供的一个类,用于监视文件系统中的文件和目录的变化。它允许你在文件或目录发生变化时接收通知,并可以用于监视文件的创建、删除、重命名以及内容修改等操作。这对于需要实时监控文件系统变化的应用程序是非常有用的。
35 5
C++ Qt开发:QFileSystemWatcher文件监视组件
|
2月前
|
编解码 IDE 开发工具
QT案例IDE编写 -- 另存为操作及编辑操作
QT案例IDE编写 -- 另存为操作及编辑操作
18 0