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

VTK|.obj文件数据处理+Jet/Viridis/CoolToWarm/Grayscale/Rainbow/风格颜色渲染

文章目录

  • 处理OBJ文件
  • Jet渲染风格
  • Viridis渲染风格
  • CoolToWarm渲染风格
  • Grayscale渲染风格
  • Rainbow渲染风格
  • 切换风格按钮槽函数(可优化)
  • 相关代码github链接

.obj 数据进行 Elevation 着色并可视化渲染的完整流程

和.ply文件处理方式一样

处理OBJ文件


void ThreeDimensionalDisplayPage::loadObjFile(vtkSmartPointer<vtkPolyData> _poly_data)
{renderer_->RemoveAllViewProps();renderer_->SetBackground(1.0, 1.0, 1.0); // 白色背景// 获取边界和中心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};// Elevation Filter 按 Z 值添加标量vtkNew<vtkElevationFilter> elevationFilter;elevationFilter->SetInputData(_poly_data);elevationFilter->SetLowPoint(0, 0, bounds[4]);  // 最低ZelevationFilter->SetHighPoint(0, 0, bounds[5]); // 最高ZelevationFilter->Update();// 获取标量范围double scalarRange[2];elevationFilter->GetOutput()->GetScalarRange(scalarRange);vtkSmartPointer<vtkLookupTable> colorLookupTable = createJetLookupTable(scalarRange[0], scalarRange[1]);// 映射器vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(elevationFilter->GetOutputPort());mapper->SetScalarRange(scalarRange);mapper->SetLookupTable(colorLookupTable);mapper->SetColorModeToMapScalars();mapper->ScalarVisibilityOn();// 面ActorsurfaceActor_ = vtkSmartPointer<vtkActor>::New();surfaceActor_->SetMapper(mapper);surfaceActor_->GetProperty()->SetOpacity(1.0);renderer_->AddActor(surfaceActor_);surfaceActor_->SetVisibility(is_surface_visible_);// 线框ActorwireframeActor_ = vtkSmartPointer<vtkActor>::New();wireframeActor_->SetMapper(mapper);wireframeActor_->GetProperty()->SetRepresentationToWireframe();wireframeActor_->GetProperty()->SetColor(0.2, 0.2, 0.2);wireframeActor_->GetProperty()->SetLineWidth(1.0);renderer_->AddActor(wireframeActor_);wireframeActor_->SetVisibility(is_wireframe_visible_);// 点ActorpointsActor_ = vtkSmartPointer<vtkActor>::New();pointsActor_->SetMapper(mapper);pointsActor_->GetProperty()->SetRepresentationToPoints();pointsActor_->GetProperty()->SetPointSize(6);pointsActor_->GetProperty()->SetColor(0.0, 0.0, 1.0);renderer_->AddActor(pointsActor_);pointsActor_->SetVisibility(is_points_visible_);renderer_->ResetCamera();renderWindow_->Render();m_pScene->update();
}

将jet风格渲染封装成了一个函数,统一调用

Jet渲染风格


vtkSmartPointer<vtkLookupTable> ThreeDimensionalDisplayPage::createJetLookupTable(double minValue, 
double maxValue, double gamma)
{auto lut = vtkSmartPointer<vtkLookupTable>::New();lut->SetNumberOfTableValues(256);lut->SetRange(minValue, maxValue); // 设置标量范围for (int i = 0; i < 256; ++i){double t = static_cast<double>(i) / 255.0;// 非线性调整 t,使颜色更集中于中间值t = std::pow(t, gamma);// Jet 配色映射:蓝 → 青 → 绿 → 黄 → 红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);lut->SetTableValue(i, r, g, b);}lut->Build();return lut;
}

在这里插入图片描述

Viridis渲染风格

vtkSmartPointer<vtkLookupTable> ThreeDimensionalDisplayPage::createViridisLookupTable(double minValue,double maxValue)
{auto lut = vtkSmartPointer<vtkLookupTable>::New();lut->SetNumberOfTableValues(256);lut->SetRange(minValue, maxValue);for (int i = 0; i < 256; ++i){double t = i / 255.0;// 近似 Matplotlib Viridis 色带(更精确的RGB值可参考官方定义)double r = 0.2795 + 0.4702 * t + 0.1649 * t * t - 0.0008 * t * t * t;double g = 0.0021 + 0.7047 * t + 0.0704 * t * t - 0.0053 * t * t * t;double b = 0.3904 + 0.1066 * t + 0.1968 * t * t - 0.0641 * t * t * t;lut->SetTableValue(i, r, g, b);}lut->Build();return lut;
}

在这里插入图片描述

CoolToWarm渲染风格

vtkSmartPointer<vtkLookupTable> ThreeDimensionalDisplayPage::createCoolToWarmLookupTable(double minValue,double maxValue)
{auto lut = vtkSmartPointer<vtkLookupTable>::New();lut->SetNumberOfTableValues(256);lut->SetRange(minValue, maxValue);for (int i = 0; i < 256; ++i){double t = i / 255.0;double r = t;                     // 红:从0→1double g = 1 - fabs(t - 0.5) * 2; // 绿:中间最亮double b = 1 - t;                 // 蓝:从1→0lut->SetTableValue(i, r, g, b);}lut->Build();return lut;
}

在这里插入图片描述

Grayscale渲染风格

vtkSmartPointer<vtkLookupTable> ThreeDimensionalDisplayPage::createGrayscaleLookupTable(double minValue, 
double maxValue)
{auto lut = vtkSmartPointer<vtkLookupTable>::New();lut->SetNumberOfTableValues(256);lut->SetRange(minValue, maxValue);for (int i = 0; i < 256; ++i){double gray = i / 255.0; // 从黑→白lut->SetTableValue(i, gray, gray, gray);}lut->Build();return lut;
}

在这里插入图片描述

Rainbow渲染风格


vtkSmartPointer<vtkLookupTable> ThreeDimensionalDisplayPage::createRainbowLookupTable(double minValue,double maxValue)
{auto lut = vtkSmartPointer<vtkLookupTable>::New();lut->SetNumberOfTableValues(256);lut->SetHueRange(0.666, 0.0); // 色相从蓝(0.666)→红(0.0)lut->SetSaturationRange(1.0, 1.0);lut->SetValueRange(1.0, 1.0);lut->SetRange(minValue, maxValue);lut->Build();return lut;
}

在这里插入图片描述

切换风格按钮槽函数(可优化)

void ThreeDimensionalDisplayPage::updateColorStyle(int style)
{current_color_style = style;if (ply_point_actor_) // PLY点云模型{auto mapper = vtkPolyDataMapper::SafeDownCast(ply_point_actor_->GetMapper());if (mapper){vtkSmartPointer<vtkLookupTable> new_lut;switch (style){case 0:new_lut = createJetLookupTable(current_scalar_range[0], current_scalar_range[1], 1.0);break;case 1:new_lut = createViridisLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 2:new_lut = createCoolToWarmLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 3:new_lut = createGrayscaleLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 4:new_lut = createRainbowLookupTable(current_scalar_range[0], current_scalar_range[1]);break;}mapper->SetLookupTable(new_lut);renderWindow_->Render();}}if (surfaceActor_) // OBJ网格模型{auto mapper = vtkPolyDataMapper::SafeDownCast(surfaceActor_->GetMapper());if (mapper){vtkSmartPointer<vtkLookupTable> new_lut;switch (style){case 0:new_lut = createJetLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 1:new_lut = createViridisLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 2:new_lut = createCoolToWarmLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 3:new_lut = createGrayscaleLookupTable(current_scalar_range[0], current_scalar_range[1]);break;case 4:new_lut = createRainbowLookupTable(current_scalar_range[0], current_scalar_range[1]);break;}mapper->SetLookupTable(new_lut);renderWindow_->Render();}}
}

相关代码github链接

相关文章:

  • 如何使用极狐GitLab 软件包仓库功能托管 helm chart?
  • 实践005-Gitlab CICD全项目整合
  • Java并发编程几个问题的解答
  • 在登录页面上添加验证码
  • 超详细!RxSwift 中的 BehaviorRelay 使用教程(含原理 + 示例 + 实战)
  • NetSuite 如何得到所有Item最近一次采购订单的货品单价?
  • 不再踩坑!React.memo正确用法及性能优化实战
  • AI时代企业应用系统架构的新思路与CIO变革指南
  • 21、魔法传送阵——React 19 文件上传优化
  • 轻量级证件照制作 AI 工具 HivisionIDPhotos 介绍
  • 单片机自动排列上料控制程序 下
  • DSP28335 串口中断收发及FIFO使用
  • 剖析 FFmpeg:从基本功能到过滤器,实现音视频处理的灵活性
  • 国内云内网接入方案
  • JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码
  • linux中的常用命令(一)
  • 运维打铁:服务器分类及PHP入门
  • ElasticSearch基本概念
  • 手撕基于AMQP协议的简易消息队列-8(单元测试的编写)
  • 【即插即用涨点模块】DSConv动态蛇形卷积:自适应聚焦细长弯曲的局部结构特征,助力分割高效提点【附源码+注释】
  • 人民日报整版聚焦:铭记二战历史,传承深厚友谊
  • 暴雨及强对流天气黄色预警已发布!南方进入本轮降雨最强时段
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • 首家股份行旗下AIC来了,兴银金融资产投资有限公司获批筹建
  • 刘诚宇、杨皓宇进球背后,是申花本土球员带着外援踢的无奈
  • 我国科研团队发布第四代量子计算测控系统