[vtkusers] Rendering performance

David Gobbi david.gobbi at gmail.com
Wed Nov 24 19:45:07 EST 2010


The same input polydata that controls the positions of the glyphs can also
control the color, size, and orientation of each glyph.  This is done by
calling input->GetPointData()->AddArray(...) to add scalar arrays that
control the parameters.  Look at the documentation for vtkGlyph3D for more
info.

  David

On Wed, Nov 24, 2010 at 5:37 PM, Gib Bogle <g.bogle at auckland.ac.nz> wrote:

> There is just one limitation (as far as I can see).  One can't specify the
> glyph colours individually.  My spheres change colour as the state evolves.
>  I'd like to be able to control the square colours individually too, but
> that's less important.
>
> Cheers
> Gib
>
>
> On 25/11/2010 12:55 p.m., David Gobbi wrote:
>
>> Hi Gib,
>>
>> Glad to hear the good news.  I'm sure that you've also figured out that
>> you can
>> use glyphs for your spheres.
>>
>> Changing the number of glyphs is possible, but a bit tricky.  You have to
>> re-initialize the input polydata when changing the number of points or
>> cells.
>>  So going back to my example code, you would do something like this:
>>
>> input->Initialize();
>> input->SetPoints(new_points);
>> input->SetVerts(new_verts);
>>
>> Generally you will have to re-build the points and the verts arrays from
>> scratch
>> if you want to remove elements.   You can call Initialize() on the arrays
>> to
>> clear them before rebuilding them.  The VTK arrays don't have an erase()
>> method
>> like C++ vectors do.
>>
>>   David
>>
>>
>> On Wed, Nov 24, 2010 at 4:34 PM, Gib Bogle <g.bogle at auckland.ac.nz
>> <mailto:g.bogle at auckland.ac.nz>> wrote:
>>
>>    Great success!!  The glyphs render so fast that the extra time is
>>    negligible. Thanks again.  It isn't needed for this application, but
>> for
>>    future reference: is it possible to change the glypher input on the
>> fly,
>>    i.e. the number of cells?
>>
>>    Hi Fred, are you still interested in seeing the code that runs slowly?
>>
>>
>>    Gib
>>
>>    On 25/11/2010 9:20 a.m., David Gobbi wrote:
>>
>>        Hi Gib,
>>
>>        Even though a programmable source like that wiki example is
>> probably the
>>        "cleanest" way to do things, there is a simpler way to build a
>> dataset for
>>        vtkGlyph3D.
>>
>>        The vtkGlyph3D filter needs two inputs: one input for the positions
>> of each
>>        glyph (i.e. one point per glyph) and another input for the glyph
>> shape
>>        (i.e. the
>>        square that you already made).
>>
>>        The first input is just a list of points, you can build it as a
>> polydata
>>        just
>>        like you did with the squares, except that you want to use "verts"
>> as
>>        your cells:
>>
>>        vtkSmartPointer<vtkPoints> positions =
>> vtkSmartPointer<vtkPoints>::New();
>>        vtkSmartPointer<vtkCellArray> dummycells =
>>        vtkSmartPointer<vtkCellArray>::New();
>>        positions->SetNumberOfPoints(npos); // number of squares
>>        dummycells->InsertNextCell(npos); // size of dummy "verts" array
>>        for (int ipos = 0; ipos < npos; ipos++)
>>           {
>>           positions->SetPoint(ipos, x, y, z);  // square positions set
>> here
>>           dummycells->InsertCellPoint(ipos);
>>           }
>>
>>        vtkSmartPointer<vtkPolyData> input =
>> vtkSmartPointer<vtkPolyData>::New();
>>        input->SetPoints(positions);
>>        input->SetVerts(dummycells);
>>
>>        vtkSmartPointer<vtkGlyph3D> glypher =
>> vtkSmartPointer<vtkGlyph3D>::New();
>>        glypher->SetInput(input);
>>        glypher->SetSource(polygonPolyData);
>>
>>        Then feed the output of the glypher into the mapper, and it will
>>        automatically
>>        draw a square at each position.  To change the positions, you would
>> do this:
>>
>>        positions->SetPoint(idx, x, y, z); // set point idx to (x,y,z)
>>        glypher->Modified(); // tell glypher that the data has changed
>>
>>        Then re-render, and the squares will be at their new positions.  I
>> have not
>>        tested the code above, but I've done similar things in the past.
>>
>>           David
>>
>>        On Wed, Nov 24, 2010 at 12:52 PM, Gib Bogle <
>> g.bogle at auckland.ac.nz
>>        <mailto:g.bogle at auckland.ac.nz>
>>        <mailto:g.bogle at auckland.ac.nz <mailto:g.bogle at auckland.ac.nz>>>
>> wrote:
>>
>>            Seb, if this is what you are referring to:
>>        http://www.itk.org/Wiki/VTK/Java_Code_Samples
>>            it might require skills a bit beyond my rather primitive level
>> of
>>        C++ expertise.
>>
>>
>>            Gib
>>
>>            Quoting Sebastien Jourdain <sebastien.jourdain at kitware.com
>>        <mailto:sebastien.jourdain at kitware.com>
>>        <mailto:sebastien.jourdain at kitware.com
>>        <mailto:sebastien.jourdain at kitware.com>>>:
>>
>>
>>                You can use a single actor, you will need to have a
>> programable
>>        source
>>                that update the output dataset that has the location of
>> each
>>        center of
>>                the square.
>>
>>                Pipeline: Actor(Mapper(Glyph(CustomSource, Square)))
>>
>>                To change the position of a square, you can have something
>> like
>>        that...
>>
>>                customSource.SetSquarePosition( suquareId, xyz )
>>
>>                Seb
>>
>>                PS: I think I wrote a sample code in Java for programmable
>>        source on the
>>                wiki...
>>
>>
>>                On Wed, Nov 24, 2010 at 1:41 PM, Gib  Bogle
>>        <g.bogle at auckland.ac.nz <mailto:g.bogle at auckland.ac.nz>
>>        <mailto:g.bogle at auckland.ac.nz <mailto:g.bogle at auckland.ac.nz>>>
>> wrote:
>>
>>                    Hi Seb,
>>
>>                    Although I referred to a simplified case in which the
>>        squares don't
>>                    change,
>>                    in general I need to allow for their movement.
>>  Therefore I
>>        don't
>>                    think it
>>                    will be possible for me to use a single actor.  If I'm
>>        wrong, could you
>>                    please provide a bit more  detail?
>>
>>                    Thanks
>>                    Gib
>>
>>                    Quoting Sebastien Jourdain <
>> sebastien.jourdain at kitware.com
>>        <mailto:sebastien.jourdain at kitware.com>
>>        <mailto:sebastien.jourdain at kitware.com
>>        <mailto:sebastien.jourdain at kitware.com>>>:
>>
>>
>>                        Hi Gib,
>>
>>                        My first question will be. Are you using one actor
>> for
>>        each of your
>>                        10000 flat squares ?
>>                        If so, the performance limitation may come from the
>>        number of actors
>>                        involved. One solution to that is to create only
>> one dataset
>>                        with all
>>                        the squares that has only one mapper and actor. To
>> do
>>        so, you can
>>                        build it by hand or simply use the Glyph filter
>> with
>>        your square
>>                        as a
>>                        glyph and another dataset that has the location of
>> those
>>        squares.
>>
>>                        Seb
>>
>>
>>                        On Wed, Nov 24, 2010 at 12:44 AM, Gib Bogle
>>        <g.bogle at auckland.ac.nz <mailto:g.bogle at auckland.ac.nz>
>>        <mailto:g.bogle at auckland.ac.nz <mailto:g.bogle at auckland.ac.nz>>>
>>
>>
>>                        wrote:
>>
>>
>>                            I asked about this before, but didn't attract
>> any
>>        responses.
>>                              I have a
>>                            better understanding of the issue now, so
>> perhaps my
>>                            questions will make
>>                            more sense.
>>
>>                            At regular intervals as my simulation program
>>        executes, I am
>>                            rendering a
>>                            scene that contains mainly about 1000 small
>> spheres
>>        (which
>>                            move) and
>>                            about
>>                            10000 flat squares (which do not move).  I have
>>        discovered
>>                            that the
>>                            surprising slowness of the the rendering is
>> caused
>>        by the
>>                            squares, even
>>                            though the spheres have ThetaResolution and
>>        PhiResolution
>>                            both equal to
>>                            12,
>>                            which I guess means 144 faces per sphere, i.e.
>> a
>>        total of
>>                            144,000 faces.
>>                              By
>>                            my calculations rendering the scene 288 times
>> with
>>        spheres
>>                            alone takes
>>                            about
>>                            4 sec, with the squares alone takes about 20
>> sec,
>>        and with
>>                            both spheres
>>                            and
>>                            squares about 24 sec.  That is, 10,000 squares
>> take
>>        5 times
>>                            as long as
>>                            1000
>>                            spheres with 144,000 faces.
>>
>>                            Apparently there's something very inefficient
>> about
>>        the way I am
>>                            rendering
>>                            the squares.  Here is the code for tileMapper
>> (which
>>        makes
>>                            squares):
>>
>>                            // Create the square
>>                            // Setup points to draw a unit square in the XY
>>        plane, at y=0
>>                            vtkSmartPointer<vtkPoints> points =
>>                            vtkSmartPointer<vtkPoints>::New();
>>                            vtkSmartPointer<vtkCellArray> vertices =
>>                            vtkSmartPointer<vtkCellArray>::New();
>>                            points->InsertNextPoint(-0.5, 0.0, -0.5);
>>                            points->InsertNextPoint( 0.5, 0.0, -0.5);
>>                            points->InsertNextPoint( 0.5, 0.0,  0.5);
>>                            points->InsertNextPoint(-0.5, 0.0,  0.5);
>>
>>                            vtkSmartPointer<vtkPolygon> polygon =
>>                            vtkSmartPointer<vtkPolygon>::New();
>>                            polygon->GetPointIds()->SetNumberOfIds(4);
>> //make a quad
>>                            polygon->GetPointIds()->SetId(0, 0);
>>                            polygon->GetPointIds()->SetId(1, 1);
>>                            polygon->GetPointIds()->SetId(2, 2);
>>                            polygon->GetPointIds()->SetId(3, 3);
>>
>>                            //Add the polygon to a list of polygons
>>                            vtkSmartPointer<vtkCellArray> polygons =
>>                            vtkSmartPointer<vtkCellArray>::New();
>>                            polygons->InsertNextCell(polygon);
>>
>>                            //Create a PolyData
>>                            vtkSmartPointer<vtkPolyData> polygonPolyData =
>>                            vtkSmartPointer<vtkPolyData>::New();
>>                            polygonPolyData->SetPoints(points);
>>                            polygonPolyData->SetPolys(polygons);
>>
>>                            //Create a mapper and actor
>>                            tileMapper = vtkPolyDataMapper::New();
>>                            tileMapper->SetInput(polygonPolyData);
>>                            tileMapper->ScalarVisibilityOff();
>>
>>                            The square actors are made like this:
>>
>>                            actor = vtkActor::New();
>>                            actor->SetMapper(tileMapper);
>>                            actor->GetProperty()->SetColor(boneColor);
>>                            actor->GetProperty()->SetAmbient(0.5);
>>                            actor->GetProperty()->SetDiffuse(0.2);
>>                            actor->GetProperty()->SetSpecular(0.5);
>>                            actor->SetPosition(pos);
>>                            ren->AddActor(actor);
>>
>>                            then not touched again (in the simulations I
>> report
>>        times for.)
>>
>>                            I'd be very grateful if someone could give me a
>> clue
>>        as to
>>                            what I'm doing
>>                            wrong to make the rendering so slow.
>>
>>                            Thanks
>>                            Gib
>>                            _______________________________________________
>>                            Powered by www.kitware.com <
>> http://www.kitware.com>
>>        <http://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
>>
>>                            Follow this link to subscribe/unsubscribe:
>>        http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>
>>
>>
>>
>>  ----------------------------------------------------------------
>>                    This message was sent using IMP, the Internet Messaging
>> Program.
>>                    _______________________________________________
>>                    Powered by www.kitware.com <http://www.kitware.com>
>>        <http://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
>>
>>                    Follow this link to subscribe/unsubscribe:
>>        http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>
>>
>>
>>
>>  ----------------------------------------------------------------
>>            This message was sent using IMP, the Internet Messaging
>> Program.
>>            _______________________________________________
>>            Powered by www.kitware.com <http://www.kitware.com>
>>        <http://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
>>
>>            Follow this link to subscribe/unsubscribe:
>>        http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>    _______________________________________________
>>    Powered by www.kitware.com <http://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
>>
>>    Follow this link to subscribe/unsubscribe:
>>    http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>  _______________________________________________
> 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
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20101124/fd5bcc40/attachment.htm>


More information about the vtkusers mailing list