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

news2025/4/21 18:01:28

定义与用途

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.coloradmin.cn/o/2322593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GOC作业

实验室logo 题目描述 绘制烧毁实验室logo&#xff0c;它是由半径120&#xff0c;颜色6号色的空心元构成&#xff0c;中间的图案由线段长度为75&#xff0c;半径为15的实心圆构成&#xff0c;颜色从1号色开始&#xff0c;到6号色&#xff0c;如图所示 代码参考&#xff1a; …

本地部署仓库管理工具 Gitlab 并实现外部访问

Gitlab是一款自托管的 Git 仓库管理工具&#xff0c;它提供了完整的代码管理功能&#xff0c;包括代码托管、版本控制、代码合并请求、问题追踪、持续集成等。 本文将详细的介绍如何利用 Docker 在本地部署 Gitlab 并结合路由侠实现外网访问本地部署的 Gitlab 。‌ 第一步&am…

华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统

今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装&#xff0c;本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…

linux常用指令(9)

加油同志们,我们离胜利不远了,再有两天我们就可以了解完linux的一些基本常用指令了,到时我们便可以进入一些shell脚本语法了,那么话不多说,来看. 1.more指令 功能描述&#xff1a;more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容. 基本语法…

【windows搭建lvgl模拟环境之VSCode】

搭建vscodelvgl8.3所有资料&#xff0c;0积分 通过在windows搭建LVGL模拟环境方便UI界面开发和调试&#xff0c;后续只需将相关的代码移植到项目中即可&#xff0c;方便调试&#xff0c;PC上支持下列模拟器&#xff1a; 本文说明两种方法搭建模拟器环境&#xff0c;分别采用&am…

【BFS染色问题】P1162填涂颜色例题+核心逻辑

文章目录 【算法思路】【代码示例】 BFS处理染色问题的核心逻辑 【算法思路】 要判断一个数字 0 是否在闭合圈内&#xff0c;可以换个角度思考。不在闭合圈内的 0 是可以从方阵的边界出发&#xff0c;通过上下左右移动&#xff0c;只经过其他 0 到达的。 思路①.我们可以从方…

【多学科稳定EI会议大合集】计算机应用、通信信号、电气能源工程、社科经管教育、光学光电、遥感测绘、生物医学等多学科征稿!

在当今科技高速发展的时代&#xff0c;多学科领域的学术交流与融合显得尤为重要。以下是稳定EI会议合集&#xff0c;涵盖计算机、信息通信、电气能源、社科经管教育、光学遥感、生物医学等多个学科领域。 会议皆已通过国际知名出版社出版审核&#xff0c;EI检索稳定&#xff0…

ElasticSearch -- 部署完整步骤

前期准备 创建用户&#xff1a; sudo useradd hadoop sudo passwd hadoop# 密码 xxx系统层面&#xff0c;禁用内存交换 sudo swapoff -a修改 sudo vi /etc/security/limits.conf hadoop hard memlock unlimited hadoop soft memlock unlimited hadoop soft nofile 65536 had…

医学交互作用分析步骤和目的(R语言)

医学交互作用分析的目的和用途&#xff08;R语言&#xff09; 医学交互作用分析一直是医学数据分析的组成部分&#xff0c;总结最近的一些认识。 目的&#xff1a; 在独立危险因素鉴定的研究中&#xff0c;&#xff08;独立危险因素的&#xff09;交互作用可以作为独立危险因…

创新前沿 | 接管主机即刻增量CDP备份,高效保障接管期间业务安全!

科力锐创新前沿系列 接管主机增量CDP备份 高效保障接管业务安全 当核心系统遭遇系统故障或误操作导致数据逻辑损毁等&#xff0c;往往需要将生产业务主机接管起来&#xff0c;继续对外提供服务&#xff0c;保障业务连续性。 然而&#xff0c;你的接管主机真的安全吗?一旦接…

《基于python游戏设计与实现》开题报告

个人主页:@大数据蟒行探索者 一、研究背景、目的及意义 (一)研究背景 游戏的普及与成功:随着智能手机的普及和网络技术的发展,手机游戏产业逐渐成熟,成为娱乐文化产业的重要组成部分。《开心消消乐》作为一款休闲类游戏,自上线以来凭借其简单易上手的玩法和丰富的…

Netty源码—7.ByteBuf原理三

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收 9.Netty的内存规格 (1)4种内存规格 (2)内存申请单位 (1)4种内存规格 一.tiny&#xff1a;表示从…

(免费开源)图片去水印以及照片擦除功能,你会选择使用吗?

图片去水印以及相关人物擦除是一个非常小众的需求&#xff0c;就是将原本图片上的文字或者logo去除让变成一个干净的图片&#xff0c;但市面上很多都是付费的&#xff0c;今天就介绍一下这款免费工具。 工具演示效果 工具介绍 名称&#xff1a;lama-projct 利用AI模型训练LaM…

2025-03-26 学习记录--C/C++-PTA 6-2 顺序表操作集

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 6-2 顺序表操作集 本题要求实现顺序表的操作集。 函数接口定义&#xff1a; &#x1f447;&#x1f3fb; …

SQL-木马植入、报错注入及其他

一、读写权限确认 show global variables like %secure%; 查看mysql全局变量的配置&#xff0c;当输入以上命令时&#xff0c;结果 secure_file_priv 空的时候&#xff0c;任意读写 secure_file_priv 某个路径的时候&#xff0c;只能在规定的那个路径下读写 secure_file_pri…

用C#实现UDP服务器

对UDP服务器的要求 如同TCP通信一样让UDP服务端可以服务多个客户端 需要具备的条件&#xff1a; 1.区分消息类型(不需要处理分包、黏包) 2.能够接收多个客户端的消息 3.能够主动给自己发过消息的客户端发消息(记录客户端信息)…

印刷电路板 (PCB) 的影响何时重要?在模拟环境中导航

我和我的同事们经常被问到关于 PCB 效应的相同问题&#xff0c;例如&#xff1a; 仿真何时需要 PCB 效果&#xff1f; 为什么时域仿真需要 PCB 效应&#xff1f; 当 PCB 效应必须包含在仿真中时&#xff0c;频率是否重要&#xff1f; 设计人员应该在多大程度上关注 VRM 模型中包…

Leetcode 最小基因变化

java solution&#xff1a;BFS 算法 class Solution {public int minMutation(String startGene, String endGene, String[] bank) {//首先创建一个集合来存储有效基因串Set<String> bankSet new HashSet<>(Arrays.asList(bank));if(!bankSet.contains(endGene))…

输出输入练习

1. 题目&#xff1a;这个程序将向用户提出一个"y/N"问题&#xff0c;然后把用户输入的值赋值给answer变量。要求&#xff1a;针对用户输入y或y 和N或n进行过滤 #include <iostream>using namespace std;int main(){char answer;cout<<"请问可以格式…

人员进出新视界:视觉分析算法的力量

视觉分析赋能离岗检测新策略 随着时代的发展&#xff0c;失业率增加&#xff0c;社会安保压力也随之增大。企业为了提升管理效率&#xff0c;保障园区安全&#xff0c;对员工离岗检测的需求日益迫切。传统的离岗管理方式&#xff0c;如人工巡逻、打卡记录等&#xff0c;不仅效率…