简介:
1、vtkAreaPicker:获取裁剪平面
2、vtkClipClosedSurface:完成裁剪
完成代码:
#include <vtkActor.h>
#include <vtkAreaPicker.h>
#include <vtkDataSetMapper.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkExtractPolyDataGeometry.h>
#include <vtkIdFilter.h>
#include <vtkIdTypeArray.h>
#include <vtkInteractorStyleRubberBandPick.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkPlanes.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkUnstructuredGrid.h>
#include <vtkVersion.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>
#include "vtkClipClosedSurface.h"
#include "vtkPlaneCollection.h"
#include "vtkAxesActor.h"
#define VTKISRBP_ORIENT 0
#define VTKISRBP_SELECT 1
namespace {
// Define interaction style
class HighlightInteractorStyle : public vtkInteractorStyleRubberBandPick
{
public:
static HighlightInteractorStyle* New();
vtkTypeMacro(HighlightInteractorStyle, vtkInteractorStyleRubberBandPick);
HighlightInteractorStyle() : vtkInteractorStyleRubberBandPick()
{
this->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
this->SelectedActor = vtkSmartPointer<vtkActor>::New();
this->SelectedActor->SetMapper(SelectedMapper);
}
virtual void OnLeftButtonUp() override
{
// Forward events
vtkInteractorStyleRubberBandPick::OnLeftButtonUp();
if (this->CurrentMode == VTKISRBP_SELECT)
{
vtkNew<vtkNamedColors> colors;
vtkPlanes* frustum = static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker())->GetFrustum();
vtkNew<vtkPlaneCollection> planeCollection;
int pCount = frustum->GetNumberOfPlanes() - 2;
for (int i = 0; i < pCount; i++)
{
double normal[3];
frustum->GetPlane(i)->GetNormal(normal);
double origin[3];
frustum->GetPlane(i)->GetOrigin(origin);
vtkNew<vtkPlane> plane;
plane->SetOrigin(origin[0], origin[1], origin[2]);
plane->SetNormal(-normal[0], -normal[1], -normal[2]);
planeCollection->AddItem(plane);
}
vtkNew<vtkClipClosedSurface> clipper;
clipper->SetInputData(this->PolyData);
clipper->SetClippingPlanes(planeCollection);
clipper->Update();
if (m_SrcActor != nullptr)
m_SrcActor->VisibilityOff();
this->SelectedMapper->SetInputData(clipper->GetOutput());
this->SelectedActor->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
this->GetInteractor()->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(SelectedActor);
this->GetInteractor()->GetRenderWindow()->Render();
this->HighlightProp(NULL);
}
}
void SetPolyData(vtkSmartPointer<vtkPolyData> polyData)
{
this->PolyData = polyData;
}
vtkActor* m_SrcActor = nullptr;
private:
vtkSmartPointer<vtkPolyData> PolyData;
vtkSmartPointer<vtkActor> SelectedActor;
vtkSmartPointer<vtkDataSetMapper> SelectedMapper;
};
vtkStandardNewMacro(HighlightInteractorStyle);
} // namespace
int main(int argc, char* argv[])
{
vtkNew<vtkSphereSource> source;
source->SetPhiResolution(49);
source->SetThetaResolution(200);
source->Update();
auto polyData = source->GetOutput();
// Create a mapper and actor
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputData(polyData);
mapper->ScalarVisibilityOff();
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
actor->GetProperty()->SetPointSize(5);
vtkNew<vtkAxesActor> axes;
// Visualize
vtkNew<vtkRenderer> renderer;
renderer->UseHiddenLineRemovalOn();
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(640, 480);
renderWindow->SetWindowName("HighlightSelection");
vtkNew<vtkAreaPicker> areaPicker;
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetPicker(areaPicker);
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->AddActor(axes);
renderWindow->Render();
vtkNew<HighlightInteractorStyle> style;
style->m_SrcActor = actor;
style->SetPolyData(polyData);
style->SetCurrentRenderer(renderer);
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}