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

news/2025/3/30 4:11:42/

定义与用途

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_PointCloudHandle(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.ppmy.cn/news/1583459.html

相关文章

数据文件误删除,OceanBase中如何重建受影响的节点

当不慎误删数据文件且当前没有现成的可替换节点时&#xff0c;在OceanBase中&#xff0c;不必急于采取极端措施&#xff0c;可以考虑运用 server_permanent_offline_time 参数&#xff0c;来重建受影响的节点。 原理&#xff1a; server_permanent_offline_time 是 OceanBase数…

仅靠prompt,Agent难以自救

Alexander的观点很明确&#xff1a;未来 AI 智能体的发展方向还得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。还拿目前很火的 Manus 作为案例&#xff1a;他认为像 Manus 这样基于「预先编排好的提示词与工具路径」构成的工作流智能体&#xff0c;…

第一天学爬虫

阅读提示&#xff1a;我今天才开始尝试爬虫&#xff0c;写的不好请见谅。 一、准备工具 requests库&#xff1a;发送HTTP请求并获取网页内容。BeautifulSoup库&#xff1a;解析HTML页面并提取数据。pandas库&#xff1a;保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

蓝桥杯刷题 Day 4 栈与链表

蓝桥杯刷题 Day 4 栈与链表 文章目录 蓝桥杯刷题 Day 4 栈与链表前言一、栈1. 解题思路2. 拆解代码&#xff08;不复杂&#xff0c;不拆了&#xff09; 二、链表1. 解题思路1.1 主函数1.2 自定义列表类1.2.1 插入操作1.2.2 删除操作1.2.3 按要求输出 三、 题后收获3.1 知识点 前…

python中的面对对象

目录 面向对象 类 对象 面向对象 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种编程范式&#xff0c;Python是一种支持面向对象编程的多范式编程语言。在Python中&#xff0c;一切皆为对象&#xff0c;每个对象都拥有属性&#xff08;attri…

air780eq 阿里云

硬件&#xff1a;APM32F030C8 Air 780eq 参考文档&#xff1a; 合宙780E-4G模块通过AT指令连接到阿里云平台&#xff0c;实现信息的收发_air780e上传阿里云属性值at命令-CSDN博客 阿里云 - atair780eq - 合宙文档中心 4G模块接入阿里云-实现数据上传和命令下发_4g模块上传…

华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…

深入解析SQL2API平台:数据交互革新者

在数字化转型持续深入的当下&#xff0c;企业对数据的高效利用与管理的需求愈发迫切。SQL2API平台应运而生&#xff0c;成为助力企业突破数据交互困境的有力工具&#xff0c;特别是它由麦聪软件基于DaaS&#xff08;数据即服务&#xff09;产品创新衍生而来&#xff0c;备受业界…