案例分享: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



相关文章
|
4月前
【qt】如何读取文件并拆分信息?
【qt】如何读取文件并拆分信息?
48 0
|
5月前
|
网络协议
Qt中的网络编程(Tcp和Udp)运用详解以及简单示范案例
Tcp和Udp是我们学习网络编程中经常接触到的两个通讯协议,在Qt也被Qt封装成了自己的库供我们调用,对于需要进行网络交互的项目中无疑是很重要的,希望这篇文章可以帮助到大家。 是关于Qt中TCP和UDP的基本使用和特点:
829 7
|
5月前
|
C++
基于QT实现的拷贝文件以及实时进度条(简易版)
1.基于按钮或者菜单栏的槽里去写逻辑函数(我这边用的是菜单栏),ui实现的进度条 2.创建两个对象,一个是源文件,一个是目标文件分别用getopenfileName、getsavefileName函数即可。 3.利用QFile类去实现对两个文件的创建,因为QFile中可以获取文件的属性已经读写等。 4.循环的去读取源文件中的数据,然后写入目标文件
561 6
|
4月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
120 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
885 4
|
4月前
|
XML 开发框架 API
【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制
【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制
225 1
|
4月前
QT 软件打包为一个单独可执行.exe文件流程
QT 软件打包为一个单独可执行.exe文件流程
937 0
|
4月前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
6月前
Qt颜色、文件、字体对话框
Qt颜色、文件、字体对话框
|
5月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
137 0