CloudCompare (CC)中ccHObject详解
ccHObject
是 CloudCompare (CC) 的核心类之一,作为所有可视化和数据管理对象的基类。它支持层次结构管理,并能包含各种点云、网格、体素、标签等类型的子对象。
1. ccHObject
主要功能
- 层次结构管理 (可以添加子对象,形成树状结构)
- 可视化支持 (控制显示、颜色、选中状态)
- 数据管理 (存储点云、网格等对象)
- 文件存储 (支持 CloudCompare
.bin
文件格式) - 变换支持 (平移、旋转、缩放)
2. ccHObject
关键 API
(1) 构造 & 基础操作
#include <ccHObject.h>
// 创建一个 ccHObject
ccHObject* obj = new ccHObject("MyObject");
// 获取 ID
int id = obj->getUniqueID();
// 获取名称
QString name = obj->getName();
-
ccHObject(const QString& name = QString())
创建对象,并指定名称(默认空) -
int getUniqueID() const
返回对象的唯一 ID -
void setName(const QString& name)
设置对象名称 -
QString getName() const
获取对象名称
(2) 层次结构管理
ccHObject* parent = new ccHObject("Parent");
ccHObject* child = new ccHObject("Child");
// 添加子对象
parent->addChild(child);
// 获取子对象数量
int childCount = parent->getChildrenNumber();
// 获取指定索引的子对象
ccHObject* firstChild = parent->getChild(0);
-
void addChild(ccHObject* obj, int insertIndex = -1)
添加子对象(insertIndex
指定插入位置,-1
代表末尾) -
ccHObject* getParent()
获取当前对象的父对象 -
ccHObject* getChild(int index) const
获取索引为index
的子对象 -
int getChildrenNumber() const
返回子对象的数量 -
void removeChild(ccHObject* obj)
移除子对象 -
void detachChild(ccHObject* obj)
取消子对象的父子关系(但不删除对象)
(3) 可视化控制
// 设置是否可见
obj->setVisible(true);
// 检查对象是否可见
bool isVisible = obj->isVisible();
// 选中对象
obj->setSelected(true);
// 设置颜色(仅适用于支持颜色的对象)
ccColor::Rgb color(255, 0, 0);
obj->setTempColor(color);
-
void setVisible(bool state)
设置对象是否可见 -
bool isVisible() const
检查对象是否可见 -
void setSelected(bool state)
设置对象是否被选中 -
void setTempColor(const ccColor::Rgb& col, bool autoActivate = false)
设置临时颜色 -
void enableTempColor(bool state)
启用临时颜色
(4) 变换操作
#include <ccGLMatrix.h>
// 创建一个旋转矩阵
ccGLMatrix rotation;
rotation.initFromParameters(30.0, CCVector3(0, 1, 0), CCVector3(0, 0, 0));
// 应用变换
obj->applyGLTransformation_recursive();
obj->setGLTransformation(rotation);
// 取消变换
obj->razGLTransformation();
-
void applyGLTransformation_recursive(bool applyChildren = true)
递归应用 OpenGL 变换 -
void setGLTransformation(const ccGLMatrix& trans)
设置变换矩阵 -
void razGLTransformation()
取消当前变换
(5) 文件存储
#include <ccHObjectCaster.h>
// 保存到 .bin 文件
ccHObject* objectToSave = new ccHObject("SavedObject");
objectToSave->saveToFile("output.bin");
// 从文件加载
ccHObject* loadedObject = ccHObjectCaster::FromFile("output.bin");
-
bool saveToFile(QFile& out, short dataVersion) const
保存当前对象到.bin
文件 -
bool loadFromFile(QFile& in, short dataVersion, int flags)
从.bin
文件加载对象
3. ccHObject
继承类
CloudCompare 中有多个 ccHObject
的子类:
子类 | 功能 |
---|---|
ccPointCloud | 存储和管理点云数据 |
ccMesh | 存储和管理三角网格 |
ccPolyline | 存储和管理折线 |
ccScalarField | 存储标量字段(如高度值) |
ccIndexedTransformationBuffer | 变换矩阵序列 |
ccQuadric | 存储二次曲面 |
4. 示例:ccHObject
可视化点云
#include <ccPointCloud.h>
#include <ccGLWindow.h>
int main() {
// 创建一个点云对象
ccPointCloud* cloud = new ccPointCloud("My Point Cloud");
// 添加点
cloud->reserve(5);
cloud->addPoint(CCVector3(0, 0, 0));
cloud->addPoint(CCVector3(1, 0, 0));
cloud->addPoint(CCVector3(0, 1, 0));
cloud->addPoint(CCVector3(0, 0, 1));
cloud->addPoint(CCVector3(1, 1, 1));
// 创建 ccHObject 根节点
ccHObject* root = new ccHObject("Root");
root->addChild(cloud);
// 设置可视化
cloud->setVisible(true);
// 创建 CloudCompare 窗口
ccGLWindow* window = new ccGLWindow();
window->addToOwnDB(root);
window->redraw();
return 0;
}
说明:
ccPointCloud
继承自ccHObject
,可以存储点云。ccGLWindow
是 CloudCompare 的 OpenGL 渲染窗口。
5. ccHObject
的应用场景
- 点云层次管理
- 在 CloudCompare 组织多个点云数据
- 可视化处理
- 控制点云、网格、标量场的显示
- 文件存储
.bin
格式存储复杂 3D 数据
- 变换操作
- 旋转、平移、缩放对象
6. 结论
ccHObject
是 CloudCompare 的 核心基类,用于管理 3D 数据。- 通过继承
ccHObject
,可以创建自定义数据结构。 - 结合
ccGLWindow
,可以在 CloudCompare 中进行 可视化渲染。 - 通过
saveToFile()
和loadFromFile()
,可以存储.bin
格式的 3D 数据。
如果想在 PCL 中使用 ccHObject
进行可视化,建议使用 ccPointCloud
进行转换。