[vtkusers] vtkArrowSource and vtkGlyph3D

Bill Lorensen bill.lorensen at gmail.com
Tue Dec 6 12:11:46 EST 2016


Your Get usage uncovered a bug in vtkGlyph3DMapper. I submoiteed a patch
here:
https://gitlab.kitware.com/vtk/vtk/merge_requests/2232


On Tue, Dec 6, 2016 at 10:35 AM, Andrea Gavana <andrea.gavana at gmail.com>
wrote:

> Hi Ken & All,
>
>     thank you for your suggestions, vtkGlyph3DMapper worked beautifully in
> the end. I have only a couple of issues (which may or may not related to
> the VTK version I am using and the fact that I am using VTK through the
> Python bindings):
>
> 1. If I zoom in and out (with the mouse) in the render window I can see
> visual glitches for the spheres I am using (that's another
> vtkGlyph3DMapper, unrelated to the arrow ones) - see attached screenshot
>
> 2. If I do the following:
>
> >>> import vtk
> >>> vtk.vtkVersion().GetVTKVersion()
> '7.0.0'
> >>> g = vtk.vtkGlyph3DMapper()
> >>> g.SetOrientationModeToRotation()
> >>> g.GetOrientationModeAsString()
> 'Invalid'
> >>> g.SetOrientationMode(vtk.vtkGlyph3DMapper.ORIENTATION)
> >>> g.GetOrientationModeAsString()
> 'Invalid'
> >>> g.SetOrientationModeToDirection()
> >>> g.GetOrientationModeAsString()
> 'Direction'
>
>
> Notice the "Invalid" string printed out when I try to set the orientation
> mode to "ORIENTATION".
>
> Not a big deal, I can use the DIRECTION thing as well, I just wanted to
> let you know...
>
> Andrea.
>
>
>
> On 2 December 2016 at 16:52, Ken Martin <ken.martin at kitware.com> wrote:
>
>> It can color/scale/orient/mask on a per glyph basis. It can even index
>> into multiple glyph models on a per point basis. So you should be good.
>> Just takes a while to wade through all the options as there is a lot in
>> there.
>>
>> Thanks
>> Ken
>>
>> On Fri, Dec 2, 2016 at 10:45 AM, Andrea Gavana <andrea.gavana at gmail.com>
>> wrote:
>>
>>> 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.
>>>>
>>>
>>
>>
>> --
>> Ken Martin PhD
>> Chairman & CFO
>> Kitware Inc.
>> 28 Corporate Drive
>> Clifton Park NY 12065
>> 518 371 3971 <(518)%20371-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.
>>
>
>
> _______________________________________________
> 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
>
>


-- 
Unpaid intern in BillsBasement at noware dot com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20161206/730cf71e/attachment.html>


More information about the vtkusers mailing list