news 2025/12/26 14:05:12

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/23 10:45:48

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

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

作者头像 李华
网站建设 2025/12/23 10:45:44

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

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

作者头像 李华
网站建设 2025/12/23 10:45:27

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

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

作者头像 李华
网站建设 2025/12/23 10:45:18

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

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

作者头像 李华
网站建设 2025/12/23 10:42:42

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

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

作者头像 李华
网站建设 2025/12/23 10:42:15

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

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

作者头像 李华