news 2026/5/1 11:45:58

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/4/23 7:36:16

纪念币预约自动化工具操作手册

纪念币预约自动化工具操作手册 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 还在为每次纪念币预约失败而苦恼吗&#xff1f;纪念币预约自动化工具为你提供智能化解决方案&#xff…

作者头像 李华
网站建设 2026/5/1 11:11:05

纪念币预约自动化工具:从零开始的高效抢购指南

还在为抢不到心仪的纪念币而烦恼吗&#xff1f;纪念币预约自动化工具正是你需要的智能解决方案&#xff01;这款工具能够自动识别验证码、快速填写信息、并发预约多个名额&#xff0c;让你彻底告别手忙脚乱的抢购过程。&#x1f3af; 【免费下载链接】auto_commemorative_coin_…

作者头像 李华
网站建设 2026/5/1 7:19:41

多平台直播录制终极方案:DouyinLiveRecorder深度解析

多平台直播录制终极方案&#xff1a;DouyinLiveRecorder深度解析 【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder 在当今直播内容爆炸的时代&#xff0c;如何高效保存有价值的直播内容成为众多用户面临的实际问题…

作者头像 李华
网站建设 2026/4/30 22:16:18

ComfyUI-Manager:AI绘画工作流的终极管理解决方案

ComfyUI-Manager&#xff1a;AI绘画工作流的终极管理解决方案 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 还在为复杂的ComfyUI插件安装流程而头疼吗&#xff1f;ComfyUI-Manager正是你寻找的完美答案&#xff01;…

作者头像 李华
网站建设 2026/5/1 9:54:19

DownKyi终极指南:快速掌握B站视频下载神器

还在为无法离线观看B站精彩视频而烦恼吗&#xff1f;DownKyi作为专业的B站视频下载工具&#xff0c;能够完美解决你的视频收藏需求。这款开源神器支持从普通画质到8K超高清的全格式下载&#xff0c;让你随时随地享受优质视频内容。 【免费下载链接】downkyi 哔哩下载姬downkyi&…

作者头像 李华
网站建设 2026/4/29 22:41:34

Open UI5 源代码解析之23:whitespaceReplacer.js

whitespaceReplacer.js 详解:在 OpenUI5 项目中面向 HTML 展示的空白符替换工具 版本背景:该工具在 UI5 版本 1.94 引入,位于 src/sap.ui.core/src/sap/base/strings/whitespaceReplacer.js,作为 sap/base/strings 模块族中的一个小而精的字符串处理能力。 概览与设计初衷 …

作者头像 李华