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 对象,实现高效的点云和网格可视化!