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

为点云添加颜色显示

注意:在实验过程中,发现无法正常渲染,原因不明,故未使用。