上次打开了stl文件,其他文件的类似,先不一一介绍。这次按照书上的介绍,添加一个包围盒。不过书上的一些代码和VTK9有差异,需要注意。
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSTLReader.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkOutlineFilter.h>
#define vtkSPtr vtkSmartPointer
#define vtkSPtrNew(Var, Type) vtkSPtr<Type> Var = vtkSPtr<Type>::New();
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif
int main()
{
vtkSPtrNew(reader, vtkSTLReader); // 读取STL
reader->SetFileName("D:\\bird.stl"); //设置一个stl文件
reader->Update();
vtkSPtrNew(mapper, vtkPolyDataMapper);
mapper->SetInputConnection(reader->GetOutputPort());
vtkSPtrNew(actor, vtkActor);
actor->SetMapper(mapper);
actor->GetProperty()->SetEdgeColor(255, 241, 0); // 显示边框颜色
// actor->GetProperty()->SetEdgeVisibility(1); // 显示边框
vtkSPtrNew(ren1, vtkRenderer);
ren1->AddActor(actor);
vtkSmartPointer<vtkOutlineFilter> outline =
vtkSmartPointer<vtkOutlineFilter>::New();
// outline->SetInputConnection(reader->GetOutputPort()); //这句和下面的都可以
outline->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkPolyDataMapper> outlineMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
outlineMapper->SetInputConnection(outline->GetOutputPort()); //这句可以,VTK9和书上的例子不一样了。
// outlineMapper->SetInputData(outline->GetOutput()); //这句不行,不会显示红色的框。
vtkSmartPointer<vtkActor> outlineActor =
vtkSmartPointer<vtkActor>::New();
outlineActor->SetMapper(outlineMapper);
outlineActor->GetProperty()->SetColor(1,0,0);
ren1->AddActor(outlineActor);
ren1->SetBackground(0.1, 0.2, 0.4);
vtkSPtrNew(renWin, vtkRenderWindow);
renWin->AddRenderer(ren1);
renWin->SetSize(300, 300);
vtkSPtrNew(iren, vtkRenderWindowInteractor);
iren->SetRenderWindow(renWin);
vtkSPtrNew(style, vtkInteractorStyleTrackballCamera);
iren->SetInteractorStyle(style);
// renWin->SetSize(600, 600);
renWin->Render();
iren->Start();
return 0;
}