news 2026/4/15 20:17:04

ClipDataSetWithPolyData 使用任意PolyData(比如锥体)去裁剪一个三维体数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ClipDataSetWithPolyData 使用任意PolyData(比如锥体)去裁剪一个三维体数据集

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①模型裁剪模型的相关注意事项与运用


二:代码及注释

import numpy as np import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkFiltersSources import vtkConeSource from vtkmodules.vtkRenderingCore import vtkActor, vtkPolyDataMapper, vtkDataSetMapper, vtkRenderWindow, vtkRenderer, \ vtkRenderWindowInteractor from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersCore import vtkImplicitPolyDataDistance from vtkmodules.vtkCommonCore import vtkFloatArray from vtkmodules.vtkCommonDataModel import vtkRectilinearGrid from vtkmodules.vtkFiltersGeneral import vtkClipDataSet from vtkmodules.vtkFiltersGeometry import vtkRectilinearGridGeometryFilter def main(): colors = vtkNamedColors() cone = vtkConeSource() cone.SetResolution(50) # 设置圆锥体侧面沿周长方向的细分数 cone.SetDirection(0, 0, -1) # 设置圆锥体的轴线方向,默认情况下,圆锥的尖端在原点 cone.SetHeight(3.0) # 设置 圆锥体沿其轴线的长度 cone.CappingOn() # 开启圆锥底面的**封闭(Capping)**功能 cone.Update() """ 用于裁剪的模型必须得是封闭的,待裁剪的模型似乎没有这个要求 """ implicitPolyDataDistance = vtkImplicitPolyDataDistance() implicitPolyDataDistance.SetInput(cone.GetOutput()) dimension = 51 xCoords = vtkFloatArray() for x, i in enumerate(np.linspace(-1, 1, dimension)): xCoords.InsertNextValue(i) yCoords = vtkFloatArray() for y, i in enumerate(np.linspace(-1.0, 1.0, dimension)): yCoords.InsertNextValue(i) zCoords = vtkFloatArray() for z, i in enumerate(np.linspace(-1.0, 1.0, dimension)): zCoords.InsertNextValue(i) """ vtkRectilinearGrid 用于表示一种特定类型的**结构化数据集(Structured Data Set)**的类 特点是: 结构化(Structured): 拓扑是规则的。网格中的每个单元(Cell,即 3D 中的体素)都可以通过其在三个方向上的整数索引 (i,j,k) 唯一确定 轴向非均匀(Rectilinear / Axis-Aligned Non-Uniform): 虽然网格是沿着 X,Y,Z 轴对齐的,但沿每个轴的**间距(Spacing)**可以是非均匀的 """ rgrid = vtkRectilinearGrid() rgrid.SetDimensions(xCoords.GetNumberOfTuples(), yCoords.GetNumberOfTuples(), zCoords.GetNumberOfTuples()) rgrid.SetXCoordinates(xCoords) rgrid.SetYCoordinates(yCoords) rgrid.SetZCoordinates(zCoords) signedDistances = vtkFloatArray() signedDistances.SetNumberOfComponents(1) signedDistances.SetName('SignedDistances') for pointId in range(0, rgrid.GetNumberOfPoints()): p = rgrid.GetPoint(pointId) signedDistance = implicitPolyDataDistance.EvaluateFunction(p) signedDistances.InsertNextValue(signedDistance) rgrid.GetPointData().SetScalars(signedDistances) """ vtkClipDataSet 裁剪 与vtkClipPolyData的不同在于vtkClipPolyData用于切割表面几何体 vtkClipDataSet用于切割体积数据 """ clipper = vtkClipDataSet() clipper.SetInputData(rgrid) """ InsideOutOn 开启内外反转模式,默认情况下,clipper保留函数值f(x)>value的区域 开启 InsideOutOn() 后,它将保留函数值 f(x)<Value 的区域 """ clipper.InsideOutOn() # 这里保留的就是内部 """ 开启此选项后,clipper 不仅会通过其主输出端口 (GetOutput()) 输出被保留的部分,还会通过第二个输出端口 (GetOutputPort(1)) 输出被**移除(即被裁剪)**的那部分网格 """ clipper.GenerateClippedOutputOn() clipper.Update() # print("num: ",clipper.GetNumberOfOutputPorts()) coneMapper = vtkPolyDataMapper() coneMapper.SetInputConnection(cone.GetOutputPort()) coneActor = vtkActor() coneActor.SetMapper(coneMapper) """ vtkRectilinearGridGeometryFilter 将vtkRectilinearGrid这种体积数据集转换为polyData的过滤器 """ geometryFilter = vtkRectilinearGridGeometryFilter() geometryFilter.SetInputData(rgrid) """ SetExtent 使用3D索引范围来定义要提取的几何体 """ geometryFilter.SetExtent(0, dimension, 0, dimension, int(dimension / 2), int(dimension / 2)) geometryFilter.Update() rgridMapper = vtkPolyDataMapper() rgridMapper.SetInputConnection(geometryFilter.GetOutputPort()) rgridMapper.SetScalarRange( rgrid.GetPointData().GetArray('SignedDistances').GetRange()) wireActor = vtkActor() wireActor.SetMapper(rgridMapper) wireActor.GetProperty().SetRepresentationToWireframe() clipperMapper = vtkDataSetMapper() clipperMapper.SetInputConnection(clipper.GetOutputPort()) clipperMapper.ScalarVisibilityOff() """ 示例代码clipper.GetOutputPort(1)个不起作用,加一个clip clipperOutsideMapper = vtkDataSetMapper() clipperOutsideMapper.SetInputConnection(clipper.GetOutputPort(1)) clipperOutsideMapper.ScalarVisibilityOff() """ clipper1 = vtkClipDataSet() clipper1.SetInputData(rgrid) clipper1.InsideOutOff() # Retain f(x) > Value, which is outside the cone clipper1.SetValue(0.0) clipper1.GenerateClippedOutputOff() clipper1.Update() clipperOutsideMapper = vtkDataSetMapper() clipperOutsideMapper.SetInputConnection(clipper1.GetOutputPort()) clipperOutsideMapper.ScalarVisibilityOff() clipperActor = vtkActor() clipperActor.SetMapper(clipperMapper) clipperActor.GetProperty().SetColor(colors.GetColor3d('Banana')) clipperOutsideActor = vtkActor() clipperOutsideActor.SetMapper(clipperOutsideMapper) clipperOutsideActor.GetProperty().SetColor( colors.GetColor3d('Banana')) leftViewport = [0.0, 0.0, 0.5, 1.0] leftRenderer = vtkRenderer() leftRenderer.SetViewport(leftViewport) leftRenderer.SetBackground(colors.GetColor3d('SteelBlue')) rightViewport = [0.5, 0.0, 1.0, 1.0] rightRenderer = vtkRenderer() rightRenderer.SetViewport(rightViewport) rightRenderer.SetBackground(colors.GetColor3d('CadetBlue')) # add the actors leftRenderer.AddActor(wireActor) leftRenderer.AddActor(clipperActor) rightRenderer.AddActor(clipperOutsideActor) renwin = vtkRenderWindow() renwin.SetSize(640, 480) renwin.AddRenderer(leftRenderer) renwin.AddRenderer(rightRenderer) renwin.SetWindowName('ClipDataSetWithPolyData') # An interactor interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(renwin) # Share the camera leftRenderer.GetActiveCamera().SetPosition(0, -1, 0) leftRenderer.GetActiveCamera().SetFocalPoint(0, 0, 0) leftRenderer.GetActiveCamera().SetViewUp(0, 0, 1) leftRenderer.GetActiveCamera().Azimuth(30) leftRenderer.GetActiveCamera().Elevation(30) leftRenderer.ResetCamera() rightRenderer.SetActiveCamera(leftRenderer.GetActiveCamera()) renwin.Render() interactor.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 20:05:54

直播录制终极指南:如何用DouyinLiveRecorder轻松录制全网直播内容

直播录制终极指南&#xff1a;如何用DouyinLiveRecorder轻松录制全网直播内容 【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder 你是否曾经错过精彩的直播内容&#xff1f;或者想要保存喜欢的娱乐节目却不知道如何…

作者头像 李华
网站建设 2026/4/12 19:54:41

Joy-Con Toolkit终极指南:深度解析Switch手柄优化神器

Joy-Con Toolkit终极指南&#xff1a;深度解析Switch手柄优化神器 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 还在为Switch手柄的各种小问题烦恼吗&#xff1f;Joy-Con Toolkit就是你的救星&#xff01;这款…

作者头像 李华
网站建设 2026/4/7 12:13:16

Zotero文献去重完全教程:一键清理重复条目的终极解决方案

还在为Zotero文献库中堆积如山的重复条目而头痛吗&#xff1f;当你从不同数据库导入文献时&#xff0c;同一篇文章经常被重复收录多次&#xff0c;这不仅浪费存储空间&#xff0c;还严重影响文献管理效率。ZoteroDuplicatesMerger插件就是专为解决这一问题而生的强大工具&#…

作者头像 李华
网站建设 2026/3/27 0:43:18

信息自由获取新方案:6款实用工具深度评测

信息自由获取新方案&#xff1a;6款实用工具深度评测 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息付费化浪潮席卷的今天&#xff0c;你是否经常遇到心仪的文章被付费墙阻挡在…

作者头像 李华
网站建设 2026/4/8 23:27:17

CCS安装实战:配置外部编辑器与版本控制集成

CCS开发效率跃迁&#xff1a;如何用VS Code和Git重构嵌入式工作流 你有没有过这样的经历&#xff1f;在CCS里写一段C代码&#xff0c;光标移动都卡顿&#xff1b;改完一个bug想回溯历史版本&#xff0c;却发现只能靠手动备份文件夹&#xff1b;团队协作时同事覆盖了你的修改&am…

作者头像 李华
网站建设 2026/4/12 3:07:52

LeagueAkari终极指南:英雄联盟自动化工具完全攻略

LeagueAkari终极指南&#xff1a;英雄联盟自动化工具完全攻略 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为错过匹…

作者头像 李华