[vtkusers] Stretch/deform surface
Miguel Angel Rodriguez Florido
marf at ctm.ulpgc.es
Mon Jun 23 07:33:13 EDT 2008
Hi Marius,
I'm not sure but perhaps you need to define another transform (an
identity) to combina with your thinPlate.
Later, SetNumberOfTransforms to 2 and use the weights to weight the
contribution of each one. In same cases, you won't transform the points
(basically the identity is 1 and the thinPlate 0), and in other cases
you will transform the points with the thinPlate.
Hth.
Marius Erdt wrote:
> Right now, I run the following code:
>
> // draw a sphere to get some points of the surface
> vtkSphereSource* sphere = vtkSphereSource::New();
> sphere->SetCenter(mousePos[0],mousePos[1], mousePos[2]);
> sphere->SetRadius(20.0);
>
> // label the surface points that are inside the sphere
> vtkSelectEnclosedPoints* enclosedSelector =
> vtkSelectEnclosedPoints::New();
> enclosedSelector->SetInput(modelPoly);
> enclosedSelector->SetSurface(sphere->GetOutput());
> enclosedSelector->Update();
>
> vtkPoints* modelPoints = modelPoly->GetPoints();
> long numPts = modelPoints->GetNumberOfPoints();
> long ptId;
>
> vtkFloatArray* farray = vtkFloatArray::New();
> farray->SetNumberOfComponents(1);
> farray->SetNumberOfTuples(numPts);
>
> // iterate over all points of the surface and label all points
> that are inside the sphere in a seperate float array
>
> for (ptId = 0 ; ptId < numPts; ptId++){
> if (enclosedSelector->IsInside(ptId) == 1){
> farray->SetComponent(ptId,0,1.0);
> }
> else {
> farray->SetComponent(ptId,0,1.0);
> }
> }
>
> // attach the label array to the surface
> vtkFieldData* fieldData = vtkFieldData::New();
> farray->SetName("weights");
> modelPoly->GetPointData()->AddArray(farray);
>
> vtkThinPlateSplineTransform* thinPlate =
> vtkThinPlateSplineTransform::New();
>
> // add old and new mouse position to the thin plate spline transform
> vtkPoints *points = vtkPoints::New();
> vtkPoints *pointsNew = vtkPoints::New();
> points->SetNumberOfPoints(1);
> pointsNew->SetNumberOfPoints(1);
> points->SetPoint(0, mousePos[0], mousePos[1], mousePos[2]);
> pointsNew->SetPoint(0, mousePosNew[0], mousePosNew[1],
> mousePosNew[2]);
>
> thinPlate->SetSourceLandmarks(points);
> thinPlate->SetTargetLandmarks(pointsNew);
> thinPlate->SetSigma(0.1);
> thinPlate->SetBasisToR();
>
> // run the weighted transform filter with the surface as input and
> the label array as weights
> vtkWeightedTransformFilter* weightedTransform =
> vtkWeightedTransformFilter::New();
> weightedTransform->SetInput(modelPoly);
> weightedTransform->SetNumberOfTransforms(1);
> weightedTransform->SetTransform(thinPlate, 0);
> weightedTransform->SetWeightArray( "weights" );
> weightedTransform->Update();
>
>
> Perhaps I missed some important fact in the procedure, because the
> result is a global transformation of the whole model.
>
>
>
> Miguel Ángel Rodríguez Florido wrote:
>> Perhaps in my case it was easier, but what I did was just the same
>> that
>> you comment. The only difference was that I applied the combinations of
>> transforms to different regions of the surface (rotations and
>> displacement)
>>
>> For me this was enough.
>>
>> I guess that in your case is more complex. I don't know if
>> somebody in
>> this list has developed a BSpline for VTK.
>>
>> Please, let me know if I can help you or let the vtkusers' list
>> know if
>> you find a solution.
>>
>> Hth.
>>
>>
>> Marius Erdt escribió:
>>> Thanks for your suggestion Miguel.
>>>
>>> I've tried to use the vtkWeightedTransformFilter. The input is the
>>> surface and a thinPlateSpline transform. In addition I've created a
>>> label array that weights the transform for every point, i.e. 1 for
>>> every point I want to transform and 0 for every point that should not
>>> be transformed. However, the result was, that the whole surface was
>>> distorted, so I think the weights have to be set in another way. What
>>> I do know is that setting of all weights to 1 results in a global
>>> transformation as one would expect. But setting some of the weights
>>> to 0 does not seem to work..
>>>
>>>
>>> Miguel Ángel Rodríguez Florido wrote:
>>>> If you know the points (or regions) or you can choose them, you
>>>> could try vtkWeightedTransformFilter
>>>>
>>>> http://www.vtk.org/doc/release/5.0/html/a02205.html
>>>>
>>>> I hope to help.
>>>> Best
>>>>
>>>> Karthik Krishnan escribió:
>>>>> Marius Erdt wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I'd like to manually deform a polyData surface, i.e. I set two
>>>>>> mouse positions and I want a part of the surface to be stretched
>>>>>> in the direction given by the vector between the points (just like
>>>>>> what is possible in CAD programs).
>>>>>>
>>>>>> I've tried to use the vtkThinPlateSplineTransform on the surface,
>>>>>> but this has a very global effect on the model. That means, the
>>>>>> whole surface is translated in the given direction, instead of
>>>>>> just a small neighborhood.
>>>>> The Kernel splines, one of which is the Thin plate spline (Thin
>>>>> Plate, Thin Plate R2LogR) have infinite support. You can change the
>>>>> decay, but it will still have a non-zero deformation at an infinite
>>>>> distance from the center.
>>>>>
>>>>> You might want to consider BSpline transforms for your purpose.
>>>>> They are local in support and you can define the locality (number
>>>>> of nodes).
>>>>>
>>>>> VTK does not have a BSpline implementation, but ITK does. You can
>>>>> use the method
>>>>>
>>>>> itk::BSplineTransform< double, 3, 3 >::TransformPoint(..)
>>>>>
>>>>> and iterate over each point in your polydata.
>>>>>
>>>>>
>>>>> --
>>>>> Karthik Krishnan
>>>>> R & D Engineer,
>>>>> Kitware Inc,
>>>>> Ph: +1 518 3713971 x119
>>>>> Fax: +1 518 3714573
>>>>>
>>>>> _______________________________________________
>>>>> 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
>>>>
>>>
>>>
>>> _______________________________________________
>>> 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
>>
>
>
> _______________________________________________
> 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
--
Miguel Angel Rodriguez Florido
Center for Technology in Medicine-ULPGC-Gran Canaria-CanaryIslands,Spain
Emails:marf@{ctm.ulpgc.es,bwh.harvard.edu}-http://www.ctm.ulpgc.es/~marf
Tfnos:+34 928 451253, +34 928 452956 - Fax:+34 928 451243
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3250 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20080623/edccd990/attachment.bin>
More information about the vtkusers
mailing list