[vtkusers] give direction to cylinder

Bill Lorensen bill.lorensen at gmail.com
Thu Jul 19 15:18:49 EDT 2012


Look at RotateWXYZ method.
  // Description:
  // Create a rotation matrix and concatenate it with the current
  // transformation according to PreMultiply or PostMultiply semantics.
  // The angle is in degrees, and (x,y,z) specifies the axis that the
  // rotation will be performed around.
  void RotateWXYZ(double angle, double x, double y, double z)

On Thu, Jul 19, 2012 at 12:47 PM, Gonzalo Amadio <gonzaloamadio at gmail.com>wrote:

> Yes, that is ok. What I am not sure if the part of what I have to give as
> arguments to functions RotateX, RotateY, RotateZ.
>
> I have a director vector, lets call it (a1, a2, a3)  and I want to give
> the cylinder that direction. I obtained the angles between a1 and axis X,
> and so on.
> And give that as argument to RotateX, i.e   RotateX(angle between a1 and
> axisX);
>
>
> 2012/7/19 Bill Lorensen <bill.lorensen at gmail.com>
>
>> To rotate about a given point you must
>> Translate to the point
>> Rotate
>> Translate back
>>
>>
>> On Thu, Jul 19, 2012 at 12:25 PM, Gonzalo Amadio <gonzaloamadio at gmail.com
>> > wrote:
>>
>>> I thought I would solve my problem. But no. Well, in fact the problem is
>>> with the rotation.
>>> The aim of what I am doing is trying to position the cylinder in such
>>> way that is around a line I have.
>>> My idea is, positionning it on the center of the line, and then
>>> rotating, so it is in the same direction of the line.
>>>
>>> I have a line segment, which I know
>>>
>>> originLine[3] = myOrigin;   //origin of the line
>>>> dir[3] = myDirection;         //direction of the line
>>>> double lengthLine = 10;    //length
>>>
>>>
>>> y could position the cylinder in the center of the line with :
>>>
>>> double cen[3];
>>>> cen[0] = centerTip[0] + dir[0] * (lenght)/2 ;
>>>> cen[1] = centerTip[1] + dir[1] * (lenght)/2 ;
>>>> cen[2] = centerTip[2] + dir[2] * (lenght)/2 ;
>>>
>>>
>>> Then, the part where I am not sure if it is how it has to be done.
>>> I obtain the angles between the dir vector and axis. And pass that
>>> angles to RotateX, RotateY, RotateZ.
>>>
>>> double alpha, beta, gamma; //angles between dir and axis x, y, z
>>>> respectively.
>>>> double norm;
>>>> norm = sqrt (dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]);
>>>>
>>>
>>>
>>> alpha =   acos (dir[0] / norm);
>>>> beta =     acos (dir[1] / norm);
>>>> gamma = acos (dir[2] / norm);
>>>
>>>
>>>> vtkSmartPointer<vtkTransform> transform =
>>>> vtkSmartPointer<vtkTransform>::New();
>>>> transform->Translate(-cen[0],-cen[1],-cen[2]);
>>>> transform->PostMultiply();
>>>> transform->RotateX(alpha);
>>>> transform->RotateY(beta);
>>>> transform->RotateZ(gamma);
>>>> transform->Translate(cen[0],cen[1],cen[2]);
>>>>
>>>
>>>
>>> vtkSmartPointer<vtkTransformPolyDataFilter> transF =
>>>> vtkSmartPointer<vtkTransformPolyDataFilter>::New();
>>>> transF->SetInput(cylinderSource->GetOutput());
>>>> transF->SetTransform(transform);
>>>> transF->Update();
>>>
>>>
>>> There is no way of setting to the cylinder an origin and end point?, so
>>> all this part of the orientation can be avoided.
>>>
>>> Someone can help me with this? .
>>>
>>> Thank you!
>>>
>>>
>>>
>>> 2012/7/18 David Doria <daviddoria at gmail.com>
>>>
>>>> On Wed, Jul 18, 2012 at 1:53 PM, Gonzalo Amadio <
>>>> gonzaloamadio at gmail.com> wrote:
>>>>
>>>>> Well, here is my code, now it seems to work .
>>>>>
>>>>> vtkSmartPointer<vtkCylinderSource> cylinderSource =
>>>>>> vtkSmartPointer<vtkCylinderSource>::New();
>>>>>> cylinderSource->SetCenter(center[0], center[1], center[2]);
>>>>>>
>>>>>
>>>>>
>>>>> vtkSmartPointer<vtkTransform> transform =
>>>>>> vtkSmartPointer<vtkTransform>::New();
>>>>>>  transform->Translate(-center[0],-center[1],-center[2]);
>>>>>> transform->PostMultiply();  //This was the fundamental line, if I
>>>>>> have not put this line, the second translation goes to a wrong place.
>>>>>> transform->RotateX(90);
>>>>>> transform->Translate(centerV[0],centerV[1],centerV[2]);
>>>>>>
>>>>>
>>>>>
>>>>> vtkSmartPointer<vtkTransformPolyDataFilter> transF =
>>>>>> vtkSmartPointer<vtkTransformPolyDataFilter>::New();
>>>>>> transF->SetInput(cylinderSource->GetOutput());
>>>>>> transF->SetTransform(transform);
>>>>>> transF->Update();
>>>>>>
>>>>>
>>>>>
>>>>> vtkSmartPointer<vtkPolyData> cylinder = transF->GetOutput();
>>>>>
>>>>>
>>>> You may find Lecture 2: Transforms from here:
>>>> http://www.vtk.org/Wiki/VTK/Presentations
>>>>
>>>> useful as well, but it seems you've already solved the problem.
>>>>
>>>> David
>>>>
>>>
>>>
>>>
>>> --
>>> --------
>>> Gonzalo Amadio
>>>
>>>
>>> _______________________________________________
>>> 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
>>>
>>>
>>
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com
>>
>>
>
>
> --
> --------
> Gonzalo Amadio
>
>


-- 
Unpaid intern in BillsBasement at noware dot com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120719/ea86523f/attachment.htm>


More information about the vtkusers mailing list