VTK|加载ply文件数据进行平移+高程渲染
文章目录
- 将 `.ply` 点云或模型数据进行 Elevation 着色并可视化渲染的完整流程
- 🟦 1. **使用 ElevationFilter 给模型上色(根据 Z 值)**
- 🟩 2. **构造 Jet 风格的 Lookup Table(颜色映射表)**
- 🔷 3. **点变为可渲染的 Vertex 图元**
- 🔶 4. **构造映射器,设置颜色 LUT 和标量范围**
- 🟥 5. **创建并设置 Actor**
- ⚙️ 6. **清除旧场景并渲染新模型**
- ✅ 总结整体流程
- 除了Jet 风格的 Lookup Table(颜色映射表)还有哪些常见的渲染风格
- 🎨 1. **Cool to Warm(冷暖色)**
- 🌈 2. **Rainbow / HSV 彩虹色**
- 🌫 3. **Grayscale(灰度)**
- 🌿 4. **Viridis(Matplotlib 默认)**
- 🔳 5. **Blackbody / Thermal / Fire**
- 🟨 6. **Category / Discrete Colors(分类颜色)**
- 📊 7. **Custom 自定义色带**
将 .ply
点云或模型数据进行 Elevation 着色并可视化渲染的完整流程
前置代码 加载ply文件
vtkNew<vtkPLYReader> reader;
reader->SetFileName(filePath.toStdString().c_str());
reader->Update();
polyData = reader->GetOutput();// 获取包围盒 (Bounds)
double bounds[6];
_poly_data->GetBounds(bounds);
// 计算模型中心
double center[3] = {(bounds[0] + bounds[1]) / 2.0,(bounds[2] + bounds[3]) / 2.0,(bounds[4] + bounds[5]) / 2.0};// 将整个模型向反方向移动,使其中心点对齐原点
vtkNew<vtkTransform> transform;
transform->Translate(-center[0], -center[1], -center[2]);
🟦 1. 使用 ElevationFilter 给模型上色(根据 Z 值)
vtkNew<vtkElevationFilter> elevationFilter;
elevationFilter->SetInputConnection(transformFilter->GetOutputPort());
elevationFilter->SetLowPoint(0, 0, bounds[4] - center[2]);
elevationFilter->SetHighPoint(0, 0, bounds[5] - center[2]);
elevationFilter->Update();
vtkElevationFilter
会根据模型每个点在 Z 轴方向的位置 生成一个标量值(类似“高度”)。LowPoint
和HighPoint
设置了 Z 轴范围,这里用了bounds[4/5] - center[2]
是因为模型已经被平移到以原点为中心。- 输出数据中每个点都带上了一个“Z 值标量”,用于后续着色。
🟩 2. 构造 Jet 风格的 Lookup Table(颜色映射表)
// Jet 颜色映射(蓝→青→绿→黄→红)非线性 Jet LUTvtkNew<vtkLookupTable> colorLookupTable;colorLookupTable->SetNumberOfTableValues(256);double scalarRange[2];elevationFilter->GetOutput()->GetScalarRange(scalarRange);colorLookupTable->SetRange(scalarRange);// colorLookupTable->SetRange(-50, 50); // 固定范围,确保色差for (int i = 0; i < 256; ++i){double t = i / 255.0;// 非线性调整 t,使得颜色中段更密集,末端压缩double gamma = 0.7; // 越小,中间越突出(类似 CloudCompare),可尝试 0.6 ~ 0.8t = std::pow(t, gamma);// Jet 调色映射(与 CloudCompare 相似的分布)double r = std::clamp(1.5 - std::abs(4.0 * t - 3.0), 0.0, 1.0);double g = std::clamp(1.5 - std::abs(4.0 * t - 2.0), 0.0, 1.0);double b = std::clamp(1.5 - std::abs(4.0 * t - 1.0), 0.0, 1.0);colorLookupTable->SetTableValue(i, r, g, b);}colorLookupTable->Build();
- 构造了一个 Jet 风格 的颜色映射(蓝→青→绿→黄→红),类似于 CloudCompare 的配色。
- 使用了
gamma=0.7
进行非线性压缩,使颜色分布更集中在中间(增加色彩层次感)。 - 范围固定为
[-50, 50]
,也就是说,无论模型多高,色差都按这个范围来映射,这是为了防止模型过扁而无法显著看到颜色过渡。
🔷 3. 点变为可渲染的 Vertex 图元
auto vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
vertexGlyphFilter->AddInputData(elevationFilter->GetOutput());
vertexGlyphFilter->Update();
- 给模型添加点拓扑(将点转换为可渲染的
vtkVertex
),如果省略这一段,纯点云将无法显示。
🔶 4. 构造映射器,设置颜色 LUT 和标量范围
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
mapper->SetScalarRange(elevationFilter->GetOutput()->GetScalarRange());
mapper->SetLookupTable(colorLookupTable);
mapper->SetColorModeToMapScalars();
mapper->ScalarVisibilityOn();
mapper->Update();
- 设置输入数据、颜色映射表。
- 使用 ElevationFilter 输出的 Z 值作为“标量值”,根据 LUT 显示颜色。
SetScalarRange(...)
确保 mapper 知道颜色范围如何对应到颜色表中。
🟥 5. 创建并设置 Actor
ply_point_actor_ = vtkSmartPointer<vtkActor>::New();
ply_point_actor_->SetMapper(mapper);
ply_point_actor_->GetProperty()->SetPointSize(point_size_edit_->text().toInt());
- 使用上面的 Mapper 创建可渲染的 Actor。
SetPointSize(...)
设置点大小,读取自 UI 控件(point_size_edit_
),用户可调。
⚙️ 6. 清除旧场景并渲染新模型
renderer_->RemoveAllViewProps(); // 移除旧的内容
renderer_->SetBackground(1.0, 1.0, 1.0); // 设置白色背景
renderer_->AddActor(ply_point_actor_); // 添加新Actor
addCoordinateAxes(); // 添加坐标轴
addBoundingBox(transformFilter->GetOutput()); // 添加包围盒
renderer_->ResetCamera(); // 相机重置
renderWindow_->Render(); // 执行渲染
m_pScene->update(); // 通知 UI 更新(Qt)
- 将新的 actor 放入渲染器中,刷新场景。
- 添加坐标轴与包围盒用于辅助显示。
- 调用
ResetCamera()
让摄像头自动对准场景。 - 渲染窗口刷新,并通过 Qt 通知界面刷新。
✅ 总结整体流程
步骤 | 说明 |
---|---|
① ElevationFilter | 为每个点生成 Z 值标量 |
② LookupTable | 创建 Jet 风格 LUT |
③ VertexGlyphFilter | 点 → vtkVertex,确保可渲染 |
④ Mapper | 设置映射、颜色 LUT、标量范围 |
⑤ Actor | 设置点大小、构建可视化对象 |
⑥ Renderer | 清除旧内容、添加新 Actor、刷新界面 |
除了Jet 风格的 Lookup Table(颜色映射表)还有哪些常见的渲染风格
除了 Jet 风格(蓝→青→绿→黄→红)之外,VTK 和三维可视化中常见的颜色映射表(Lookup Table, LUT)还有以下几类,每种适合不同的可视化目的:
🎨 1. Cool to Warm(冷暖色)
- 🌊🔶 蓝 → 白 → 红(低值冷色,高值暖色)
- 用途:强调数据中“高/低”对比(如温度、压力)
- VTK 内置:
vtkColorTransferFunction::SetColorSpaceToDiverging()
+ 两端色设置
🌈 2. Rainbow / HSV 彩虹色
- 🟥🟧🟨🟩🟦🟪 类似色相环,覆盖整个色谱
- 缺点:视觉不连续、对人眼不友好(不推荐用于严肃科学展示)
- 用途:可用于展示离散类别或艺术可视化
- VTK:
vtkLookupTable::SetHueRange(0.0, 1.0);
🌫 3. Grayscale(灰度)
-
⚫→⚪ 从黑到白
-
用途:医学图像、形状对比、打印友好
-
设置方式:
lut->SetTableValue(i, t, t, t); // R=G=B
🌿 4. Viridis(Matplotlib 默认)
- 🌌🟢💛 深紫 → 蓝 → 青绿 → 黄绿
- 优点:感知均匀,对色盲友好
- 用途:科学绘图标准(推荐)
- 在 VTK 中可手动构造,或从 matplotlib colormap 读取 RGB 值
🔳 5. Blackbody / Thermal / Fire
- 🔴🟡⚪ 类似热红外风格(黑→红→黄→白)
- 用于:热成像、能量密度可视化
- VTK:
vtkColorTransferFunction::SetColorSpaceToRGB()
,然后插值这些颜色
🟨 6. Category / Discrete Colors(分类颜色)
- 固定 N 种颜色(适合整数 label 或分类)
- 不能用连续 ScalarRange
- 通常和
vtkUnsignedCharArray
配合使用 - 示例:红绿蓝紫等分配不同类别
📊 7. Custom 自定义色带
-
手动设置几个关键色,插值形成 LUT
-
用法灵活:地形图、高度图、材质图等
-
例子:
lut->SetTableValue(0, 0.0, 0.0, 0.5); // 深蓝 lut->SetTableValue(128, 0.0, 1.0, 0.0); // 绿色 lut->SetTableValue(255, 1.0, 1.0, 0.0); // 黄色
相关文章:
VTK|加载ply文件数据进行平移+高程渲染
文章目录 将 .ply 点云或模型数据进行 Elevation 着色并可视化渲染的完整流程🟦 1. **使用 ElevationFilter 给模型上色(根据 Z 值)**🟩 2. **构造 Jet 风格的 Lookup Table(颜色映射表)**🔷 3.…...

JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码
一、源码描述 这是一套房屋租售管理源码,基于SpringBootVue框架,后端采用JAVA开发,源码功能完善,涵盖了房屋租赁、房屋销售、房屋交易等业务。 二、源码截图...

掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
一个普遍的现象是,大模型通常会根据给定的提示直接生成回复。对于一些简单的任务,大模型或许能够较好地应对。然而,当我们面对更加复杂的任务时,往往希望大模型能够表现得更加“智能”,具备适应多样场景和解决复杂问题的能力。为此,AgentScope 提供了内置的 ReAct 智能体…...
AOP实现原理
AOP实现原理 背景实现常用注解 背景 感觉需要掌握, 对理解其他知识点有好处. 实现 动态代理实现. JDK 实现 InvacationHander CGLib Enhancer 轻量级的基于ASM字节码框架. 常用注解 Before After AfterRetruning AfterThrowing Around...

Bearer Token的神秘面纱:深入解析HTTP认证头的设计哲学
为何有些Token会带Bearer? 在接口测试与开发中,我们经常会遇到这样的请求头: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... 这个神秘的"Bearer"前缀从何而来?为何不直接使用Authorization: Token..…...

【国产化】在银河麒麟ARM环境下离线安装docker
1、前言 采用离线安装的方式。 关于离线安装的方式官网有介绍,但是说的很简单,网址:Binaries | Docker Docs 官网介绍的有几种主流linux系统的安装方式,但是没有kylin的,所以在此记录一下。 在安装过程中也遇到了些…...
K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战
引言 在 Kubernetes 环境中,容器镜像的存储与管理至关重要。企业级镜像仓库(如 Harbor)为团队提供了安全、稳定、可扩展的镜像管理解决方案。 一、Harbor 安装与配置 Harbor 是由 VMware 开源的企业级云原生镜像仓库,它不仅支持…...
ASCII码的快速记忆方法
当然!记住ASCII码的关键是找到规律和分组记忆。以下是一些快速记忆的方法: 1. 记住关键分界点 0~31:控制字符(不可打印,如换行、制表符等),不需要全记,知道0是NULL,10是…...

java volatile关键字
volatile 是 Java 中用于保证多线程环境下变量可见性和禁止指令重排序的关键字。 普通变量不加volatile修饰有可见性问题,即有线程修改该变量值,其他线程无法立即感知该变量值修改了。代码: private static int intVal 0; // 普通变量未加 …...
解决SQL Server SQL语句性能问题(9)——正确使用索引
前述章节中,我们介绍和讲解了SQL调优所需要的基本知识和分析方法,那么,通过前述这些知识和方法定位到问题后,接下来,我们该怎么做呢?那就是本章的内容,给出解决SQL语句性能问题的、科学而合理的方案和方法。 本章主要对解决SQL语句性能问题的几种常用方法进行说明和讲解…...

Vibe Coding: 优点与缺点
如果你最近在开发圈子里,你很可能听说过这个新趋势"vibe coding"(氛围编程)。 我只能说我对此感受复杂。以下是原因。 优势 在构建新项目时,靠着氛围编程达到成功感觉很自由!但对于遗留代码来说情况就不同了,尽管也不是不可能。 实时反馈和快速迭代 Cursor(…...

技术分享 | 如何在2k0300(LoongArch架构)处理器上跑通qt开发流程
近期迅为售后团队反馈,许多用户咨询:2K0300处理器采用了LA264处理器核,若要在该处理器上运行Qt程序,由于架构发生了变化,其使用方法是否仍与ARM平台保持一致? 单纯回答‘一致’或‘不一致’缺乏说服力&…...
产品经理如何借助 DeepSeek 提升工作效能
在数字化时代的浪潮中,产品经理肩负着推动产品从概念到成功落地的重任,面临着复杂多变的市场环境、层出不穷的用户需求以及紧锣密鼓的项目周期。而 DeepSeek 这一先进的人工智能工具,宛如一把 “瑞士军刀”,为产品经理在各个工作环…...

基于卷积神经网络和Pyqt5的猫狗识别小程序
任务描述 猫狗分类任务(Dogs vs Cats)是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集,12500张未标记照片组成的测试集。选手需要在规定时间…...
Hadoop 和 Spark 生态系统中的核心组件
以下是 Hadoop 和 Spark 生态系统的核心组件及其功能: Hadoop 生态核心组件 1. HDFS(Hadoop 分布式文件系统) - 命令/工具: hdfs 命令(如 hdfs dfs -put 等)。 - 作用:分布式存储海量数据&a…...

解锁健康养生新境界
在追求高品质生活的当下,健康养生早已超越 “治未病” 的传统认知,成为贯穿全生命周期的生活艺术。它如同精密的交响乐,需饮食、运动、心理与生活习惯多维度协奏,方能奏响生命的强音。 饮食养生讲究 “顺时、适性”。遵循二十四节…...
MQTT:轻量级物联网通信协议详解
引言 在物联网(IoT)迅速发展的今天,设备之间的高效通信变得至关重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的发布/订阅消息传输协议,因其低带宽、低延迟和易于实现的特性,…...
C 语言逻辑运算符:组合判断,构建更复杂的条件
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在 C 语言编程中,我们已经学习了如何使用比较运算符(如 ==, <, >)来判断两个值之间的关系,从而得到“真”或“假”的结果。但很多时候,我们需要根据多个条件的组合…...

基于OpenCV的人脸识别:EigenFaces算法
文章目录 引言一、概述二、代码解析1. 准备工作2. 加载训练图像3. 设置标签4. 准备测试图像5. 创建和训练识别器6. 进行预测7. 显示结果 三、代码要点总结 引言 人脸识别是计算机视觉领域的一个重要应用,今天我将通过一个实际案例来展示如何使用OpenCV中的EigenFac…...

【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用
一、智能追焦技术概述 智能追焦是基于人工智能和自动化技术的对焦功能,通过深度学习算法识别并持续跟踪移动物体(如人、动物、运动器械等),实时调整焦距以保持主体清晰,显著提升动态场景拍摄成功率。其核心优势包括: 精准性:AI 算法优化复杂运动轨迹追踪(如不规则移动…...

网络研讨会开发注册中, 5月15日特励达力科,“了解以太网”
在线研讨会主题 Understanding Ethernet - from basics to testing & optimization 了解以太网 - 从基础知识到测试和优化 注册链接# https://register.gotowebinar.com/register/2823468241337063262 时间 北京时间 2025 年 5 月 15 日 星期四 下午 3:30 - 4:30 适宜…...
在 Spring Boot 中实现动态线程池的全面指南
动态线程池是一种线程池管理方案,允许在运行时根据业务需求动态调整线程池参数(如核心线程数、最大线程数、队列容量等),以优化资源利用率和系统性能。在 Spring Boot 中,动态线程池可以通过 Java 的 ThreadPoolExecut…...

STL?vector!!!
一、前言 之前我们借助手撕string加深了类和对象相关知识,今天我们将一起手撕一个vector,继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector? vector是一个STL库中提供的类模板,它是存储…...

从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?
近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…...
LDO与DCDC总结
目录 1. 工作原理 2. 性能对比 3. 选型关键因素 4. 典型应用 总结 1. 工作原理 LDO LDO通过线性调节方式实现降压,输入电压需略高于输出电压(压差通常为0.2-2V),利用内部PMOS管或PNP三极管调整压差以稳定输出电压。其结构简单…...

FastChat部署大模型
一、前提条件 1、系统环境(使用的 autodl 算力平台) 2、安装相关库 安装 modescope pip3 install -U modelscope # 或使用下方命令 # pip3 install -U modelscope -i https://mirror.sjtu.edu.cn/pypi/web/simple安装 fastchat git clone https://gi…...

智汇云舟亮相第二十七届北京科博会
5月8日,备受瞩目的第二十七届中国北京国际科技产业博览会(以下简称:北京科博会)在国家会议中心盛大开幕。作为我国科技领域的重要盛会,北京科博会汇聚了众多前沿科技成果与创新力量,为全球科技产业交流搭建…...

Redis最新入门教程
文章目录 Redis最新入门教程1.安装Redis2.连接Redis3.Redis环境变量配置4.入门Redis4.1 Redis的数据结构4.2 Redis的Key4.3 Redis-String4.4 Redis-Hash4.5 Redis-List4.6 Redis-Set4.7 Redis-Zset 5.在Java中使用Redis6.缓存雪崩、击穿、穿透6.1 缓存雪崩6.2 缓冲击穿6.3 缓冲…...

北斗三号手持终端设备功能与应用
北斗三号卫星系统是我国自主建设、独立运行的全球卫星导航系统。通过多颗不同轨道卫星组成的,这些卫星持续向地球发射携带精确时间和位置信息的信号。地面上的北斗手持终端接收到至少四颗卫星信号后,利用信号传播时间差,通过三角函数等算法&a…...
提升编程效率的利器:Zed高性能多人协作代码编辑器
在当今这个快节奏的开发环境中,一个高效、灵活的代码编辑器无疑对开发者们起着至关重要的支持作用。Zed,作为来自知名编辑器Atom和语法解析器Tree-sitter的创造者的心血之作,正是这样一款高性能支持多人合作的编辑神器。本文将带领大家深入探…...