• Cloudcompare 设置点的颜色和大小


    一、效果图

    遍历设置每一个点的颜色,和所有点的大小
    在这里插入图片描述


    二、插件doAction代码

    需要对每一个点云赋值颜色,不赋值的话就不显示了..可能默认透明

    void ExamplePlugin::doAction()
    {
    	if (m_app == nullptr)
    	{
    		Q_ASSERT(false);
    		return;
    	}
    
    	// 1.获取点云
    	ccPointCloud* cloud;
    	const ccHObject::Container& selectedEntities = m_app->getSelectedEntities();
    	ccHObject *entity = selectedEntities[0];
    	cloud = static_cast<ccPointCloud*>(entity);
    
    	// 2.赋颜色
    	if (!cloud->hasColors())
    		if (!cloud->resizeTheRGBTable(false))  // 先进行初始化
    			return;
    
    	ccColor::Rgb col = ccColor::Rgb(0, 255, 0);
    	for (unsigned int i = 1; i < cloud->size(); ++i) {
    		if (cloud->getPoint(i)->z > 0) {
    			cloud->setPointColor(i, ccColor::Rgba(col, ccColor::MAX));
    		}
    		else {
    			cloud->setPointColor(i, ccColor::Rgba(ccColor::Rgb(255, 255, 255), ccColor::MAX));
    		}
    	}
    	cloud->setPointColor(0, ccColor::Rgb(0, 0, 255));
    	cloud->setPointSize(3);
    
    	// 3.刷新
    	entity->showColors(true);
    	entity->showSF(false);
    	entity->prepareDisplayForRefresh();
    	m_app->refreshAll();
    	m_app->updateUI();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    三、源码解读

    3.1 从按钮函数开始

    需要注意的是修改完点云颜色之后要刷新和更新UI

    void MainWindow::doActionSetColorGradient()
    {
    	if ( !ccEntityAction::setColorGradient(m_selectedEntities, this) )
    		return;
    
    	refreshAll();
    	updateUI();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2 进入setColorGradient

    只放了核心代码,更改完颜色需要更新实体的标志位

    if (cloud && cloud->isA(CC_TYPES::POINT_CLOUD)) // TODO
    {
    		ccPointCloud* pc = static_cast<ccPointCloud*>(cloud);
    		
    		bool success = false;
    		if (ramp == ccColorGradientDlg::Banding)
    			success = pc->setRGBColorByBanding(dim, frequency);
    		else
    			success = pc->setRGBColorByHeight(dim, colorScale);
    		
    		if (success)
    		{
    			ent->showColors(true);
    			ent->showSF(false); //just in case
    			ent->prepareDisplayForRefresh();
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.3 进入setRGBColorByHeight

    先用resizeTheRGBTable初始化m_rgbaColors,不初始化直接error

    if (!hasColors())
    	if (!resizeTheRGBTable(false))
    		return false;
    
    • 1
    • 2
    • 3

    赋值颜色,最后需要更新标志位 colorsHaveChanged

    for (unsigned i = 0; i < count; i++)
    {
    	const CCVector3* Q = getPoint(i);
    	double realtivePos = (Q->u[heightDim] - minHeight) / height;
    	const ccColor::Rgb* col = colorScale->getColorByRelativePos(realtivePos);
    	if (!col) //DGM: yes it happens if we encounter a point with NaN coordinates!!!
    	{
    		col = &ccColor::blackRGB;
    	}
    	m_rgbaColors->setValue(i, ccColor::Rgba(*col, ccColor::MAX));
    }
    //We must update the VBOs
    colorsHaveChanged();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.4 深入setPointColor

    ccPointCloud.h

    void setPointColor(unsigned pointIndex, const ccColor::Rgba& col);
    
    • 1

    ccColor::Rgba的数据结构和构造函数 rgba四通道数据 (uchar 0-255),ccColor::Rgb与其类似

    
    //! RGBA color structure
    template <class Type> class RgbaTpl
    {
    public:
    
    // 4-tuple values as a union
    union{
    	struct{
    		Type r,g,b,a;};
    	Type rgba[4];
    };
    //! Default constructor
    constexpr inline RgbaTpl() : r(0), g(0), b(0), a(0) {}
    //! Constructor from a triplet of r,g,b values and a transparency value
    explicit constexpr inline RgbaTpl(Type red, Type green, Type blue, Type alpha) : r(red), g(green), b(blue), a(alpha) {}
    //! RgbaTpl from an array of 4 values
    explicit constexpr inline RgbaTpl(const Type col[4]) : r(col[0]), g(col[1]), b(col[2]), a(col[3]) {}
    //! RgbaTpl from an array of 3 values and a transparency value
    explicit constexpr inline RgbaTpl(const Type col[3], Type alpha) : r(col[0]), g(col[1]), b(col[2]), a(alpha) {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.5 深入setPointSize

    ccGenericPointCloud.h中设置

    void setPointSize(unsigned size = 0) { m_pointSize = static_cast<unsigned char>(size); }
    
    • 1

    ccPointCloud.cpp中调用OpenGL

    //get the set of OpenGL functions (version 2.1)
    QOpenGLFunctions_2_1* glFunc = context.glFunctions<QOpenGLFunctions_2_1>();
    if (m_pointSize != 0)
    {
    	glFunc->glPointSize(static_cast<GLfloat>(m_pointSize));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、软件相关操作

    4.1 颜色设置: Edit->Colors->…

    在这里插入图片描述

    4.2 点大小设置: 左下角属性框

    在这里插入图片描述


    未在源码中找到设置每一个点大小的函数,有两种解决方案:

    • 1 修改有关OpenGL的底层代码,增加对每一个点大小修改的函数
    • 2 新建不同的实体entity,存储不同大小的点
  • 相关阅读:
    事务(Transaction)逻辑应用
    【1620. 网络信号最好的坐标】
    VC++程序崩溃时,使用Visual Studio静态分析dump文件
    CSS中常用的选择器,附上案例!
    【QML】QML控件组件
    FreeRTOS自我救赎1之基本知识
    Android - MQTT客户端
    react 16.8版本新特性以及对react开发的影响
    SpringBoot整合Redis数据库-小白也能轻松上手-自带云Redis数据库
    ThreeJS-3D教学九-line的绘制
  • 原文地址:https://blog.csdn.net/qq_38204686/article/details/125997862