vtkPlane继承于vtkImplicitFunction抽象类,用于面切割;vtkCutter继承于vtkPolyDataAlgorithm,使用指定的implicit function切割vtkDataSet
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkPlane.h"
#include "vtkCutter.h"
#include "vtkPointData.h"
#include "vtkProperty.h"
int main(int argc, char* argv[])
{
//
vtkSmartPointer<vtkRenderer> renderer = vtkRenderer::New();
vtkSmartPointer<vtkRenderWindow> renWind = vtkRenderWindow::New();
renWind->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWind);
/* 一个锥形体 */
vtkSmartPointer<vtkConeSource> cone = vtkConeSource::New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
//mapper
vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputConnection(cone->GetOutputPort());
//actor设置透明度方便查看cut效果
vtkSmartPointer<vtkActor> coneActor = vtkActor::New();
coneActor->SetMapper(coneMapper);
coneActor->GetProperty()->SetOpacity(0.5);
//
renderer->AddActor(coneActor);
/* vtkPlane切割 */
//vtkPlane继承于vtkImplicitFunction抽象类,用于面切割
vtkSmartPointer<vtkPlane> plane = vtkPlane::New();
plane->SetOrigin(cone->GetOutput()->GetCenter());
plane->SetNormal(1, -1, 1);//随便设了个法向量值
//vtkCutter继承于vtkPolyDataAlgorithm,使用指定的implicit function切割vtkDataSet
vtkSmartPointer<vtkCutter> planeCut = vtkCutter::New();
planeCut->SetInputConnection(cone->GetOutputPort());
planeCut->SetCutFunction(plane);
//mapper
vtkSmartPointer<vtkPolyDataMapper> cutMapper = vtkPolyDataMapper::New();
cutMapper->SetInputConnection(planeCut->GetOutputPort());
auto x = cone->GetOutput()->GetPointData();
//actor
vtkSmartPointer<vtkActor> planeActor = vtkActor::New();
planeActor->SetMapper(cutMapper);
double color[3] = {1, 1, 0};
planeActor->GetProperty()->SetColor(color);
//
renderer->AddActor(planeActor);
//显示
renderer->SetBackground(0.2, 0.4, 0.6);
renWind->SetSize(400, 400);
renWind->Render();
iren->Start();
}
显示效果: