[vtkusers] VTK Marching Cubes Filters / Iso-surfacing filter

salah salah at gris.uni-tuebingen.de
Mon Feb 21 12:02:50 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