[vtkusers] vtkArrowSource and vtkGlyph3D

Ken Martin ken.martin at kitware.com
Tue Dec 6 10:53:28 EST 2016


Well we did fix a few bounding box issues in the Glyph3dMapper about a
month ago. But, your artifacts don't look like what I would expect from
those issues. If it only happens when you zoom in a lot, that is often a
zbuffer/clipping range issue. Where the near clipping distance is too small
causing farther objects to not have enough zbuffer resolution, but that is
just a guess.



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
>>
>> 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

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/20161206/99f4a8e8/attachment.html>


More information about the vtkusers mailing list