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

salah salah at gris.uni-tuebingen.de
Mon Feb 21 15:47:33 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