[vtk-developers] vtkCleanPolyData on textured surfaces
Tim Hutton
T.Hutton at eastman.ucl.ac.uk
Thu Sep 30 07:28:25 EDT 2004
A couple of times the users list has mentioned that when you run
vtkCleanPolyData on textured surfaces, the texture sometimes gets broken.
This happens when two points are merged (because they are in the same
place), ignoring the fact that they have different tcoords.
The result of this problem is shown here:
http://www.eastman.ucl.ac.uk/~thutton/VTK/tcoords_merged_problem.jpg (23k)
The solution I'm using at the moment is to alter two bits of code in
vtkCleanPolyData, where the polygons and poly strips are merged (code below).
Perhaps a better alternative would be to have this functionality as an
option in vtkPointLocator, however what gets passed to InsertUniquePoint
is just a double[3] and thus there is no easy way for the locator to access
the tcoords.
So, I'm seeking advice on whether to:
a) add the code as an option (IgnoreTextureCoordinates=1 by default to keep
current functionality) to vtkCleanPolyData.
b) derive a new class from vtkCleanPolyData (means duplicating much of the
code of Execute())
c) implement some way for the vtkPointLocator to check the tcoords if desired
d) implement nothing, but tell vtkusers about my workaround.
The idea could be generalized to other point data, for example to not merge
two vertices if they had different scalars, however I suspect that this
wouldn't be of use to anyone.
Thankyou for your time.
Tim
------------------------------------
OLD CODE: (at lines 337 and 423 in revision 1.74 of vtkCleanPolyData.cxx)
else if ( this->Locator->InsertUniquePoint(newx, ptId) )
{
outputPD->CopyData(inputPD,pts[i],ptId);
}
------------------------------------
REPLACEMENT CODE:
else
{
ptId = this->Locator->IsInsertedPoint(newx);
if(ptId!=-1)
{
// a point exists at this location - only insert our point if
tcoords differ
float *t1,*t2;
t1 = inputPD->GetTCoords()->GetTuple(pts[i]);
t2 = outputPD->GetTCoords()->GetTuple(ptId);
if(t1[0]!=t2[0] || t1[1]!=t2[1])
{
// insert the point, this vertex is duplicated
ptId = this->Locator->InsertNextPoint(newx); // note that this
is not InsertUniquePoint
outputPD->CopyData(inputPD,pts[i],ptId);
}
}
else
{
// this point hasn't been seen already, so add it
ptId = this->Locator->InsertNextPoint(newx);
outputPD->CopyData(inputPD,pts[i],ptId);
}
}
------------------------------------
More information about the vtk-developers
mailing list