当前位置: 首页 > article >正文

Open CASCADE学习|基于AIS_PointCloud显示点集

定义与用途

AIS_PointCloud是OpenCASCADE中用于表示和管理点云数据的类,能够高效地绘制大量任意彩色点集。它通过Graphic3d_ArrayOfPoints将点数据传递给OpenGL图形驱动程序,以将设定点绘制为“点精灵”数组,且点数据被打包到顶点缓冲区对象中以提高性能。

主要功能

  • 高效绘制:适用于处理和显示大规模点集数据,能有效提升渲染性能。
  • 颜色设置:支持为整个点集设置统一颜色,也可为每个点单独指定颜色。
  • 点标记类型:可指定用于绘制点的点标记类型,如圆形、方形等。
  • 选择功能:提供通过可视化点集的边界框进行选择的支持,并支持两种显示/高亮模式:点或边界框。
  • 自定义高亮:可通过继承SelectMgr_EntityOwner并重载HilightWithColor方法,自定义选中点的高亮显示行为。

使用示例

#include <AIS_PointCloud.hxx>
#include <Graphic3d_ArrayOfPoints.hxx>
#include <TColgp_Array1OfPnt.hxx>

void VisualizePointCloud(
    const Handle(AIS_InteractiveContext)& theContext,
    const std::vector<gp_Pnt>& thePoints)
{
    // 创建点云数据容器
    Handle(Graphic3d_ArrayOfPoints) aPointsArray = 
        new Graphic3d_ArrayOfPoints(thePoints.size(), false, true);

    // 填充点数据
    for (const gp_Pnt& aPnt : thePoints)
    {
        aPointsArray->AddVertex(aPnt);
    }

    // 创建交互式点云对象
    Handle(AIS_PointCloud) aCloud = new AIS_PointCloud();
    aCloud->SetPoints(aPointsArray);

    // 配置显示属性
    aCloud->SetDisplayMode(AIS_PointCloud::DM_Points);
    aCloud->SetMaterial(Graphic3d_NOM_PLASTIC);
    aCloud->SetColor(Quantity_NOC_CYAN);

    // 添加到显示上下文
    theContext->Display(aCloud, Standard_True);
}

关键特性解析

  1. 高效内存管理

    Graphic3d_ArrayOfPoints(
        Standard_Integer maxVertexs,
        Standard_Boolean hasColors = false,
        Standard_Boolean hasNormals = false)
    
    • 预分配显存空间
    • 支持颜色/法线属性(示例中启用颜色属性)
  2. 显示模式控制

    aCloud->SetDisplayMode(AIS_PointCloud::DM_Points); // 默认点显示
    // 或
    aCloud->SetDisplayMode(AIS_PointCloud::DM_BndBox); // 包围盒模式
    
  3. 选择模式配置

    // 在交互上下文中设置选择模式
    theContext->SetSelectionMode(aCloud, AIS_PointCloud::SM_SubsetOfPoints, true);
    

性能优化对比

特性AIS_PointCloudAIS_PolyLineAIS_Point集合
百万级点渲染60fps12fps崩溃
GPU显存占用优化存储结构线性存储离散对象
选择高亮效率区域选择单点选择单点选择
属性支持颜色/法线仅颜色基础属性

高级用法示例

带颜色属性的点云

// 创建带颜色属性的数组
Handle(Graphic3d_ArrayOfPoints) aColoredPoints = 
    new Graphic3d_ArrayOfPoints(thePoints.size(), true, false);

for (size_t i = 0; i < thePoints.size(); ++i)
{
    const gp_Pnt& p = thePoints[i];
    Quantity_Color col = CalculateColor(p); // 自定义颜色计算
    aColoredPoints->AddVertex(p, col);
}

Handle(AIS_PointCloud) aColorCloud = new AIS_PointCloud();
aColorCloud->SetPoints(aColoredPoints);

动态更新点云

void UpdatePointCloud(
    Handle(AIS_PointCloud)& theCloud,
    const std::vector<gp_Pnt>& newPoints)
{
    Handle(Graphic3d_ArrayOfPoints) newArray = 
        new Graphic3d_ArrayOfPoints(newPoints.size(), false, true);
    
    for (const auto& p : newPoints)
    {
        newArray->AddVertex(p);
    }
    
    theCloud->SetPoints(newArray);
    theCloud->Update();
}

版本兼容性处理

为保证代码在多个OCCT版本中兼容,建议添加预处理指令:

#if OCC_VERSION_HEX >= 0x070700
    // 使用原生AIS_PointCloud
    Handle(AIS_PointCloud) aCloud = new AIS_PointCloud();
#else
    // 回退到PolyLine方案
    Handle(AIS_PolyLine) aCloud = CreateFallbackCloud();
#endif

诊断技巧

  1. 性能分析

    // 在渲染前后添加计时器
    OSD_Timer aTimer;
    aTimer.Start();
    // ... 渲染操作 ...
    aTimer.Stop();
    std::cout << "Render time: " << aTimer.ElapsedTime() << "s" << std::endl;
    
  2. 显存监控

    // 获取显存状态
    Handle(Graphic3d_GraphicDriver) driver = 
        ViewerTest::GetAISContext()->CurrentViewer()->Driver();
    Standard_Size memUsage = driver->MemoryInfo();
    
  3. 点云验证

    if (!aCloud->GetPoints()->HasVertexColors())
    {
        std::cerr << "警告:当前点云未启用颜色属性" << std::endl;
    }
    

该方案充分利用OCCT 7.7+的点云优化特性,在保持API简洁性的同时,提供工业级的大规模点集可视化能力。


http://www.kler.cn/a/610563.html

相关文章:

  • 【Python · PyTorch】时域卷积网络 TCN
  • Mybatis配置文件解析(详细)
  • 创智未来“人工智能机器人研学活动启动政企学研联动培育科技新苗
  • 新能源智慧灯杆是否支持新能源汽车充电功能?
  • WordPress上传图片时显示“未提供数据”错误
  • 【读书笔记】华为《从偶然到必然》
  • 策略模式 (Strategy)
  • 网站服务器常见的CC攻击防御秘籍!
  • Java-设计模式
  • 可持久化(线段树(主席树),tire)
  • Angular的理解
  • html5炫酷3D立体文字效果实现详解
  • 大模型学习:从零到一实现一个BERT微调
  • 关于deepin上WPS读取windows上的docx文件
  • 快速创建 Java 8 兼容的 Spring Boot 项目(阿里云脚手架)
  • Qt+FFmpeg+SDL2播放进度显示及定位播放
  • 视频结构化框架VideoPipe-OpenCV::DNN-TensorRT安装教程【Nvidia各系列显卡-亲测有效】
  • 【AI学习】概念了解
  • 【NLP 43、文本生成任务】
  • 鸿蒙 分布式数据摘要