(03)两个模型的交集、并集、差集

前言

在做一碰撞检测时,犹豫一直无法实现,就行想到直接对两个模型求交集,如果交集部分为空,就说明其没有相交,于是使用了下面的方法,求模型的交集。(后来由于在不相交时一直有报错误,但在后来的研究中发现及时报错并不影响其运行,但是最后还是放弃了)

方法

构建两个模型,通过设置其相对位置,使得其可以相交,并显示相交部分。

代码如下:

	{
		//int w = intersectionPolyDataFilter->GetNumberOfIntersectionPoints();
		vtkSphereSource* sphere = vtkSphereSource::New();
		sphere->SetCenter(0, 0, 0);
		sphere->SetRadius(10);
		sphere->SetThetaResolution(40);
		sphere->SetPhiResolution(40);
		sphere->Update();
		vtkCylinderSource* cylinder = vtkCylinderSource::New();//圆柱
		cylinder->SetCenter(2, 0, 0);
		cylinder->SetRadius(3);
		cylinder->SetHeight(40);
		cylinder->SetResolution(10);
		cylinder->Update();

		vtkNew<vtkTriangleFilter> filter1;
		filter1->SetInputData(sphere->GetOutput());
		filter1->Update();
		vtkNew<vtkTriangleFilter> filter2;
		filter2->SetInputData(cylinder->GetOutput());
		filter2->Update();
		vtkNew<vtkBooleanOperationPolyDataFilter> filter_merge;
		filter_merge->SetInputData(0, filter1->GetOutput());
		filter_merge->SetInputData(1, filter2->GetOutput());
		//filter_merge->SetOperationToDifference();//显示差集
		//filter_merge->SetOperationToUnion();//显示并集
		filter_merge->SetOperationToIntersection();//显示交集
		filter_merge->Update();

		vtkPolyDataMapper* map = vtkPolyDataMapper::New();
		map->SetInputConnection(filter_merge->GetOutputPort());
		map->ScalarVisibilityOff();
		vtkActor* actor = vtkActor::New();
		actor->SetMapper(map);
 

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

		ren->AddActor(actor);

		ren->SetBackground(0.3, 0.4, 0.5);
		renWin->SetSize(450, 450);

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

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

效果

实际效果为,圆柱和球相交的部分进行显示。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

rexinx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值