VTK|加载ply文件数据进行平移+高程渲染

news2025/5/10 10:19:14

文章目录

  • 将 `.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 轴方向的位置 生成一个标量值(类似“高度”)。
  • LowPointHighPoint 设置了 Z 轴范围,这里用了 bounds[4/5] - center[2] 是因为模型已经被平移到以原点为中心。
  • 输出数据中每个点都带上了一个“Z 值标量”,用于后续着色。

🟩 2. 构造 Jet 风格的 Lookup Table(颜色映射表)

 // Jet 颜色映射(蓝→青→绿→黄→红)非线性 Jet LUT
    vtkNew<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.8
        t = 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); // 黄色
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372225.html

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

相关文章

JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码

一、源码描述 这是一套房屋租售管理源码&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA开发&#xff0c;源码功能完善&#xff0c;涵盖了房屋租赁、房屋销售、房屋交易等业务。 二、源码截图

掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力

一个普遍的现象是,大模型通常会根据给定的提示直接生成回复。对于一些简单的任务,大模型或许能够较好地应对。然而,当我们面对更加复杂的任务时,往往希望大模型能够表现得更加“智能”,具备适应多样场景和解决复杂问题的能力。为此,AgentScope 提供了内置的 ReAct 智能体…

Bearer Token的神秘面纱:深入解析HTTP认证头的设计哲学

为何有些Token会带Bearer&#xff1f; 在接口测试与开发中&#xff0c;我们经常会遇到这样的请求头&#xff1a; Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... 这个神秘的"Bearer"前缀从何而来&#xff1f;为何不直接使用Authorization: Token..…

【国产化】在银河麒麟ARM环境下离线安装docker

1、前言 采用离线安装的方式。 关于离线安装的方式官网有介绍&#xff0c;但是说的很简单&#xff0c;网址&#xff1a;Binaries | Docker Docs 官网介绍的有几种主流linux系统的安装方式&#xff0c;但是没有kylin的&#xff0c;所以在此记录一下。 在安装过程中也遇到了些…

java volatile关键字

volatile 是 Java 中用于保证多线程环境下变量可见性和禁止指令重排序的关键字。 普通变量不加volatile修饰有可见性问题&#xff0c;即有线程修改该变量值&#xff0c;其他线程无法立即感知该变量值修改了。代码&#xff1a; private static int intVal 0; // 普通变量未加 …

Vibe Coding: 优点与缺点

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

技术分享 | 如何在2k0300(LoongArch架构)处理器上跑通qt开发流程

近期迅为售后团队反馈&#xff0c;许多用户咨询&#xff1a;2K0300处理器采用了LA264处理器核&#xff0c;若要在该处理器上运行Qt程序&#xff0c;由于架构发生了变化&#xff0c;其使用方法是否仍与ARM平台保持一致&#xff1f; 单纯回答‘一致’或‘不一致’缺乏说服力&…

基于卷积神经网络和Pyqt5的猫狗识别小程序

任务描述 猫狗分类任务&#xff08;Dogs vs Cats&#xff09;是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集&#xff0c;12500张未标记照片组成的测试集。选手需要在规定时间…

解锁健康养生新境界

在追求高品质生活的当下&#xff0c;健康养生早已超越 “治未病” 的传统认知&#xff0c;成为贯穿全生命周期的生活艺术。它如同精密的交响乐&#xff0c;需饮食、运动、心理与生活习惯多维度协奏&#xff0c;方能奏响生命的强音。 饮食养生讲究 “顺时、适性”。遵循二十四节…

基于OpenCV的人脸识别:EigenFaces算法

文章目录 引言一、概述二、代码解析1. 准备工作2. 加载训练图像3. 设置标签4. 准备测试图像5. 创建和训练识别器6. 进行预测7. 显示结果 三、代码要点总结 引言 人脸识别是计算机视觉领域的一个重要应用&#xff0c;今天我将通过一个实际案例来展示如何使用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 适宜…

STL?vector!!!

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

从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?

近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…

FastChat部署大模型

一、前提条件 1、系统环境&#xff08;使用的 autodl 算力平台&#xff09; 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日&#xff0c;备受瞩目的第二十七届中国北京国际科技产业博览会&#xff08;以下简称&#xff1a;北京科博会&#xff09;在国家会议中心盛大开幕。作为我国科技领域的重要盛会&#xff0c;北京科博会汇聚了众多前沿科技成果与创新力量&#xff0c;为全球科技产业交流搭建…

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 缓冲…

北斗三号手持终端设备功能与应用

北斗三号卫星系统是我国自主建设、独立运行的全球卫星导航系统。通过多颗不同轨道卫星组成的&#xff0c;这些卫星持续向地球发射携带精确时间和位置信息的信号。地面上的北斗手持终端接收到至少四颗卫星信号后&#xff0c;利用信号传播时间差&#xff0c;通过三角函数等算法&a…

opencv中的图像特征提取

图像的特征&#xff0c;一般是指图像所表达出的该图像的特有属性&#xff0c;其实就是事物的图像特征&#xff0c;由于图像获得的多样性&#xff08;拍摄器材、角度等&#xff09;&#xff0c;事物的图像特征有时并不特别突出或与无关物体混杂在一起&#xff0c;因此图像的特征…

【JVM-GC调优】

一、预备知识 掌握GC相关的VM参数&#xff0c;会基本的空间调整掌握相关工具明白一点&#xff1a;调优跟应用、环境有关&#xff0c;没有放之四海而皆准的法则 二、调优领域 内存锁竞争cpu占用io 三、确定目标 【低延迟】&#xff1a;CMS、G1&#xff08;低延迟、高吞吐&a…