VTK平面切割

news2024/12/23 17:48:02

文章目录

    • 一、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,具体可以看官方例子,切出的效果是这样的。
在这里插入图片描述
可以看出也没有封口,要封口也不难,改变一下纹理就可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画 | Stable diffusion 修复老照片

大家好呀&#xff01;今天我要和大家分享一个使用Stable diffusion修复老照片的功能。 你有没有遇到这样的问题&#xff1a;想要修复一张老照片&#xff0c;但是发现照片质量太差&#xff0c;噪点太多&#xff0c;根本无法修复&#xff1f; 别担心&#xff01;Stable diffusio…

DS18B20温度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作时序 3.工作原理&#xff1a;复位脉冲与应答脉冲 4.工作原理&#xff1a;写时序 5.工作原理&#xff1a;读时序 6.工作原理&#xff1a;DS18B20读取的数据格式 7.工作原理&#xff1a;DS18B20配置步骤 三、程序设计 ma…

vue 批量自动引入并注册组件或路由

有时候有大量的组件.vue后缀的,或.js,或.ts文件, 需要一个个的手动引入很麻烦,那么你可以尝试这样创建一个index.js 本项目使用vue3.x, vue2.x也可以照样用; 这里在components里面创建了一个idnex.js 文件 require.context 可以读取文件, 第一个参数是指当前文件夹, 第二个参…

路径优化 minimum-snap(对A*的全局路径进行优化)

实现效果&#xff1a; 介绍&#xff1a; 使用Astar进行路径规划&#xff0c;使用minimum-snap进行路径优化处理&#xff0c;建议参考文章&#xff1a; 【附源码和详细的公式推导】Minimum Snap轨迹生成&#xff0c;闭式求解Minimum Snap问题&#xff0c;机器人轨迹优化&#…

泥水位监测站——水文百科

传统的水位监测往往依赖于人工定期巡检&#xff0c;这不仅费时费力&#xff0c;而且可能受到天气、交通等多种因素的限制。而水位监测站的全自动化监测则能够24小时不间断地工作&#xff0c;无需人员现场值守&#xff0c;从而显著减少了人工巡检的次数和成本。自动化监测系统能…

全面解析BotSharp:如何利用.Net和LLMs革新你的业务系统

作为一名关注.Net与AI相关技术的博主&#xff0c;今天我要推荐一个开源项目——BotSharp。BotSharp 是一个基于 .Net的智能代理应用程序构建框架&#xff0c;专注于连接大型语言模型&#xff08;LLMs&#xff09;到现有业务系统中&#xff0c;以促进会话即平台(Conversation as…

模型案例:| 垃圾桶识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

【Java|Stream流】不可变集合

文章目录 1.什么是不可变集合2.创建不可变集合的方式2.1 List类型2.2 Set2.3 Map 1.什么是不可变集合 不可变集合:不可以被修改的集合 不可变集合优点: 安全性 由于不可变集合不能被修改&#xff0c;所以可以安全地在多个线程之间共享&#xff0c;而不用担心被意外修改&#xf…

H264编码

H264是一种针对视频的压缩编码方式。 一、压缩方法 H264主要基于以下几种方法&#xff0c;将数据进行压缩&#xff1a; 1.帧内预测压缩&#xff1a;解决空间域数据冗余的问题 2.帧间预测压缩&#xff1a;&#xff08;运动估计与补偿&#xff09;解决时间域数据冗余的问题 3…

AD5270 AD5271 STM32 SPI驱动设计

硬件设计 AD5270 AD5271 简介&#xff1a;1024位、1%电阻容差误差、SPI接口和50-TP存储器数字变阻器。特性&#xff1a;单通道、1024/256位分辨率&#xff1b;标称电阻&#xff1a;20 kΩ&#xff0c;50 kΩ和100 kΩ&#xff1b;标称电阻容差误差&#xff1a;1%&#xff08;最…

Android 11添加系统服务,并封装jar包供第三方应用使用

概述&#xff1a; 如果你是做技术支持&#xff0c;有没有遇到这种情况&#xff0c;客户既要实现具备系统权限的功能&#xff0c;但是呢&#xff0c;又不想把自己的应用做成系统应用。这时候你咋办。 我们可以添加一个具备系统权限的服务&#xff0c;不管前台的&#xff0c;还是…

原来这就是 布隆过滤器

1.布隆过滤器的引出 一个有趣的现象 不知道大家有没有发现这么一个现象&#xff0c;当我们在使用一些软件的时候&#xff0c;比如像 CSDN、这种具有推荐算法的应用&#xff0c;他并不会给我们推送我们已经浏览过的内容&#xff0c;这是怎么做到的呢&#xff1f; 说白了就是人…

【物理教学】高中物理速度时间练习

速度时间图像代码 这段代码是一个使用Python编写的脚本&#xff0c;它利用matplotlib库来绘制物理问题中的速度-时间图。代码的主要优点如下&#xff1a; 用户交互&#xff1a;代码通过input函数与用户进行交互&#xff0c;允许用户输入物理问题的参数&#xff0c;如初始速度…

钢结构厂房通风天窗使用场景探讨

钢结构厂房通风天窗作为现代建筑中高效通风的解决方案&#xff0c;广泛应用于多个领域&#xff0c;为各类建筑提供优质的室内环境。成都昱合昇带大家一起探讨通风天窗在不同使用场景下的表现。 1、工业厂房降温 工业厂房是通风天窗典型的应用场景之一。在高温季节或生产过程中产…

苏州科技大学商学院:加强生态保护,推动绿色发展

原标题&#xff1a;苏州科技大学商学院&#xff1a;加强生态保护&#xff0c;推动绿色发展&#xff0c;在美丽中国建设中贡献青春力量 建设美丽中国是全面建设社会主义现代化国家的重要目标&#xff0c;也是激励全国人民为实现中华民族伟大复兴中国梦而共同奋斗的伟大旗帜。中…

CSS3 文本效果(text-shadow,box-shadow,white-space等)文本溢出隐藏并且显示省略号

一 text-shadow text-shadow 属性是 CSS3 中用于为文本添加阴影效果的工具。它可以增强文本的可读性和视觉吸引力&#xff0c;提供丰富的视觉效果 1 语法 text-shadow: offset-x offset-y blur-radius color;offset-x&#xff1a;阴影相对于文本的水平偏移量。可以是正值&am…

STM32CUBEIDE FreeRTOS操作教程(四):timer软件定时器

STM32CUBEIDE FreeRTOS操作教程&#xff08;四&#xff09;&#xff1a;timer软件定时器 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&am…

18047 水仙花数

### 思路 1. 遍历所有的三位数&#xff08;100到999&#xff09;。 2. 对于每个数&#xff0c;提取其百位、十位和个位数字。 3. 计算这些数字的立方和。 4. 如果立方和等于原数&#xff0c;则该数是水仙花数&#xff0c;输出该数。 ### 伪代码 1. 遍历i从100到999&#xff1a…

HTTP中常用的4种请求方式——前端如何发送?后端怎么接受?

一.Get请求&#xff1a; 1.什么是Get请求&#xff1f; 2.前后端如何使用Get交互&#xff1f; 2.1.Query参数格式的Get请求 2.2.Path参数格式的Get请求 二.Post请求&#xff1a; 1.什么是Post请求&#xff1f; 2.前后端如何使用Post交互&#xff1f; 三.Put请求&#xf…

数据库操作与集成:使用Python与SQLite、MySQL、PostgreSQL等数据库

目录 引言 一、Python与SQLite的集成 1.1 SQLite简介 1.2 连接SQLite数据库 1.3 创建表 1.4 插入数据 1.5 查询数据 1.6 更新和删除数据 二、Python与MySQL的集成 2.1 MySQL简介 2.2 安装与配置 2.3 连接MySQL数据库 2.4 创建表与插入数据 2.5 查询、更新与删除数…