news 2026/6/10 23:02:48

CapClip 模型的裁剪(平面裁剪与曲线裁剪)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CapClip 模型的裁剪(平面裁剪与曲线裁剪)

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①vtkClipPolyData对于模型的裁剪


二:代码及注释

from vtkmodules.vtkIOGeometry import vtkBYUReader import vtkmodules.vtkRenderingOpenGL2 import vtkmodules.vtkInteractionStyle from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersCore import vtkClipPolyData, vtkFeatureEdges, vtkStripper,vtkTubeFilter, vtkImplicitPolyDataDistance from vtkmodules.vtkCommonDataModel import vtkPlane, vtkPolyData from vtkmodules.vtkRenderingCore import vtkDataSetMapper, vtkActor, vtkRenderer, vtkRenderWindow, \ vtkRenderWindowInteractor, vtkPolyDataMapper import math from vtkmodules.vtkCommonCore import vtkPoints from vtkmodules.vtkCommonComputationalGeometry import vtkParametricSpline from vtkmodules.vtkFiltersSources import vtkParametricFunctionSource, vtkSphereSource def main(): file_path = "Data/cow.g" colors = vtkNamedColors() backgroundColor = colors.GetColor3d('steel_blue') boundaryColor = colors.GetColor3d('Banana') clipColor = colors.GetColor3d('Tomato') reader_ = vtkBYUReader() reader_.SetFileName(file_path) reader_.Update() polyData = reader_.GetOutput() plane = vtkPlane() plane.SetOrigin(polyData.GetCenter()) plane.SetNormal(1, -1, -1) """ 对 vtkPolyData(多边形网格) 进行裁剪(Clip),即根据一个标量场或几何平面,把模型切开,保留某一部分的几何 标量场的裁剪,比如输入数据中有点属性(如温度、压力、速度大小),根据这些裁剪 """ clipper = vtkClipPolyData() clipper.SetInputData(polyData) clipper.SetClipFunction(plane) clipper.SetValue(0) # 保留平面正侧(法线指向的半空间) # clipper.GenerateClippedOutputOn() # 生成被移除的部分 clipper.Update() polyData = clipper.GetOutput() clipMapper = vtkDataSetMapper() clipMapper.SetInputData(polyData) clipActor = vtkActor() clipActor.SetMapper(clipMapper) clipActor.GetProperty().SetDiffuseColor(clipColor) clipActor.GetProperty().SetInterpolationToFlat() clipActor.GetProperty().EdgeVisibilityOn() boundaryEdges = vtkFeatureEdges() boundaryEdges.SetInputData(polyData) boundaryEdges.BoundaryEdgesOn() boundaryEdges.FeatureEdgesOff() boundaryEdges.NonManifoldEdgesOff() boundaryEdges.ManifoldEdgesOff() boundaryStrips = vtkStripper() boundaryStrips.SetInputConnection(boundaryEdges.GetOutputPort()) boundaryStrips.Update() """ 相当于模型的深拷贝 """ boundaryPoly = vtkPolyData() boundaryPoly.SetPoints(boundaryStrips.GetOutput().GetPoints()) boundaryPoly.SetPolys(boundaryStrips.GetOutput().GetLines()) boundaryMapper = vtkPolyDataMapper() boundaryMapper.SetInputData(boundaryPoly) boundaryActor = vtkActor() boundaryActor.SetMapper(boundaryMapper) boundaryActor.GetProperty().SetDiffuseColor(boundaryColor) renderer = vtkRenderer() renderWindow = vtkRenderWindow() renderWindow.AddRenderer(renderer) interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # set background color and size renderer.SetBackground(backgroundColor) renderWindow.SetSize(640, 480) # add our actor to the renderer renderer.AddActor(clipActor) renderer.AddActor(boundaryActor) # Generate an interesting view renderer.ResetCamera() renderer.GetActiveCamera().Azimuth(30) renderer.GetActiveCamera().Elevation(30) renderer.GetActiveCamera().Dolly(1.2) renderer.ResetCameraClippingRange() renderWindow.Render() renderWindow.SetWindowName('CapClip') renderWindow.Render() interactor.Start() def main1(): colors = vtkNamedColors() # 1. 创建 spline cx, cy, cz = 0, 0, 0 r = 5 points = vtkPoints() for theta in range(0, 390, 30): # 每隔30度一个点 rad = math.radians(theta) x = cx + r * math.cos(rad) y = cy + r * math.sin(rad) z = cz points.InsertNextPoint(x, y, z) """ vtkParametricSpline 给定一系列离散的 3D 控制点,它能计算出一条平滑、连续的曲线函数(样条) """ spline = vtkParametricSpline() spline.SetPoints(points) """ vtkParametricFunctionSource 将一个数学函数转换成一个三维几何模型 """ splineSource = vtkParametricFunctionSource() splineSource.SetParametricFunction(spline) splineSource.Update() # 2. 把曲线变成一根“管道” tube = vtkTubeFilter() tube.SetInputConnection(splineSource.GetOutputPort()) tube.SetRadius(0.5) tube.SetNumberOfSides(200) tube.Update() # 3. 读取目标模型(例如球) sphere = vtkSphereSource() sphere.SetThetaResolution(100) sphere.SetCenter(0, 0, 0) sphere.SetRadius(r) sphere.SetPhiResolution(200) sphere.SetThetaResolution(200) sphere.Update() """ vtkImplicitPolyDataDistance 能把“显式的几何模型(PolyData)”转换成一个可以进行空间距离计算和隐式函数裁剪**的“隐式函数对象” """ implicit = vtkImplicitPolyDataDistance() implicit.SetInput(tube.GetOutput()) # 5. 用隐式函数裁剪模型 clipper = vtkClipPolyData() clipper.SetInputConnection(sphere.GetOutputPort()) clipper.SetClipFunction(implicit) clipper.GenerateClippedOutputOn() # 6. 显示结果 mapper = vtkPolyDataMapper() mapper.SetInputConnection(clipper.GetOutputPort()) actor = vtkActor() actor.SetMapper(mapper) mapper1 = vtkPolyDataMapper() mapper1.SetInputConnection(sphere.GetOutputPort()) actor1 = vtkActor() actor1.SetMapper(mapper1) actor1.GetProperty().SetColor(colors.GetColor3d("Yellow")) ren = vtkRenderer() ren.AddActor(actor) # ren.AddActor(actor1) ren.SetBackground(0.1, 0.1, 0.1) renWin = vtkRenderWindow() renWin.AddRenderer(ren) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.Initialize() renWin.Render() iren.Start() if __name__ == '__main__': main() # 基于模型表面上的点构建曲线进行裁剪 main1()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:39:27

KLayout终极指南:5步掌握专业版图设计工具

KLayout终极指南:5步掌握专业版图设计工具 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout KLayout是一款功能强大的开源版图设计工具,为半导体工程师提供完整的集成电路设计解决方案。无论…

作者头像 李华
网站建设 2026/6/10 0:08:44

为什么顶尖团队都在用Open-AutoGLM?(深度解析其5大技术优势)

第一章:Open-AutoGLM 核心架构概述Open-AutoGLM 是一个面向通用语言建模与自动化任务执行的开源框架,旨在通过模块化设计实现自然语言理解、生成与外部工具协同的无缝集成。其核心架构围绕“感知-规划-执行-反馈”闭环构建,支持动态任务解析与…

作者头像 李华
网站建设 2026/6/10 15:21:20

如何快速获取高质量中文字体?Source Han Sans TTF 完整安装指南

如何快速获取高质量中文字体?Source Han Sans TTF 完整安装指南 【免费下载链接】source-han-sans-ttf A (hinted!) version of Source Han Sans 项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf 在数字设计和开发中,中文字体的…

作者头像 李华
网站建设 2026/6/10 19:41:53

家政服务平台|基于springboot + vue家政服务平台系统(源码+数据库+文档)

家政服务平台 目录 基于springboot vue家政服务平台系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue家政服务平台系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/6/10 19:03:30

电力行业规程查询系统建设——基于anything-llm的实践案例

电力行业规程查询系统建设——基于anything-llm的实践案例 在电力系统的日常运维中,一个值班员面对突发告警时最怕什么?不是设备故障本身,而是“我记得哪条规程提过处理方法,但翻了半天没找到”。这种场景几乎每天都在变电站、调度…

作者头像 李华