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

一:主要的知识点

1、说明

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

2、知识点纪要

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

二:代码及注释

python 复制代码
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()
相关推荐
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴7 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再7 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手9 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934739 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy9 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威10 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ11 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha11 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy11 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法