[vtkusers] Re: Re: MarchingCubes

Goodwin Lawlor goodwin.lawlor at ucd.ie
Thu Jul 29 13:24:42 EDT 2004


You could have a go with any of the sub-classes of vtkDataSetToImageFilter.
vtkImplicitModeller and and vtkVoxelModeller would be worth a look

Goodwin

"Sean McInerney" <seanm at nmr.mgh.harvard.edu> wrote in message
news:41085C71.8090500 at nmr.mgh.harvard.edu...
> Jonathan,
>
>    I'll check out your code.
>    In the meantime, I had a quicker and dirtier idea that I decided to
> try out using vtkSurfaceReconstructionFilter and vtkImageThreshold to
> produce an binary ImageData volume from a PolyData surface. It's rough
> but interesting. The output is a volume rendering.
>
> -Sean
>
> Jonathan Bailleul wrote:
> > Sean McInerney wrote:
> >
> >>Jonathan,
> >>
> >>   That's a cool idea!
> >>
> >>   Foreach desired slice plane for the ImageData volume that you will
> >>ultimately produce, do something like this:
> >>
> >>1.) Use vtkClipPolyData to get the 2D contour of the given slice.
> >>
> >>2.) Use vtkPolyDataToImageStencil to produce ImageStencilData
> >>
> >>3.) Use vtkImageStencil to produce the ImageData
> >>     (need to do a little filtering to produce the desired binary
image).
> >>
> >>4.) Use vtkAppendFilter to fuse the 2D binary images into a 3D volume.
> >>     Hopefully, the ImageStencilData retains a 3D extent.
> >>
> >>5.) Voila! Binary volume from PolyData ... maybe.
> >>
> >>-Sean
> >
> >
> >
> > Thanks for the help!
> >
> > If someone is inspirated to actually implement this (or has already
> > completed this), please notify me!
> > Anyway, here is a stupid but working solution. Code is sometimes ugly,
> > but it works (only voxels at border of each slice are "colored"). Output
> > is AIR analyse format, recognized on ITK and usable on VTK if you know
> > the parameters and consider the .img file as the raw volume.
> >
> > All personal includes in:
> > http://www.greyc.ismra.fr/~bailleul/Ressources/summary.html (see gpl
> > code section)
> > for those who really want to end up testing the program.
> >
> > I really should have been more investigating on VTK abilities before
> > doing all this by hand, but I was VTK newbie when I coded this and had
> > most of the necessary code at hand on my personal libraries.
> >
> >
>


----------------------------------------------------------------------------
----


> // VTK Common
> #include "vtkPolyData.h"
> #include "vtkImageData.h"
> #include "vtkPiecewiseFunction.h"
> #include "vtkColorTransferFunction.h"
> // VTK Imaging
> #include "vtkSurfaceReconstructionFilter.h"
> #include "vtkImageThreshold.h"
> #include "vtkImageToStructuredPoints.h"
> // VTK Graphics
> #include "vtkOutlineFilter.h"
> // VTK IO
> #include "vtkBYUReader.h"
> // VTK Rendering
> #include "vtkPolyDataMapper.h"
> #include "vtkProperty.h"
> #include "vtkActor.h"
> #include "vtkVolumeRayCastCompositeFunction.h"
> #include "vtkVolumeRayCastMapper.h"
> #include "vtkVolumeProperty.h"
> #include "vtkVolume.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
>
> int
> main (int argc, char* argv[])
> {
>   const char* dataRoot = getenv("VTK_DATA_ROOT");
>
>   if (dataRoot == NULL)
>     {
>     cerr << "Must set VTK_DATA_ROOT!" << endl;
>     return 0;
>     }
>
>   const char* subdir = "/Data/";
>   const char* file1 = "Viewpoint/cow.g";
>   char* path1 = new char
[strlen(dataRoot)+strlen(subdir)+strlen(file1)+1];
>
>   strcpy(path1, dataRoot);
>   strcat(path1, subdir);
>   strcat(path1, file1);
>
>   double length;
>   double range[2];
>   double bounds[6];
>   int extent[6];
>
>   vtkRenderer* ren1 = vtkRenderer::New();
>   vtkRenderWindow* renWin = vtkRenderWindow::New();
>     {
>     renWin->AddRenderer(ren1);
>     renWin->SetSize(300,300);
>     ren1->Delete();
>     }
>   vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
>     {
>     iren->SetRenderWindow(renWin);
>     renWin->Delete();
>     }
>
>   vtkImageData* imageData = vtkImageData::New();
>     {
>     vtkSurfaceReconstructionFilter* surfaceRecon =
>       vtkSurfaceReconstructionFilter::New();
>       {
>       vtkBYUReader* reader = vtkBYUReader::New();
>         {
>         reader->SetGeometryFileName(path1);
>         reader->Update();
>         }
>       surfaceRecon->SetInput(reader->GetOutput());
>       surfaceRecon->SetNeighborhoodSize(10);
>
surfaceRecon->SetSampleSpacing(reader->GetOutput()->GetLength()/100.0);
>       surfaceRecon->Update();
>       reader->Delete();
>       }
>     imageData->DeepCopy(surfaceRecon->GetOutput());
>     surfaceRecon->Delete();
>     }
>
>   vtkActor* outlineActor = vtkActor::New();
>     {
>     vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();
>       {
>       vtkOutlineFilter* outlineFilter = vtkOutlineFilter::New();
>         {
>         outlineFilter->SetInput(imageData);
>         }
>       outlineMapper->SetInput(outlineFilter->GetOutput());
>       outlineFilter->Delete();
>       }
>     outlineActor->SetMapper(outlineMapper);
>     outlineMapper->Delete();
>     }
>   ren1->AddProp(outlineActor);
>   outlineActor->Delete();
>
>   renWin->Render();
>
>   vtkVolume* volume = vtkVolume::New();
>     {
>     vtkVolumeRayCastMapper* volumeMapper = vtkVolumeRayCastMapper::New();
>       {
>       vtkVolumeRayCastCompositeFunction* compositeFunction =
>         vtkVolumeRayCastCompositeFunction::New();
>       vtkImageThreshold* imageThreshold = vtkImageThreshold::New();
>         {
>         imageThreshold->SetInput(imageData);
>         imageThreshold->ReplaceInOn();
>         imageThreshold->ReplaceOutOn();
>         imageThreshold->SetInValue(1.0);
>         imageThreshold->SetOutValue(0.0);
>         imageThreshold->ThresholdByLower(0.0);
>         imageThreshold->SetOutputScalarTypeToUnsignedChar();
>         }
>       volumeMapper->SetVolumeRayCastFunction(compositeFunction);
>       volumeMapper->SetInput(imageThreshold->GetOutput());
>       imageThreshold->Delete();
>       }
>     vtkVolumeProperty* volumeProperty = vtkVolumeProperty::New();
>       {
>       // Create transfer mapping scalar value to opacity
>       vtkPiecewiseFunction* opacityTF = vtkPiecewiseFunction::New();
>         {
>         opacityTF->AddPoint(0.0, 0.167);
>         opacityTF->AddPoint(1.0, 0.667);
>         opacityTF->ClampingOn();
>         }
>       // Create transfer mapping scalar value to color
>       vtkColorTransferFunction* colorTF = vtkColorTransferFunction::New();
>         {
>         colorTF->AddHSVPoint(0.0, 0.00, 1.0, 1.0);
>         colorTF->AddHSVPoint(1.0, 0.50, 1.0, 1.0);
>         }
>       volumeProperty->SetColor(colorTF);
>       volumeProperty->SetScalarOpacity(opacityTF);
>       volumeProperty->SetInterpolationTypeToLinear();
>       opacityTF->Delete();
>       colorTF->Delete();
>       }
>     volume->SetMapper(volumeMapper);
>     volume->SetProperty(volumeProperty);
>     volumeMapper->Delete();
>     volumeProperty->Delete();
>     }
>   ren1->AddProp(volume);
>   volume->Delete();
>
>   renWin->Render();
>
>   iren->Start();
>
>   iren->Delete();
>   imageData->Delete();
>
>   delete [] path1;
>
>   return 0;
> }
>


----------------------------------------------------------------------------
----


> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at:
<http://public.kitware.com/cgi-bin/vtkfaq>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>






More information about the vtkusers mailing list