[vtkusers] Re: Re: MarchingCubes
Goodwin Lawlor
goodwin.lawlor at ucd.ie
Thu Jul 29 13:57:49 EDT 2004
Hi Sean
Thats true too... the advantage of vtkImplicitModeller is that it uses the
dataset topology to calculate an accurate distance to the surface.
vtkSurfaceReconstructionFilter estimates a surface tangent to calculate the
distance since the dataset has no surface topology (if it did why would you
be reconstructing it?).
vtkImplicitModeller could be modified to calculate a signed distance based
on the normals of the input.
I had thought about this awhile ago as a method to create a hex FE mesh from
a polygonal surface. I might give it a go when I get time (a couple of
months).
Goodwin
----- Original Message -----
From: "Sean McInerney" <seanm at nmr.mgh.harvard.edu>
To: "Goodwin Lawlor" <goodwin.lawlor at ucd.ie>
Cc: <vtkusers at public.kitware.com>
Sent: Thursday, July 29, 2004 6:32 PM
Subject: Re: [vtkusers] Re: Re: MarchingCubes
> Right you are, Goodwin,
>
> vtkVoxelModeller is the easiest choice of all and produces a true
> binary volume. The resultant volume, however, will be "hollow". I was
> experimenting with vtkSurfaceReconstructionFilter instead of
> vtkImplicitModeller because it produces a signed distance from the
> surface. vtkImplicitModeller has no concept of "inside" versus "outside".
>
> -Sean
>
> Goodwin Lawlor wrote:
> > 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
> >>
> >
> >
> >
> >
> > _______________________________________________
> > 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