[vtkusers] vtkArrowSource and vtkGlyph3D
Ken Martin
ken.martin at kitware.com
Fri Dec 2 10:52:37 EST 2016
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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20161202/1c7c7117/attachment.html>
More information about the vtkusers
mailing list