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

MarchingCubes 网格数据体素化并提取等值面

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①MarchingCubes提取等值面的机理,②多边形体素化


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonDataModel import vtkImageData from vtkmodules.vtkFiltersCore import vtkFlyingEdges3D, vtkMarchingCubes from vtkmodules.vtkFiltersSources import vtkSphereSource from vtkmodules.vtkImagingHybrid import vtkVoxelModeller from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) if __name__ == '__main__': colors = vtkNamedColors() iso_value = 50 volume = vtkImageData() sphere_source = vtkSphereSource() sphere_source.SetPhiResolution(20) sphere_source.SetThetaResolution(20) sphere_source.Update() bounds = list(sphere_source.GetOutput().GetBounds()) """ 根据现有包围盒,将包围盒大小进行扩大 """ for i in range(0, 6, 2): dist = bounds[i + 1] - bounds[i] bounds[i] = bounds[i] - 0.1 * dist bounds[i + 1] = bounds[i + 1] + 0.1 * dist """ vtkVoxelModeller 将任意几何对象(如多边形数据)转换为体素化的三维体积数据 通过计算每个体素点到几何表面的距离场来生成体数据 """ voxel_modeller = vtkVoxelModeller() voxel_modeller.SetInputConnection(sphere_source.GetOutputPort()) voxel_modeller.SetModelBounds(bounds) voxel_modeller.SetSampleDimensions(50, 50, 50) voxel_modeller.SetScalarTypeToFloat() """ SetMaximumDistance 设定体素化过程中距离场的渐变范围的厚度 渐变范围的厚度的意思: 体素化的两种思路: 1)二值化(Binary)模式 每个体素(voxel)的值要么是 1(在几何体内),要么是 0(在几何体外)表面就是 内外的分界线 2) 带渐变的距离场(Signed Distance Field, SDF) 每个体素的值表示 到几何表面的距离,通常内部为负,外部为正 在表面附近的一个“带状区域”里,值会平滑过渡,而不是硬切换 vtkVoxelModeller.SetMaximumDistance(d) 控制的就是这个带状区域的厚度 d 例子: 假设我们有一个球,半径 = 10,SetMaximumDistance(0.5): 在表面上:值 ≈ 0.5 (归一化后 ≈ 0.5)。 表面以内 0.5 个体素厚度的区域:值逐渐减小到 0。 表面以外 0.5 个体素厚度的区域:值逐渐增大到 1。 超过 0.5 的距离后,值就被**截断(clamp)**了,不再渐变,而是固定为 0(内部)或 1(外部)。 这样就形成了一个 宽度 = 1.0(内外各 0.5) 的渐变区域 """ voxel_modeller.SetMaximumDistance(0.1) voxel_modeller.Update() volume.DeepCopy(voxel_modeller.GetOutput()) """ 当你用 vtkFlyingEdges3D(或 vtkMarchingCubes)提取等值面时 0.5 恰好是“几何表面”的位置 < 0.5 是物体内部,> 0.5 是外部 所以 iso_value = 0.5 表示提取出原始几何体的近似表面 """ iso_value = 0.5 surface = vtkFlyingEdges3D() surface.SetInputData(volume) surface.ComputeNormalsOn() surface.SetValue(0, iso_value) """ iso_value 和SetMaximumDistance中的数字的关系 MaximumDistance 控制“场的模糊范围”,相当于“球体表面周围的缓冲区厚度”; iso_value = 0.5 则是一个固定的“分界线”,永远对应原始几何表面的位置。 换句话说: MaximumDistance 决定场数据是如何从“表面”向外/向内过渡; 但你提取几何时,仍然要用 0.5 来还原表面。 前者控制场的平滑/模糊厚度 后者是标准化后的等值阈值,固定用 0.5 才能提取原始几何表面 """ renderer = vtkRenderer() renderer.SetBackground(colors.GetColor3d('DarkSlateGray')) render_window = vtkRenderWindow() render_window.AddRenderer(renderer) render_window.SetWindowName('MarchingCubes') interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) mapper = vtkPolyDataMapper() mapper.SetInputConnection(surface.GetOutputPort()) mapper.ScalarVisibilityOff() actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d('MistyRose')) renderer.AddActor(actor) render_window.Render() interactor.Start()
http://www.cnnetsun.cn/news/42799.html

相关文章:

  • 基于SpringBoot的餐厅推荐系统 计算机毕业设计选题 计算机毕设项目 前后端分离 【源码-文档报告-代码讲解】
  • 禁用MinIO后的7种企业级替代方案评测
  • document.querySelector在电商网站中的5个实战应用
  • 企业级应用:OpenJDK1.8在生产环境中的部署实践
  • Homebrew实战:从安装到开发环境搭建全流程
  • 企业级Git仓库SSH连接安全最佳实践
  • Day12 贝叶斯优化可视化和随机森林的解读
  • 数据湖不是湖,是江湖:Delta Lake / Iceberg / Hudi 到底该选谁?
  • 告别开题报告模板拼凑!虎贲等考 AI 智能生成,让选题逻辑从模糊想法变身可执行研究计划
  • 【LeetCode刷题】跳跃游戏
  • 鸿蒙PC UI控件库 - PasswordInput 密码输入框详解
  • day37简单的神经网络@浙大疏锦行
  • 【水果识别】基于机器视觉苹果和香蕉的成熟度和大小检测附Matlab代码
  • JAVA的平凡之路——此峰乃是最高峰JVM-附加小菜-04
  • 【电力系统】电力系统优化与控制热液调度附Matlab代码和报告
  • 基于6种最新算法(小龙虾优化算法COA、MSA、RTH、NOA、BFO、SWO)求解机器人路径规划研究附Matlab代码
  • Golang实战:构建综合多头(逾期+反欺诈)风险查询的高性能客户端
  • 【TSP问题】基于蜣螂算法DBO和改进的蜣螂算法FADBO求解旅行商TSP问题(可根据自己的经纬度设置自己想要到达的地区)附Matlab代码
  • 【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析附Matlab代码
  • 数据结构:二叉排序树,平衡二叉树,红黑树的介绍
  • 软件复用的分类与实现
  • google服务
  • 进程PCB
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • [从零构建操作系统]08 函数调用时栈的底层行为解析
  • 力扣hot100:搜索插入位置
  • Java冷启动全指南:从原理到实战优化
  • 测试 - 单元测试(JUnit)
  • C++中多态
  • c++经典练习题-多分支