news 2026/2/7 6:34:02

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/2/5 4:06:07

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

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

作者头像 李华
网站建设 2026/2/4 4:58:35

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

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

作者头像 李华
网站建设 2026/2/6 0:13:41

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

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

作者头像 李华
网站建设 2026/2/3 6:18:33

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

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

作者头像 李华
网站建设 2026/2/3 9:30:20

python自助棋牌室管理系统_px03d9hb

目录具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django)、…

作者头像 李华