在 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;
}
}
总结
ccHObject
是所有数据对象的基类,提供层次结构管理。ccGenericPointCloud
是点云数据的抽象基类,提供点云操作接口。ccPointCloud
是主要的点云存储类,管理点坐标、颜色、法向量等。ccSubMesh
继承自ccGenericPointCloud
,但用于局部网格。- CloudCompare 使用
ccHObject
组织ccPointCloud
,形成层次化管理结构。
这个设计让 CloudCompare 能够高效管理、渲染和处理大规模点云数据!