前言
使用vtk可以读取的模型格式非常有限,在此适应vtk加载.stl格式的工业数据(使用SolidWorks输出的或者CAD输出的,后来为了减少模型容量,用上SolidWorks将stl格式转换成了obj格式,胆石症这样不含颜色纹理了)。
实现
通过加载.obj,组成一个actor,在通过读取actor进行显示(此步未展示)。
读取.obj模型数据:
vtkSmartPointer<vtkActor> 3DActor()
{
std::string filename = "qiu.obj";
vtkSmartPointer<vtkOBJReader> reader =
vtkSmartPointer<vtkOBJReader>::New();
reader->SetFileName(filename.c_str());
reader->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper2 =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper2->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper2);
actor->GetProperty()->SetOpacity(1.0);
return actor;
}
读取.stl模型数据
void show3D()
{
vtkSmartPointer<vtkPolyData> input1 = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkSTLReader> reader1 = vtkSmartPointer<vtkSTLReader>::New();
reader1->SetFileName("qiu1v2.0.STL");
reader1->Update();
input1->DeepCopy(reader1->GetOutput());
// Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader1->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
//actor->SetMapper(mapper);
actor->SetMapper(mapper11);
actor->GetProperty()->SetOpacity(1.0);
vtkRenderWindow* renWin = vtkRenderWindow::New();
vtkRenderer* ren = vtkRenderer::New();
renWin->AddRenderer(ren);
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkAppendPolyData> apd = vtkSmartPointer<vtkAppendPolyData>::New();
apd->AddInputData(mapper->GetInput());
apd->Update();
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();
}
运行效果