前言
在做一碰撞检测时,犹豫一直无法实现,就行想到直接对两个模型求交集,如果交集部分为空,就说明其没有相交,于是使用了下面的方法,求模型的交集。(后来由于在不相交时一直有报错误,但在后来的研究中发现及时报错并不影响其运行,但是最后还是放弃了)
方法
构建两个模型,通过设置其相对位置,使得其可以相交,并显示相交部分。
代码如下:
{
//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();
}
效果
实际效果为,圆柱和球相交的部分进行显示。