VTK笔记-裁剪分割-简单几何裁剪组成复杂几何裁剪-vtkImplicitBoolean

本文介绍了在VTK中如何利用vtkImplicitBoolean类对几何体进行布尔运算和裁剪操作。首先,通过创建球体、圆柱体和平面的隐函数,然后使用vtkImplicitBoolean进行交集运算,得到半个圆柱体的隐函数。接着,通过vtkClipPolyData对球体进行裁剪,最后将裁剪后的球体用移动并再次裁剪,以展示半个圆柱体裁剪的效果。代码示例展示了完整的裁剪过程。
摘要由CSDN通过智能技术生成

vtkImplicitBoolean

  在VTK中,我们通常需要的并不是严格标准的几何体,我们需要对这些几何体进行加工,修改其内容,得到我们想要的效果。这样就需要使用到vtkImplicitBoolean类。
  vtkImplicitBoolean类是由隐函数的布尔组合组成的隐函数,派生自vtkImplicitFunction类;
  该类有一个函数列表(FunctionList),这些函数根据指定的运算符(VTK_UNION or VTK_INTERSECTION or VTK_DIFFERENCE)组合。可以使用vtkImplicitFunction(and/or vtkImplicitBoolean)的嵌套组合来创建复杂的隐式函数。
  vtkImplicitBoolean类型表如下:

运算符说明
VTK_UNION取所有隐式函数的最小值
VTK_INTERSECTION取所有隐式函数的最大值
VTK_DIFFERENCE从第一个隐式函数中减去第二个到最后一个隐式函数
VTK_UNION_OF_MAGNITUDES联合取隐函数的最小绝对值

  下面结合例子介绍如何在VTK中实现对几何体的裁剪。
  要对几何体进行裁剪,需要建立好几何体模型,然后定义一个隐函数,利用vtkClipPolyData,通过隐函数vtkImplicitFunction实现对模型的裁剪,在vtk中,类似vtkPlane,vtkSphere,vtkCylinder这些后面没有Source的类,都是隐函数类。
  代码流程是:
    1.定义一个球,其圆心在原点,半径为10,设置经纬方向的三角片数均为40;
    2.定义圆柱的隐函数,设定半径为3,中心在原点,在vtk中的圆柱隐函数是没有设定长度的,其方向为沿y轴方向,此处的圆柱用于对刚才定义的球进行裁剪,裁剪效果就是把球给打通了,两面都进行的裁剪;
    3.定义一个平面,使用平面将圆柱分割成两半,只用半个圆柱。
    4.使用vtkImplicitBoolean类将平面和圆柱进行Bool求交运算(SetOperationTypeToIntersection())得出半个圆柱的隐函数表示cuted_cylinder,如果是求和运算则用SetOperationTypeToUnion()。
    5.定义了一个vtkClipPolyData对象clipper,将其输入数据步骤1建立的球,裁剪函数设置为圆柱cylinder。得到的只是用一个圆柱裁剪球的效果。
    6.为了显示用半个圆柱裁剪的效果,将刚才的裁剪体演x轴移动一定位置,然后用刚才Bool运算获得的半个圆柱进行裁剪。对几何对象的移动需要指定一个变换transform,然后定义一个vtkTransformPolyDataFilter对象filter,然后将filter的输入设定为要移动的几何对象,变换设定为transform,实现了将裁剪球的移动,其移动结果在filter中。
    7.将移动后得到的filter作为新一次裁剪vtkClipPolyData的输入数据,以半个圆柱cuted_cylinder为裁剪函数进行裁剪,得到裁剪结果clipper2。
    8.渲染处理。

#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCylinder.h"
#include "vtkPlane.h"
#include "vtkImplicitBoolean.h"
#include "vtkPolyDataMapper.h"
#include "vtkSphereSource.h"
#include "vtkProperty.h"
#include "vtkClipPolyData.h"
#include "vtkTransformPolyDataFilter.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"

class Test_Clip_Poly {
public:
	static void Test() {
		vtkSphereSource *sphere = vtkSphereSource::New();
		sphere->SetCenter(0, 0, 0);
		sphere->SetRadius(10);
		sphere->SetThetaResolution(40);
		sphere->SetPhiResolution(40);

		vtkCylinder *cylinder = vtkCylinder::New();//圆柱
		cylinder->SetCenter(0, 0, 0);
		cylinder->SetRadius(3);

		vtkPlane *vPlane = vtkPlane::New();//横截面
		vPlane->SetOrigin(0, 0, 0);
		vPlane->SetNormal(0, -1, 0);

		vtkImplicitBoolean *cuted_cylinder = vtkImplicitBoolean::New();
		cuted_cylinder->SetOperationTypeToIntersection();
		cuted_cylinder->AddFunction(cylinder);
		cuted_cylinder->AddFunction(vPlane);

		vtkClipPolyData *clipper = vtkClipPolyData::New();
		clipper->SetInputConnection(sphere->GetOutputPort());
		clipper->SetClipFunction(cylinder);
		clipper->GenerateClipScalarsOn();
		clipper->GenerateClippedOutputOn();
		clipper->SetValue(0.5);

		vtkTransform *transform = vtkTransform::New();
		transform->Translate(7, 0, 0);
		vtkTransformPolyDataFilter *filter = vtkTransformPolyDataFilter::New();
		filter->SetInputConnection(clipper->GetOutputPort());
		filter->SetTransform(transform);
		vtkClipPolyData *clipper2 = vtkClipPolyData::New();
		clipper2->SetInputConnection(filter->GetOutputPort());
		clipper2->SetClipFunction(cuted_cylinder);
		clipper2->GenerateClipScalarsOn();
		clipper2->GenerateClippedOutputOn();
		clipper2->SetValue(0.5);

		vtkPolyDataMapper *map = vtkPolyDataMapper::New();
		map->SetInputConnection(clipper2->GetOutputPort());
		map->ScalarVisibilityOff();

		vtkActor *actor = vtkActor::New();
		actor->SetMapper(map);
		actor->GetProperty()->SetColor(0.3, 0.4, 1);
		actor->GetProperty()->SetAmbientColor(0.4,0.5,0.6);
		actor->GetProperty()->SetDiffuseColor(0.8,0.6,0.2);
		actor->RotateX(40);

		vtkRenderer *ren = vtkRenderer::New();
		vtkRenderWindow *renWin = vtkRenderWindow::New();
		renWin->AddRenderer(ren);

		vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
		iren->SetRenderWindow(renWin);

		ren->AddActor(actor);
		ren->SetBackground(0, 0, 0);
		renWin->SetSize(450, 450);

		vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
		iren->SetInteractorStyle(style);

		iren->Initialize();
		renWin->Render();
		iren->Start();
	}
};

在这里插入图片描述在这里插入图片描述

参考资料

1.vtk中实现裁剪

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值