CloudCompare中不同点云数据结构之间的继承关系

在 CloudCompare(CC)中,点云数据的组织方式是基于 继承关系层次化树结构 的。不同的点云数据结构继承自 ccHObject,并在此基础上扩展功能。以下是详细的继承关系和它们之间的作用。


1. 主要的点云数据类层次结构

CloudCompare 主要有以下几个与点云相关的类:

ccHObject
    ├── ccGenericPointCloud  // 通用点云类(抽象基类)
         ├── ccPointCloud   // 主要的点云存储类
         ├── ccSubMesh      // 子网格(局部网格,但继承自 ccGenericPointCloud)

这些类的作用:

  • ccHObject:所有对象的基类,提供层次管理。
  • ccGenericPointCloud:抽象基类,提供通用点云操作。
  • ccPointCloud:具体的点云存储和操作类,存储点坐标、颜色、法向量等。
  • ccSubMesh:用于存储子网格(虽然它继承 ccGenericPointCloud,但更适用于三角网格)。

2. 详细的继承关系

(1) ccHObject(基类)

class QCC_DB_LIB_API ccHObject : public ccObject
  • ccHObject 是 CloudCompare 的所有对象的基类,包括点云、网格、传感器等。
  • 提供 层次化结构管理,可以作为父对象,存储多个子对象。
  • ccHObject 本身不存储点云数据,它只是管理对象关系。

(2) ccGenericPointCloud(点云抽象基类)

class QCC_DB_LIB_API ccGenericPointCloud : public ccHObject
  • 这是 所有点云数据的基类,但它是 抽象类,无法直接实例化。
  • 提供了 通用点云操作接口,包括:
    • 获取点数量 (size())
    • 访问单个点 (getPoint(index))
    • 计算点云包围盒 (getBoundingBox())
    • 计算点间距离 (computeDistanceTo())

(3) ccPointCloud(点云存储类)

class QCC_DB_LIB_API ccPointCloud : public ccGenericPointCloud
  • ccPointCloud 继承自 ccGenericPointCloud,是 主要的点云存储类
  • 负责 存储和管理具体点数据,如:
    • 点坐标 (m_points)
    • 颜色 (m_rgbColors)
    • 法向量 (m_normals)
    • 标量字段(可存储额外的点数据)
  • 还提供:
    • 预分配点存储 (reserve())
    • 添加点 (addPoint())
    • 访问点 (getPoint())
    • 复制点云 (clone())

示例代码:

ccPointCloud* cloud = new ccPointCloud("MyCloud");
cloud->reserve(1000);
cloud->addPoint(CCVector3(1.0f, 2.0f, 3.0f));
cloud->addRGBColor(ccColor::red);

(4) ccSubMesh(子网格)

class QCC_DB_LIB_API ccSubMesh : public ccGenericPointCloud
  • ccSubMesh 主要用于 存储局部网格
  • 它继承 ccGenericPointCloud,但和 ccPointCloud 不同,它主要存储 三角网格的子集,而不是点云本身。

3. ccPointCloud 如何存储点数据

(1) 点坐标

ccPointCloud 通过 m_points 存储点数据:

ccArray<CCVector3> m_points;

示例:

ccPointCloud* cloud = new ccPointCloud();
cloud->addPoint(CCVector3(10.0f, 20.0f, 30.0f));

(2) 颜色

m_rgbColors 记录每个点的颜色:

ccArray<ccColor::Rgb> m_rgbColors;

(3) 法向量

m_normals 记录点的法向量:

ccArray<CCVector3> m_normals;

4. ccHObject 如何管理 ccPointCloud

在 CloudCompare 里,ccHObject 提供 层次化管理

ccHObject* root = new ccHObject("Scene");
ccPointCloud* cloud = new ccPointCloud("MyPointCloud");
root->addChild(cloud);

这样 ccHObject 形成了一个树结构,使得 CloudCompare 可以组织多个点云数据。


5. 继承结构总结

ccHObject
    ├── ccGenericPointCloud      // 抽象点云基类
         ├── ccPointCloud       // 具体点云存储类
         ├── ccSubMesh          // 子网格(主要用于三角网格)
  • ccHObject:所有对象的基类,管理层次结构。
  • ccGenericPointCloud:所有点云的抽象基类,定义通用接口。
  • ccPointCloud:具体存储点数据的类。
  • ccSubMesh:用于存储局部三角网格。

6. 代码示例:如何使用 ccPointCloud

(1) 创建点云

ccPointCloud* cloud = new ccPointCloud("Sample Cloud");
cloud->reserve(1000); // 预分配 1000 个点
cloud->addPoint(CCVector3(1.0f, 2.0f, 3.0f));
cloud->addRGBColor(ccColor::green);

(2) 遍历 ccHObject 结构

ccHObject* root = new ccHObject("Root");
ccPointCloud* cloud = new ccPointCloud("MyPointCloud");
root->addChild(cloud);

for (unsigned i = 0; i < root->getChildrenNumber(); ++i)
{
    ccHObject* child = root->getChild(i);
    if (child->isA(CC_TYPES::POINT_CLOUD)) 
    {
        ccPointCloud* cloud = static_cast<ccPointCloud*>(child);
        std::cout << "Point count: " << cloud->size() << std::endl;
    }
}

总结

  1. ccHObject 是所有数据对象的基类,提供层次结构管理。
  2. ccGenericPointCloud 是点云数据的抽象基类,提供点云操作接口。
  3. ccPointCloud 是主要的点云存储类,管理点坐标、颜色、法向量等。
  4. ccSubMesh 继承自 ccGenericPointCloud,但用于局部网格。
  5. CloudCompare 使用 ccHObject 组织 ccPointCloud,形成层次化管理结构。

这个设计让 CloudCompare 能够高效管理、渲染和处理大规模点云数据!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值