[vtkusers] How to apply Transformations to STL objects

Mike Jackson imikejackson at gmail.com
Mon Mar 19 06:58:38 EDT 2007


You want to look at the vtkTransformPolyDataFilter classes. Then once  
you transform each of your STL datasets, then use vtkAppendPolyData  
filter to bring them together.

    If they happen to have matching points, then run the  
vtkMergePoints filter to remove duplicate points.

Then you can save the data either as a vtk data file using the  
vtkXMLPolydataWriter or the vtkSTLWriter


-- 
Mike Jackson   Senior Research Engineer
Innovative Management & Technology Services


On Mar 19, 2007, at 12:43 AM, MIRG UTM wrote:

> Hi VTK gurus
>
> I am working on medical data, I have two pieces of bone in STL  
> format and I have to align second with the first one and then merge  
> both to form a single object. I am new to VTK and donot know  
> exactly how to do. I tried to move the second bone by using  
> vtkActor methods (RotateX, RotateY, AddPosition etc) but these only  
> move the rendered pipeline and actual object data does not change.  
> Then I tried to change the data manually by using "vtkMatrix4x4", I  
> could get the point data from STL object and change it by applying  
> transformation, but I donot know how to set this changed point data  
> back to the STL object. If any one can please help me how to do  
> this. Is there any other easy way to do the same?
>
> Here is code snippit;
>
>  stlReader = vtkSTLReader::New();
>  stlReader->SetFileName("stlFile.stl");
> // here goes other rendering stuff
>  //get PolyData from the STL object
>  vtkPolyData *pd = vtkPolyData::New();
>  pd = stlReader->GetOutput();
>  int n1 = pd->GetNumberOfPoints();
>
>  // get points data from PolyData object
>  vtkPoints *a = pd->GetPoints();
>
>  vtkMatrix4x4 *t = vtkMatrix4x4::New();
>
>  t->Identity();
>  t->SetElement(0, 3, 5.0);
>  t->SetElement(1, 3, 0.0);
>  t->SetElement(2, 3, 0.0);
>
>  double *p, pin[4], pout[4];
>  for (int i=0; i<n1;i++)
>  {
>   p = a->GetPoint(i);
>   pin[0] = p[0]; pin[1] = p[1]; pin[2] = p[2]; pin[3] = 1;
>
>   t->MultiplyPoint(pin, pout);
>
>   p[0]=pout[0]; p[1]=pout[1]; p[2]=pout[2];
>
>   a->SetPoint(i, p);
>  }
>
>  // return updated points to PolyData object
>  pd->SetPoints(a);
>
>  // upto here the code is OK, but after this I donot know how to  
> return
>  // this changed PolyData object back to the 'stlReader'
>  // I have tried to use the following
>
>  this->vtkReaderSoft->SetInputConnection 
> (reinterpret_cast<vtkAlgorithmOutput*>(pd));
>
> // but it gives the following runtime error
>
>
> ERROR: In D:\Softwares\VTK5.0\Source\Filtering\vtkAlgorithm.cxx,  
> line 567
> vtkSTLReader (0x0288BDA8): Attempt to connect input port index 0  
> for an algorithm with 0 input ports.
>
> Please help me to solve this and then how to merge two STL objects  
> into a single object using operations like UNION, INTERSECTION,  
> DIFFERENCE etc.
>
> Thanks in advance.
>
> MIRG
>
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/ 
> Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20070319/6b1e27a9/attachment.htm>


More information about the vtkusers mailing list