2026/3/17 4:12:14
网站建设
项目流程
辽宁鞍山网站建设,wordpress 显示大图,市场营销论文,用户体验设计经典案例一#xff1a;主要的知识点
1、说明
本文只是教程内容的一小段#xff0c;因博客字数限制#xff0c;故进行拆分。主教程链接#xff1a;vtk教程——逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①MarchingCubes提取等值面的机理#xff…一主要的知识点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 例子 假设我们有一个球半径 10SetMaximumDistance(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()