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

一:主要的知识点

1、说明

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

2、知识点纪要

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

二:代码及注释

python 复制代码
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()
相关推荐
智算菩萨1 小时前
【Tkinter】4 Tkinter Entry 输入框控件深度解析:数据验证、密码输入与现代表单设计实战
python·ui·tkinter·数据验证·entry·输入框
七夜zippoe1 小时前
可解释AI:构建可信的机器学习系统——反事实解释与概念激活实战
人工智能·python·机器学习·可解释性·概念激活
YuanDaima20484 小时前
[CrewAI] 第15课|构建一个多代理系统来实现自动化简历定制和面试准备
人工智能·python·面试·agent·crewai
WHS-_-20225 小时前
Python 算法题学习笔记一
python·学习·算法
码界筑梦坊5 小时前
353-基于Python的大湾区气候数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
如何原谅奋力过但无声5 小时前
【chap11-动态规划(上 - 基础题目&背包问题)】用Python3刷《代码随想录》
数据结构·python·算法·动态规划
云姜.6 小时前
JSON Schema使用
python·json
Sunshine for you6 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
qwehjk20086 小时前
如何从Python初学者进阶为专家?
jvm·数据库·python
小熊Coding6 小时前
重庆市旅游景点数据可视化分析系统
爬虫·python·数据挖掘·数据分析·计算机毕业设计·数据可视化分析·旅游景点