案例分享:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)
文章正文
发布时间:2025-01-12 12:28
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
合作案例专栏:案例分享(体验Demo可下载,只定制)
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.可复位坐标系,可清除导入的点云。
11.点云成面功能。
12.可动态调整中心点和相机视口点坐标。
附赠功能:
13.支持导入图片,随机高度进行点云模拟。
14.支持导入cvs点云文件(当前仅解析点)。
体验下载地址
CSDN免积分下载地址:javascript:void(0)
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
若该文为原创文章,转载请注明原文出处