CloudCompare 中ccDrawableObject 代码解析

CloudCompare ccDrawableObject 代码解析

1. ccDrawableObject 的作用

ccDrawableObject 是 CloudCompare 中所有 可绘制 3D 对象基类,它提供了一套 通用接口 用于管理 可视化属性(如可见性、颜色、法向量、标量字段、材质、OpenGL 变换、裁剪平面等)。
CloudCompare 的点云、网格、线段等 3D 对象类都继承自 ccDrawableObject,并实现具体的绘制逻辑。


2. 代码解析

(1)构造与析构

//! Default constructor
ccDrawableObject();
  • 默认构造函数:初始化对象属性,如可见性、颜色显示等。
//! Copy constructor
ccDrawableObject(const ccDrawableObject& object);
  • 拷贝构造函数:用于对象拷贝。
virtual ~ccDrawableObject() = default;
  • 虚析构函数:保证基类指针释放派生类对象时调用正确的析构函数。

(2)可视化控制

可见性控制
inline virtual bool isVisible() const { return m_visible; }
inline virtual void setVisible(bool state) { m_visible = state; }
inline virtual void toggleVisibility() { setVisible(!isVisible()); }
  • isVisible():返回对象是否可见。
  • setVisible(bool state):设置对象可见性。
  • toggleVisibility():切换可见性。
inline virtual bool isVisibilityLocked() const { return m_lockedVisibility; }
inline virtual void lockVisibility(bool state) { m_lockedVisibility = state; }
  • isVisibilityLocked():检查是否锁定了可见性(锁定后用户无法更改可见性)。
  • lockVisibility(bool state):锁定/解锁可见性。
选择状态
inline virtual bool isSelected() const { return m_selected; }
inline virtual void setSelected(bool state) { m_selected = state; }
  • isSelected():检查对象是否被选中。
  • setSelected(bool state):设置选中状态。

(3)绘制参数

virtual void getDrawingParameters(glDrawParams& params) const;
  • getDrawingParameters:获取 OpenGL 绘制参数,例如点、法向量、颜色等是否可见。

(4)颜色与法向量控制

inline virtual bool hasColors() const { return false; }
inline virtual bool colorsShown() const { return m_colorsDisplayed; }
inline virtual void showColors(bool state) { m_colorsDisplayed = state; }
inline virtual void toggleColors() { showColors(!colorsShown()); }
  • hasColors():对象是否有颜色(默认 false,由子类实现)。
  • colorsShown():是否显示颜色。
  • showColors(bool state):设置颜色可见性。
  • toggleColors():切换颜色显示状态。
inline virtual bool hasNormals() const { return false; }
inline virtual bool normalsShown() const { return m_normalsDisplayed; }
inline virtual void showNormals(bool state) { m_normalsDisplayed = state; }
inline virtual void toggleNormals() { showNormals(!normalsShown()); }
  • 与颜色类似,控制法向量(Normals)的可见性

(5)标量字段(Scalar Field, SF)

inline virtual bool hasDisplayedScalarField() const { return false; }
inline virtual bool hasScalarFields() const { return false; }
inline virtual void showSF(bool state) { m_sfDisplayed = state; }
inline virtual void toggleSF() { showSF(!sfShown()); }
inline virtual bool sfShown() const { return m_sfDisplayed; }
  • hasDisplayedScalarField():是否有激活的标量字段(默认 false,由子类实现)。
  • hasScalarFields():对象是否包含标量字段数据。
  • showSF(bool state):控制标量字段显示。
  • toggleSF():切换标量字段可见性。
  • sfShown():返回标量字段是否可见。

(6)OpenGL 变换管理

virtual void setGLTransformation(const ccGLMatrix& trans);
virtual void enableGLTransformation(bool state);
inline virtual bool isGLTransEnabled() const { return m_glTransEnabled; }
inline virtual const ccGLMatrix& getGLTransformation() const { return m_glTrans; }
virtual void resetGLTransformation();
virtual void rotateGL(const ccGLMatrix& rotMat);
virtual void translateGL(const CCVector3& trans);
  • setGLTransformation:设置 OpenGL 变换矩阵(旋转 + 平移)。
  • enableGLTransformation:启用/禁用 OpenGL 变换。
  • isGLTransEnabled:返回是否启用了 OpenGL 变换。
  • resetGLTransformation:将变换重置为单位矩阵。
  • rotateGL/translateGL:分别 旋转/平移 OpenGL 变换。

(7)临时颜色

inline virtual bool isColorOverridden() const { return m_colorIsOverridden; }
inline virtual const ccColor::Rgba& getTempColor() const { return m_tempColor; }
virtual void setTempColor(const ccColor::Rgba& col, bool autoActivate = true);
virtual void setTempColor(const ccColor::Rgb& col, bool autoActivate = true);
inline virtual void enableTempColor(bool state) { m_colorIsOverridden = state; }
  • setTempColor():设置临时颜色(RGBA 或 RGB)。
  • isColorOverridden():返回是否启用了临时颜色。
  • enableTempColor(bool state):启用/禁用临时颜色。

(8)显示管理

virtual void removeFromDisplay(const ccGenericGLDisplay* win);
virtual void setDisplay(ccGenericGLDisplay* win);
inline virtual ccGenericGLDisplay* getDisplay() const { return m_currentDisplay; }
virtual void redrawDisplay();
virtual void prepareDisplayForRefresh();
virtual void refreshDisplay(bool only2D = false);
  • setDisplay()/getDisplay():管理对象关联的 OpenGL 视图。
  • removeFromDisplay():从当前 OpenGL 视图移除对象。
  • refreshDisplay()/redrawDisplay():刷新或重绘 OpenGL 视图。

3. 作用总结

ccDrawableObject 作为 基类,定义了所有 可绘制 3D 对象的通用属性,包括:

  • 可见性、颜色、法向量、标量字段
  • OpenGL 变换(旋转/平移)
  • 材质、裁剪平面、显示管理
  • 临时颜色

主要子类

  • ccHObject(层次结构管理)
  • ccPointCloud(点云数据)
  • ccGenericMesh(网格)
  • ccPolyline(多段线)

核心功能

  • 控制 3D 对象的绘制、可视化属性、OpenGL 变换
  • 管理与 OpenGL 视图的关联

这使得 CloudCompare 能够灵活管理各种 3D 对象,实现高效的点云和网格可视化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云SLAM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值