vtk体绘制-例子

来源:互联网 发布:rtx mac 2009 编辑:程序博客网 时间:2024/05/19 02:27

#include <Windows.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataMapper.h>
#include <vtkMarchingCubes.h>
#include <vtkVolume16Reader.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkTriangleFilter.h>
#include <vtkSmoothPolyDataFilter.h>
#include <vtkDecimatePro.h>
#include <vtkSTLWriter.h>


int WINAPI WinMain(HINSTANCE hInstance,

       HINSTANCE hPrevInstance,

       LPSTR lpCmdLine,

       int nCmdShow)
{
 //读取raw图片
 vtkVolume16Reader *reader = vtkVolume16Reader::New();
 reader->SetDataDimensions(64, 64);
 reader->SetDataByteOrderToLittleEndian();
 reader->SetFilePrefix("D://headsq/quarter");
 reader->SetImageRange(1, 93);
 reader->SetDataSpacing(3.2, 3.2, 1.5);

 vtkMarchingCubes *boneExtractor = vtkMarchingCubes::New();
 boneExtractor->SetInput((vtkDataObject*)reader->GetOutput());
 boneExtractor->SetValue(0, 500);

 //将原始拓扑结果全部转化为三角面片结构
 vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();
 //设置输入
 triangleFilter->SetInput(boneExtractor->GetOutput());

 //做简化
 vtkDecimatePro *deciFilter = vtkDecimatePro::New();
 //设置输入
 deciFilter->SetInputConnection(triangleFilter->GetOutputPort());
 //简化为原来的10%
 deciFilter->SetTargetReduction(0.1);
 //保持原始网格拓扑结构
 deciFilter->PreserveTopologyOn();

 //做平滑
 vtkSmoothPolyDataFilter *smoothFilter = vtkSmoothPolyDataFilter::New();
 //设置输入
 smoothFilter->SetInputConnection(deciFilter->GetOutputPort());
 //设置平滑的次数
 smoothFilter->SetNumberOfIterations(800);
 //开启尖锐特征平滑
 smoothFilter->FeatureEdgeSmoothingOn();

 vtkPolyDataMapper *boneMapper = vtkPolyDataMapper::New();
 //boneMapper->SetInput(triangleFilter->GetOutput());
 //boneMapper->SetInput(deciFilter->GetOutput());
 boneMapper->SetInput(smoothFilter->GetOutput());

 vtkSTLWriter *face = vtkSTLWriter::New();
 face->SetInputConnection(smoothFilter->GetOutputPort());
 face->SetFileName("d://face.stl");
 face->Update();
 face->Write();

 vtkActor *bone = vtkActor::New();
 bone->SetMapper(boneMapper);

 bone->GetProperty()->SetDiffuseColor(0.1, 0.94, 0.52);
 bone->GetProperty()->SetSpecular(0.3);
 bone->GetProperty()->SetSpecularPower(20);

 vtkRenderer *ren = vtkRenderer::New();
 vtkRenderWindow *renWin = vtkRenderWindow::New();
 renWin->AddRenderer(ren);

 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
 iren->SetRenderWindow(renWin);

 ren->AddActor(bone);
 ren->Render();
 iren->Initialize();
 iren->Start();

 boneExtractor->Delete();
 triangleFilter->Delete();
 deciFilter->Delete();
 smoothFilter->Delete();
 face->Delete();
 boneMapper->Delete();
 bone->Delete();
 ren->Delete();
 renWin->Delete();
 reader->Delete();
 iren->Delete();

 return 0;
}

 

原创粉丝点击