[vtkusers] duplicated vertex in marching cubes?
lucas Grijander
dev_crisalix at hotmail.com
Wed Nov 11 10:40:44 EST 2009
This is my code. Basically I have a mesh "geometry" and I project rays in order to fill the matrix of points.
***********************************vtkStructuredPoints *object = prepareVTKObjectForMarching(geom,40);
//Iso-surface using marching cubesvtkMarchingCubes* iso = vtkMarchingCubes::New();iso->SetInput(object);iso->SetValue(0,1); // Surface #0, iso-value=1 iso->Update();
then the function prepareVTKObjectForMarching
vtkStructuredPoints* prepareVTKObjectForMarching(osg::Geometry *geometry, int steps, string name){ TBBox bbox = createBoundingBox(geometry);
bbox.length[0] *= 1.2; bbox.length[1] *= 1.2; bbox.length[2] *= 1.2;
float lengthStep = bbox.length[bbox.maxLAxis]/(float)steps;
int dim[3]; dim[0] = steps; dim[1] = steps; dim[2] = steps; double ar[3]; ar[0] = lengthStep; ar[1] = lengthStep; ar[2] = lengthStep; double origin[3]; origin[0] = bbox.origin[0]; origin[1] = bbox.origin[1]; origin[2] = bbox.origin[2];
vtkStructuredPoints *strcP = vtkStructuredPoints::New();
// Set data dimensions, spacing and origin strcP->SetDimensions(dim); strcP->SetSpacing(ar); strcP->SetOrigin(origin);
vtkDataSet *ds = strcP ;
vtkDataSetAttributes *a = ds->GetPointData() ;
// Data may be vtkUnsignedCharArray or vtkUnsignedShortArray vtkUnsignedCharArray *scalars = vtkUnsignedCharArray::New(); unsigned int cnt = 0;
float zInit = origin[2];
for(int x = 0; x < steps; x++) { float xf = bbox.origin[0] + x*lengthStep;
for(int y = 0; y < steps; y++) { float yf = bbox.origin[1] + y*lengthStep;
vector<float> listT = getIntersectionPoints(xf,yf,zInit,geometry);
if(listT.size() == 2) { float zIn = zInit + listT.at(0); float zOut = zInit + listT.at(1);
bool particleAdded = false; for(int z = 0; z < steps; z++) { float zf = origin[2] + z*lengthStep;
if(zf >= zIn && zf <= zOut) { scalars->InsertValue(cnt, 128) ; particleAdded = true; } else if(zf < zIn)scalars->InsertValue(cnt, 0) ; else if(zf > zOut && particleAdded == false) { scalars->InsertValue(cnt,128); particleAdded = true; } else scalars->InsertValue(cnt, 0) ; cnt++; } } else if(listT.size() == 4) { float zIn1 = zInit + listT.at(0); float zOut1 = zInit + listT.at(1);
float zIn2 = zInit + listT.at(2); float zOut2 = zInit + listT.at(3);
for(int z = 0; z < steps; z++) { float zf = origin[2] + z*lengthStep; if((z >= zIn1 && z <= zOut1) || (z >= zIn2 && z <= zOut2)) { scalars->InsertValue(cnt, 128); } else scalars->InsertValue(cnt, 0) ; cnt++; } } else { for(int z = 0; z < steps; z++) { scalars->InsertValue(cnt, 0) ; cnt++; } } } }
a->SetScalars(scalars) ;
return strcP;}
> Date: Wed, 11 Nov 2009 10:33:06 -0500
> Subject: Re: [vtkusers] duplicated vertex in marching cubes?
> From: bill.lorensen at gmail.com
> To: dev_crisalix at hotmail.com
> CC: vtkusers at vtk.org
>
> Please provide a small, complete example. MC should not generate
> duplicate points or vertices. What is the datatype of your scalars?
>
> On Wed, Nov 11, 2009 at 10:20 AM, lucas Grijander
> <dev_crisalix at hotmail.com> wrote:
> >
> > Hi all!
> > I am using vtkMarchingCubes to calculate a 3D mesh of a volume I have. Fist
> > I initialize the filter with:
> > vtkMarchingCubes* iso = vtkMarchingCubes::New();
> > iso->SetInput(object);
> > iso->SetValue(0,1); // Surface #0, iso-value=1
> > iso->Update();
> > then I fill the vtkStructuredPoints.
> > The problem I have is, as you can see in the pictures, when you have a close
> > look to the trianbles (screen2) you can see duplicated triangles and vertex,
> > and this is a huge problem for my application... I supposed vtkMarchingCubes
> > should generate a single surface mesh... I don't know if that's the reason,
> > but when I fill the vtkStructuredPoints I use
> > scalars->InsertValue(cnt, 0) ; and scalars->InsertValue(cnt, 128) ;
> > I took all these from an example, I still don't know what you have to set as
> > values, either 1 or 128... in addition the result change with this number
> > and I'm not sure why.
> > What should I use as values? and also why I have this "double" triangles
> > mesh?
> > thanks!
> > Jaime.
> > ________________________________
> > Windows Live: Make it easier for your friends to see what you’re up to on
> > Facebook.
> > ________________________________
> > Keep your friends updated— even when you’re not signed in.
> > ________________________________
> > Windows Live: Friends get your Flickr, Yelp, and Digg updates when they
> > e-mail you.
> > _______________________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Please keep messages on-topic and check the VTK FAQ at:
> > http://www.vtk.org/Wiki/VTK_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
> >
> >
_________________________________________________________________
Windows Live: Keep your friends up to date with what you do online.
http://www.microsoft.com/middleeast/windows/windowslive/see-it-in-action/social-network-basics.aspx?ocid=PID23461::T:WLMTAGL:ON:WL:en-xm:SI_SB_1:092010
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20091111/7b2bb2d4/attachment.htm>
More information about the vtkusers
mailing list