001-插件渲染点云设置方法
新建点云并添加点
#include <ccPointCloud.h>
auto cloud = new ccPointCloud("cloudName");
// 预申请内存,避免频繁扩容
cloud->reserve(1000);
ccVector3 point(0,0,0);
cloud->addPoint(point);
// 如果点云过多,超过了预申请的内存,可以手动扩容
int ptSize = 100000; // 新增点云数量
if(cloud->size() + ptSize > cloud->capacity()) {
cloud->resize(cloud->size() + ptSize);
}
// 在添加完成后,需要调用shrinkToFit()方法,将内存调整为实际大小
cloud->shrinkToFit();
// 设置点云可见性
cloud->setVisible(true);
// 设置rgb渲染和标量场(sf)渲染,二者应该是互斥的
cloud->showColors(false);
cloud->showSF(true);
// 相当于预处理
cloud->prepareDisplayForRefresh();
为点云添加标量场
// 按名称获取标量场(可自定义)
int sfIdx = m_cloud->getScalarFieldIndexByName("Intensity");
CCCoreLib::ScalarField *intensitySF = nullptr;
// 如果找到了同名的标量场,直接使用
if (sfIdx >= 0) {
intensitySF = m_cloud->getScalarField(sfIdx);
ccLog::Print("找到已存在的 Intensity 标量场,将直接使用。");
}
// 如果没找到,就创建一个
else {
// 1. 创建一个新的标量场
int sfIdx2 = m_cloud->addScalarField("Intensity");
if (sfIdx2 < 0) {
ccLog::Error("创建 Intensity 标量场失败!");
return;
}
// 1. 获取强度标量场
sfIdx = m_cloud->getScalarFieldIndexByName("Intensity");
if (sfIdx < 0) {
ccLog::Error("当前点云未找到 'Intensity' 标量场!");
return;
}
}
//设置渲染使用的标量场
cloud->setCurrentDisplayedScalarField(sfIdx);
// 设置标量场渲染颜色层次,有很多,可自选
ccColorScale::Shared scale =ccColorScalesManager::GetDefaultScale(
ccColorScalesManager::GREY);
auto sf = static_cast<ccScalarField*>(intensitySF);
sf->setColorScale(scale);
//向标量场中添加数据,一般而言,调用addPoint方法后就能添加对应的值,无需额外申请内存
intensitySF->addElement(0.0);
为点云添加颜色显示
注意:在实验过程中,发现无法正常渲染,原因不明,故未使用。