[vtkusers] VTK Marching Cubes Filters / Iso-surfacing filter
salah
salah at gris.uni-tuebingen.de
Tue Feb 22 04:32:49 EST 2005
Hello All,
Perhaps my questions are stupid, but I am not a vtk expert! unfortunately not even a good user :)
1. I am wondering if there is a difference between these itk isosurfacing filter? do they all
generate triangulated surfaces? Do they all implement the traditional MC algorithm?
vtkMarchingContourFilter, vtkKitwareContourFilter, vtkMarchingCubes, vtkImageMarchingCubes
2. Is the filter used in paraview for iso-surfacing (vtkPVKitwareContourFilter) even something different?
3. The output of the vtkImageMarchingCubes filter is a vtkPolyData, right? does not this vtkpolydata
have normals informations?
4. I have been using the code segment bellow to generate, visualize, and save iso-surfaces from
ITK 3d images.
Now,
- The surface rendered using this piece of code is properly lit. How could this happen if vertices'
normals are not there?
- I tried to load the saved vtkpolydata (the ASCII file generated by vtkPolyDataWriter) using
paraview. Only a portion of the model is lit fine. Most parts of the model are black!
By openning this ascii file using a text editor. I saw that normal information is written
as the last part of the file.
In short, and if I am missing/misunderstanding something, what is the right sequence to generate, render,
and save triangulated iso-surfaces using vtk? I need normals for further processing.
Many thanks,
Zein
// =============================== CODE =============================
// convert to vtk image
typedef itk::ImageToVTKImageFilter<ImageType> Itk2VtkType;
Itk2VtkType::Pointer m_Itk2Vtk = Itk2VtkType::New();
m_Itk2Vtk->SetInput(inputImage); // m_Reader reads a binary image
m_Itk2Vtk->Update();
std::cout << "Image converted to VTK...." << std::endl;
// generate iso surface
vtkImageMarchingCubes *marcher = vtkImageMarchingCubes::New();
marcher->SetInput(m_Itk2Vtk->GetOutput());
marcher->SetValue(0, 100);
marcher->Update();
std::cout << "Marching Cube finished...." << std::endl;
vtkDecimate *decimator = vtkDecimate::New();
decimator->SetInput(marcher->GetOutput());
decimator->SetTargetReduction(0.1);
decimator->SetMaximumIterations(4);
decimator->SetInitialError(0.01);
decimator->SetErrorIncrement(0.01);
decimator->SetPreserveTopology(1);
decimator->Update();
vtkSmoothPolyDataFilter* smoother = vtkSmoothPolyDataFilter::New();
smoother->SetInput(decimator->GetOutput());
smoother->SetNumberOfIterations(5);
smoother->SetFeatureAngle(60);
smoother->SetRelaxationFactor(0.05);
smoother->FeatureEdgeSmoothingOff();
std::cout << "VTK Smoothing mesh finished...." << std::endl;
// Save the mesh in an ASCII file
char *meshFname = fl_file_chooser("Choose VTK Mesh File", "*.msh*", "d:/datanpr");
vtkPolyDataWriter *vtkwriter = vtkPolyDataWriter::New();
vtkwriter->SetFileName(meshFname);
vtkwriter->SetInput(smoother->GetOutput());
vtkwriter->SetFileTypeToASCII();
vtkwriter->Update();
// render 3D model
vtkPolyDataMapper* isoMapper = vtkPolyDataMapper::New();
isoMapper->SetInput(marcher->GetOutput());
isoMapper->ScalarVisibilityOff();
vtkActor* actor = vtkActor::New();
actor->SetMapper(isoMapper);
actor->GetProperty()->SetDiffuseColor(1,1,0.9412);
vtkRenderer* ren = vtkRenderer::New();
vtkRenderWindow* renwin = vtkRenderWindow::New();
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
renwin->SetSize(500, 500);
renwin->AddRenderer( ren );
iren->SetRenderWindow(renwin);
ren->SetBackground(0.52, 0.57, 1.0);
ren->AddActor(actor);
renwin->Render();
iren->Start();
More information about the vtkusers
mailing list