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