[vtkusers] positioning a cylinder

Mark Wyszomierski markww at gmail.com
Sat Mar 31 11:47:52 EDT 2007


Thanks Amy, and Marc. I will give it a try. My final goal is to have a
nice arrow class where I can just do:

Arrow->SetHeadPoint(x,y,z);
Arrow->SetTailPoint(x,y,z);

Doing this with a cone actor is pretty easy (set the origin and
direction) but for the shaft(cylinder source) it is more complicated.

Thanks,
Mark

On 3/31/07, Marc Cotran <marc at cotran.ca> wrote:
> Hi Mark,
>
> I have a 'hard' way of doing what you are asking. The easiest way is
> what Amy proposes, but if you definitely want a cylinder that can update
> quickly with changes to the endpoints...
>
> - useablePt1 and 2 are classes (Coord) with 3 variables (x, y, z) for
> coordinates. Although we implemented some convenience methods in Coord,
> you could do it all with vtkMath.
>
> - this->transform corresponds to that of the actor made from the
> cylinderSource
>
> //////////////////////////////
>
>    this->cylinderSource = vtkCylinderSource::New();
>    this->cylinderSource->SetCapping(1);
>    this->cylinderSource->SetResolution(5);
>
>    // find out halfway point
>    Coord halfwayPt(
>        (useablePt1.x() + useablePt2.x()) / 2,
>        (useablePt1.y() + useablePt2.y()) / 2,
>        (useablePt1.z() + useablePt2.z()) / 2);
>
>    double pos[4];
>    double res[4];
>
>    pos[0] = halfwayPt.x();
>    pos[1] = halfwayPt.y();
>    pos[2] = halfwayPt.z();
>    pos[3] = 1;
>
>    this->transform.getTransform()->MultiplyPoint(pos, res);
>
>    // we found the center point
>
>    Coord diff(this->pt2 - this->pt1);
>    Coord normalized(diff.normalize());
>
>    double norm = diff.norm();
>
>    this->cachedActor->SetScale(this->radius, norm, this->radius);
>
>    // get cross product
>    double cross[3];
>    double input[3];
>    double output[3];
>
>    input[0] = 0;
>    input[1] = 1;
>    input[2] = 0;
>
>    output[0] = normalized.x();
>    output[1] = normalized.y();
>    output[2] = normalized.z();
>
>    vtkMath::Cross(input, output, cross);
>
>    // get the angle
>    double angle = HelperClass::getAngle(Coord(0,1,0), Coord(), normalized);
>
>    // start with no rotation so they don't accumulate
>    this->cachedActor->SetOrientation(0,0,0);
>
>    this->cachedActor->RotateWXYZ(angle, cross[0], cross[1], cross[2]);
>
>    this->cachedActor->SetPosition(
>        res[0] / res[3],
>        res[1] / res[3],
>        res[2] / res[3]);
>
> //////////////////////////////
>
> It is quite possible that the code can be optimized (or at least made
> shorter). The only advantage to this method is that you don't have to
> remap the actor when you change one or both of the endpoints. If you
> don't care about updates, I strongly recommend the lineSource/TubeFilter
> method (it's much simpler!!!)
>
> Marc
>
>
> Mark Wyszomierski wrote:
> > Hi,
> >
> > I have two points in VTK space, is there an easy way to construct a
> > cylinder so that its two endpoints touch the two points? Something
> > like:
> >
> > cylinder->SetEndpoint1(x,y,z);
> > cylinder->SetEndpoint2(x,y,z);
> >
> > Thanks,
> > Mark
> > _______________________________________________
> > 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
>



More information about the vtkusers mailing list