news 2026/6/9 17:39:45

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/8 19:47:05

Autovisor智能学习助手:轻松攻克在线课程学习难题

Autovisor智能学习助手:轻松攻克在线课程学习难题 【免费下载链接】Autovisor 2024知道智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装发行版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor 你是否也曾为繁重的在线课程学习而烦恼&…

作者头像 李华
网站建设 2026/6/8 20:06:52

DeformPointSet 基于控制网格(Control Mesh)的 3D 几何体形变

一:主要的知识点 1、说明 本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客 2、知识点纪要 本段代码主要涉及的有①vtkElevationFilter的标量分配方法&#…

作者头像 李华
网站建设 2026/6/8 18:39:54

【Open-AutoGLM性能优化秘籍】:提升推理速度300%的4种实战方案

第一章:Open-AutoGLM性能优化概述Open-AutoGLM 是一个面向自动化自然语言生成任务的开源框架,其核心目标是在保证生成质量的前提下提升推理效率与资源利用率。随着模型规模的持续增长,性能优化已成为实际部署中的关键挑战。本章将深入探讨影响…

作者头像 李华
网站建设 2026/6/8 19:46:45

【大模型落地新利器】:Open-AutoGLM搭建全解析,抢占AI工程化先机

第一章:大模型落地的工程化挑战与Open-AutoGLM的崛起在大规模语言模型(LLM)能力持续突破的背景下,如何将这些模型高效、稳定地应用于实际业务场景,成为企业面临的核心难题。模型部署涉及资源调度、推理优化、服务编排和…

作者头像 李华
网站建设 2026/6/7 12:22:07

Open UI5 源代码解析之24:assert.js

源代码仓库: https://github.com/SAP/openui5 源代码位置: openui5-master\src\sap.ui.core\src\sap\base\assert.js 模块概览与职责边界 assert.js 位于 sap.ui.core 模块树的 sap/base 命名空间中,通过 sap.ui.define 暴露一个函数式 …

作者头像 李华