[vtkusers] vtkArrowSource and vtkGlyph3D

Andrea Gavana andrea.gavana at gmail.com
Fri Dec 2 10:45:06 EST 2016


Hi Ken,

Thank you very much for your answer. I hadn't understood that vtkGlyph3D
would create all the arrows in memory.

However, it may still be the only choice I have as I would like to be able
to assign a different color (based on a scalar) to each arrow, and some
arrows should point downward while others upwards. The size of the arrow
will stay constant but the color I would like to be able to change it on an
arrow-by arrow basis, and I don't know if this can be done using
vtkGlyph3DMapper...

Of course, I would be more than happy to be proven wrong 😊.

Thank you again.

Andrea.

On Fri, 2 Dec 2016 at 16:30, Ken Martin <ken.martin at kitware.com> wrote:

> Be aware Glyph3D is a filter and will actually generate all those arrows
> in memory. Glyph3DMapper is a mapper and uses OpenGL tricks to render the
> same arrow lots of times.
>
> Both classes place a glyph at the location of each input point. The
> orientation is controlled by a different array in your point data ala the
> comments below:
>
> Thanks
> Ken
>
>   //@{
>   /**
>    * Turn on/off orienting of input geometry.
>    * When turned on, the orientation array specified
>    * using SetOrientationArray() will be used.
>    */
>   vtkSetMacro(Orient, bool);
>   vtkGetMacro(Orient, bool);
>   vtkBooleanMacro(Orient, bool);
>   //@}
>
>   //@{
>   /**
>    * Orientation mode indicates if the OrientationArray provides the
> direction
>    * vector for the orientation or the rotations around each axes. Default
> is
>    * DIRECTION
>    */
>   vtkSetClampMacro(OrientationMode, int, DIRECTION, ROTATION);
>   vtkGetMacro(OrientationMode, int);
>   void SetOrientationModeToDirection()
>     { this->SetOrientationMode(vtkGlyph3DMapper::DIRECTION); }
>   void SetOrientationModeToRotation()
>     { this->SetOrientationMode(vtkGlyph3DMapper::ROTATION); }
>   const char* GetOrientationModeAsString();
>   //@}
>
>   enum OrientationModes
>   {
>     DIRECTION=0,
>     ROTATION=1
>   };
>
>
>   /**
>    * Tells the mapper to use an orientation array if Orient is true.
>    * An orientation array is a vtkDataArray with 3 components. The first
>    * component is the angle of rotation along the X axis. The second
>    * component is the angle of rotation along the Y axis. The third
>    * component is the angle of rotation along the Z axis. Orientation is
>    * specified in X,Y,Z order but the rotations are performed in Z,X an Y.
>    * This definition is compliant with SetOrientation method on vtkProp3D.
>    * By using vector or normal there is a degree of freedom or rotation
>    * left (underconstrained). With the orientation array, there is no
> degree of
>    * freedom left.
>    * This is convenience method. The same effect can be achieved by using
>    * SetInputArrayToProcess(vtkGlyph3DMapper::ORIENTATION, 0, 0,
>    * vtkDataObject::FIELD_ASSOCIATION_POINTS, orientationarrayname);
>    */
>   void SetOrientationArray(const char* orientationarrayname);
>
>
> On Fri, Dec 2, 2016 at 10:18 AM, Andrea Gavana <andrea.gavana at gmail.com>
> wrote:
>
> Dear All,
>
>     I am trying to combine a vtkArrowSource and vtkGlyph3D. I have been
> (naively) thinking that by specifying a polydata with two points (start and
> end) and assigning its points to the vtkGlyph3D I would obtain an arrow
> that starts at the start point and end at the end point.
>
> I have created a small, self-contained following Python script to
> demonstrate what I mean - I get 4 arrows, one at each point I define,
> instead of two arrows. What am I missing? Any suggestion is more than
> welcome.
>
> Thank you in advance.
>
> Andrea.
>
>
> import vtk
> import numpy
>
> # First set of points - first arrow
> points1 = numpy.array([[ 11271.915, 7538.686, 6245.661],
>                        [ 11271.915, 7538.686, 5897.034]])
>
> # Second set of points - second arrow
> points2 = numpy.array([[ 10532.274, 9101.572, 6313.167],
>                        [ 10532.274, 9101.572, 5964.539]])
>
> # Create an arrow source with some attributes
> arrow_source = vtk.vtkArrowSource()
> arrow_source.SetTipRadius(0.2)
> arrow_source.SetShaftRadius(0.075)
>
> # Create the vtkGlyph3D
> arrow_glyph = vtk.vtkGlyph3D()
> arrow_glyph.SetScaleModeToDataScalingOff()
>
> # Usual mapper
> arrow_mapper = vtk.vtkPolyDataMapper()
> arrow_mapper.SetInputConnection(arrow_glyph.GetOutputPort())
>
> # Usual actor
> arrow_actor = vtk.vtkActor()
> arrow_actor.SetMapper(arrow_mapper)
>
> append_poly_data = vtk.vtkAppendPolyData()
>
> # Loop through points1 and points2
> for p in [points1, points2]:
>
>     arrow_poly_data = vtk.vtkPolyData()
>     vtk_arrow_lines = vtk.vtkCellArray()
>
>     vtk_arrow_lines.InsertNextCell(2)
>     vtk_arrow_lines.InsertCellPoint(0)
>     vtk_arrow_lines.InsertCellPoint(1)
>
>     vtk_arrow_points = vtk.vtkPoints()
>     # Loop through the head and tail of a single arrow
>     for j in xrange(2):
>         vtk_arrow_points.InsertNextPoint(p[j])
>
>     arrow_poly_data.SetPoints(vtk_arrow_points)
>     arrow_poly_data.SetLines(vtk_arrow_lines)
>     append_poly_data.AddInputData(arrow_poly_data)
>
>
> arrow_glyph.SetInputConnection(append_poly_data.GetOutputPort())
> arrow_glyph.SetSourceConnection(arrow_source.GetOutputPort())
> arrow_glyph.SetScaleFactor(100)
> arrow_actor.GetProperty().SetColor(1, 1, 1)
>
> # ------------------------------------------------------------
> # Create the RenderWindow, Renderer and both Actors
> # ------------------------------------------------------------
> ren = vtk.vtkRenderer()
> renWin = vtk.vtkRenderWindow()
> renWin.AddRenderer(ren)
> iren = vtk.vtkRenderWindowInteractor()
> iren.SetRenderWindow(renWin)
>
> # add actors
> ren.AddActor(arrow_actor)
> ren.ResetCamera()
> iren.Start()
>
>
>
> _______________________________________________
> 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
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>
>
>
>
> --
> Ken Martin PhD
> Chairman & CFO
> Kitware Inc.
> 28 Corporate Drive
> Clifton Park NY 12065
> 518 371 3971
>
> This communication, including all attachments, contains confidential and
> legally privileged information, and it is intended only for the use of the
> addressee.  Access to this email by anyone else is unauthorized. If you are
> not the intended recipient, any disclosure, copying, distribution or any
> action taken in reliance on it is prohibited and may be unlawful. If you
> received this communication in error please notify us immediately and
> destroy the original message.  Thank you.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20161202/24a0ab5a/attachment.html>


More information about the vtkusers mailing list