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();
}

三、源码解读

3.1 从按钮函数开始

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

void MainWindow::doActionSetColorGradient()
{
	if ( !ccEntityAction::setColorGradient(m_selectedEntities, this) )
		return;

	refreshAll();
	updateUI();
}

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();
		}
	}

3.3 进入setRGBColorByHeight

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

if (!hasColors())
	if (!resizeTheRGBTable(false))
		return false;

赋值颜色,最后需要更新标志位 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();

3.4 深入setPointColor

ccPointCloud.h

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

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) {}

3.5 深入setPointSize

ccGenericPointCloud.h中设置

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

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));
}

四、软件相关操作

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

在这里插入图片描述

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

在这里插入图片描述


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

  • 1 修改有关OpenGL的底层代码,增加对每一个点大小修改的函数
  • 2 新建不同的实体entity,存储不同大小的点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

das白

感谢认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值