VTK平面切割

2024-09-02 04:44
文章标签 平面 切割 vtk

本文主要是介绍VTK平面切割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、vtkClipPolyData
    • 二、CapClip
    • 三、SolidClip
    • 四、vtkClipClosedSurface

本文的主要内容:简单介绍VTK中通过平面切割模型的相关功能。
哪些人适合阅读本文:有一定VTK基础的人。

一、vtkClipPolyData

VTK官网描述:
vtkClipPolyData使用用户指定的隐函数剪切多边形数据,如果使用vtkPlane作为隐函数就是平面切割。
vtkClipPolyData是一个过滤器,它使用vtkImplicitFunction的任何子类或输入标量数据来剪辑多边形数据。剪切意味着它实际上“剪切”了数据集的单元格,返回指定隐式函数(或大于标量值)内的所有内容,包括单元格的“片段”。(将其与vtkExtractGeometry进行比较,后者提取整个未切割的单元格。)此过滤器的输出是多边形数据。
要使用此过滤器,必须决定是使用隐式函数进行剪裁,还是使用输入标量数据。如果你想使用隐式函数进行剪裁,你必须:1)定义一个隐式函数2)用SetClipFunction方法设置它3)应用GenerateClipScalarsOn方法如果未指定ClipFunction,或者GenerateClipScalar处于关闭状态(默认设置),则输入的标量数据将用于剪裁polydata。
还可以指定一个标量值,用于决定隐式函数内部和外部的内容。还可以通过设置InsideOut实例变量来颠倒内部/外部的含义。(切割算法通过计算隐式函数值或使用数据集中每个点的输入标量数据来进行。将其与标量值进行比较以确定内部/外部。)
该滤波器可以被配置为计算第二输出。第二个输出是剪切掉的多边形数据。如果要访问此输出数据,请启用GenerateClippedData布尔值。

vtkClipPolyData的使用很简单:

vtkNew<vtkSphereSource> source;
source->SetThetaResolution(20);
source->SetPhiResolution(20);
source->Update();vtkNew<vtkPlane> plane;
plane->SetOrigin(polyData->GetCenter());
plane->SetNormal(1.0, -1.0, -1.0);vtkNew<vtkClipPolyData> clipper;
clipper->SetInputData(source->GetOutput());
clipper->SetClipFunction(plane);
clipper->Update();

在这里插入图片描述
这种方法切完之后是个空壳子,切口不封闭。要想让切割之后的切口封闭,继续往下看。

二、CapClip

此示例显示了如何在剪切的vtkPolyData上生成“上限”。在使用vtkClipPolyData进行裁剪后,它使用了一种巧妙的“技巧”将折线转换为多边形。
就是通过vtkFeatureEdges和vtkStripper将切割之后的边缘进行封闭。

// Extract feature edges
vtkNew<vtkFeatureEdges> boundaryEdges;
boundaryEdges->SetInputData(clipper->GetOutput());
boundaryEdges->BoundaryEdgesOn();
boundaryEdges->FeatureEdgesOff();
boundaryEdges->NonManifoldEdgesOff();
boundaryEdges->ManifoldEdgesOff();vtkNew<vtkStripper> boundaryStrips;
boundaryStrips->SetInputConnection(boundaryEdges->GetOutputPort());
boundaryStrips->Update();// Change the polylines into polygons
vtkNew<vtkPolyData> boundaryPoly;
boundaryPoly->SetPoints(boundaryStrips->GetOutput()->GetPoints());
boundaryPoly->SetPolys(boundaryStrips->GetOutput()->GetLines());vtkNew<vtkPolyDataMapper> boundaryMapper;
boundaryMapper->SetInputData(boundaryPoly);vtkNew<vtkActor> boundaryActor;
boundaryActor->SetMapper(boundaryMapper);
boundaryActor->GetProperty()->SetDiffuseColor(boundaryColor.GetData());

在这里插入图片描述

三、SolidClip

此示例剪裁网格并将背面特性应用于该网格,使其看起来具有实心内部。
还显示了被剪掉的部分的“幽灵”。

其实还是用vtkClipPolyData来切割,然后通过将模型内表面的漫反射和镜面反射光关闭,只保留环境光,造成一种视觉上模型是实心的效果。

// Create a mapper and actor
vtkNew<vtkPolyDataMapper> superquadricMapper;
superquadricMapper->SetInputConnection(clipper->GetOutputPort());vtkNew<vtkActor> superquadricActor;
superquadricActor->SetMapper(superquadricMapper);// Create a property to be used for the back faces. Turn off all
// shading by specifying 0 weights for specular and diffuse. Max the
// ambient.
vtkNew<vtkProperty> backFaces;
backFaces->SetSpecular(0.0);
backFaces->SetDiffuse(0.0);
backFaces->SetAmbient(1.0);
backFaces->SetAmbientColor(colors->GetColor3d("Tomato").GetData());superquadricActor->SetBackfaceProperty(backFaces);

在这里插入图片描述

四、vtkClipClosedSurface

VTK官网描述:
使用平面集合剪裁闭合曲面。
vtkClipClosedSurface将使用一组剪裁平面剪裁一个闭合的polydata曲面。它将通过创建剪切输入数据的新多边形面来生成新的闭合曲面。
形成曲面的多边形的方向很重要。多边形有一个正面和一个背面,背面定义了闭合曲面的内部或“实体”区域。当剪切平面剪切穿过“实体”区域时,会生成一个新的剪切面,但当剪切平面切割穿过孔或“空”区域时则不会。在处理复杂曲面时,这种区别至关重要。请注意,如果一个简单曲面的背面朝外,则该曲面在潜在的无限实体中定义了一个孔。
非歧管表面不应用作此过滤器的输入。输入曲面不应有开放边,并且不得有任何由两个以上面共享的边。vtkFeatureEdges过滤器可用于验证数据集是否满足这些条件。此外,输入曲面不应自相交,这意味着曲面的面只应接触其边缘。
如果启用了GenerateOutline,则此过滤器将在剪裁平面与数据相交的任何位置生成轮廓。ScalarMode选项将向输出中添加单元格标量,以便生成的面可以以与原始曲面不同的颜色显示。
InsideOut标志可用于反转剪辑区域内外的含义。这将更改剪裁平面的哪一侧被剪裁掉。
该滤波器可以被配置为计算第二输出。第二个输出是具有新三角面的多边形数据。如果要访问此输出数据,请启用GenerateClipFaceOutput布尔值。

vtkClipClosedSurface需要输入一个polyData和一组vtkPlaneCollection面集合,有两种输出一种是剪切之后的模型,一种是剪切的面的模型。

vtkNew<vtkNamedColors> colors;// PolyData to process
vtkSmartPointer<vtkPolyData> polyData;// Create a sphere
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetThetaResolution(20);
sphereSource->SetPhiResolution(11);
sphereSource->Update();polyData = sphereSource->GetOutput();auto center = polyData->GetCenter();
vtkNew<vtkPlane> plane1;
plane1->SetOrigin(center[0], center[1], center[2]);
plane1->SetNormal(0.0, -1.0, 0.0);
vtkNew<vtkPlane> plane2;
plane2->SetOrigin(center[0], center[1], center[2]);
plane2->SetNormal(0.0, 0.0, 1.0);
vtkNew<vtkPlane> plane3;
plane3->SetOrigin(center[0], center[1], center[2]);
plane3->SetNormal(-1.0, 0.0, 0.0);vtkNew<vtkPlaneCollection> planes;
planes->AddItem(plane1);
planes->AddItem(plane2);
planes->AddItem(plane3);vtkNew<vtkClipClosedSurface> clipper;
clipper->SetInputData(polyData);
clipper->SetClippingPlanes(planes);
clipper->SetActivePlaneId(2);
clipper->SetScalarModeToColors();
clipper->SetClipColor(colors->GetColor3d("Banana").GetData());
clipper->SetBaseColor(colors->GetColor3d("Tomato").GetData());
clipper->SetActivePlaneColor(colors->GetColor3d("Green").GetData());
clipper->GenerateClipFaceOutputOn();
clipper->Update();vtkNew<vtkDataSetMapper> clipMapper;
clipMapper->SetInputConnection(clipper->GetOutputPort());
//clipMapper->SetInputData(clipper->GetClipFaceOutput());vtkNew<vtkActor> clipActor;
clipActor->SetMapper(clipMapper);
clipActor->GetProperty()->SetColor(colors->GetColor3d("tomato").GetData());
clipActor->GetProperty()->SetInterpolationToFlat();

在这里插入图片描述
在这里插入图片描述
vtkClipClosedSurface和SolidClip这两种方法都有一个小问题,就是模型被一刀切完。如果只想切一半的话就没办法实现。

如果只想切一部分的话,在vtkClipClosedSurface里面SetClippingPlanes设置一个面的集合就可以,但是这个面集必须是闭合的,得到的效果如下图所示。
在这里插入图片描述
可以看出这种方法切出来的必然是一个凸集,要想切一个凹面如下图所示的效果,这种方法就做不了。
为什么会这样?是因为vtkClipClosedSurface的原理是把每个切割面法相对应的模型全部切掉,如下图所示。最后只剩下闭合平面包络中心的模型被保留。
在这里插入图片描述
可以想想看,无论怎么设计闭合平面以及平面法线如何指向,都无法得到下图所示的切割模型。
那么要如何实现切割凹面模型?可以尝试vtk的纹理切割,主要用到的是vtkImplicitTextureCoords,具体可以看官方例子,切出的效果是这样的。
在这里插入图片描述
可以看出也没有封口,要封口也不难,改变一下纹理就可以。

这篇关于VTK平面切割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129023

相关文章

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

n条直线最多能划分出多少个平面?

N条直线,两两相交,其交点各不不同,则产生的交点数目为N个数中取2个数的组合; 同时,也只有这种情况下(两两相交,也交点不同),分割的平面数最多, 数目为: 2 + (N-1)(N+2)/2.  这里求最少平面数没有意义,因为最少平面数就是N+1, 即N条直线两两平行的时候,分割的平面最少。 举例: 1条直线分割平面数最多为2; a1 = 2 2条直线分割平面数最多为4;

004: VTK读入数据---vtkImageData详细说明

VTK医学图像处理---vtkImageData类 目录 VTK医学图像处理---vtkImageData类 简介: 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据  2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介:         对于医

【python 图像切割】matplotlib读取图像,裁剪图像

#-*-coding:utf-8-*-import sysreload(sys)sys.setdefaultencoding('utf-8')import matplotlib.pylab as plt# 加载图像im = plt.imread("E:/ID/2.png")print(im.shape)# (y轴像素点数, x轴像素点数,图像通道数)def plti(im, **kw

【机械手控制】基于matlab 4-RPR平面机械手的可操作性、工作空间分析和路径跟踪【含Matlab源码 7422期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。 🍎个人主页:Matlab凤凰涅槃 🏆代码获取方式:扫描文章底部QQ二维码 ⛳️座右铭:行百里者,半于九十。 更多Matlab路径规划仿真内容点击👇 ①Matlab路径规划(凤凰涅槃版) ⛳️关注微信公众号Matlab王者助手或Matlab海神之光,更多资源等你来!!

什么叫做 “沿着晶体平面偏析”

“沿着晶体平面偏析”指的是在晶体材料中,某些元素或原子优先聚集或沉积在特定的晶体平面上,而不是均匀地分布在整个晶体中。这种现象通常发生在合金、半导体或其他多元材料的制备和热处理过程中。 关键点解释: 晶体平面:晶体是由原子按照特定的空间排列构成的,晶体平面是沿着某个特定方向上的原子排列面。这些平面通常根据晶体的对称性和结构特点来定义,如金属材料的{111}或{100}晶面。 偏析:在材料科

001:VTK的学习资料与方法

VTK 医学图像处理---VTK学习资料 简介:       本节主要介绍学习VTK的一些资料和学习方法,仅供参考,可以根据自己的实际情况来调整。学习资料主要以VTK官网提供的资料为主,不管对于入门还是深入研究都足够了;但为了让入手VTK的难度更低一点,所以在有了本系列博文。 VTK 医学图像处理---VTK学习资料 简介: 1 官网免费电子书(好像有中文翻译版,建议看原版)