[vtkusers] Starting an animation with a keypress, terminating with another keypress

Steve Chall stevec at renci.org
Thu Oct 29 12:37:28 EDT 2009


Dear fellow VTK enthusiasts:
I'd like to trigger an animation from a keypress event, and then stop the
animation with the same keypress event.  I've subclassed
vtkInteractorStyleTrackballCamera with an OnKeyPress() method that looks a
lot like what's included below.  When the user presses a key,
myInteractorStyleTrackballCamera::OnKeyPress() is invoked, which (for the
selected key, say 'a') toggles myObject's isAnimating Boolean flag.  If
after toggling the flag is true, I want to start an animation loop.  If
after toggling it's false, I want to stop that same loop.  But once I start
the loop I can't penetrate with another 'a' keypress (or anything else other
than a <Ctrl-C>) to change the flag back to false and thus stop the loop.
How can I interrupt the "while (isAnimating)" loop once it starts?

(I've also subclassed vtkRenderWindowInteractor because its Start() function
seems like a place for interrupts, but I don't know what to do with it.)

Thanks for any help you may be able to provide.

-Steve Chall
 Senior Research Software Developer
 Renaissance Computing Institute
 Phone: 919-515-0051
 Email: stevec at renci.org

// Pseudo C++ source code segments follow:

...
myClass::Animate()
{
  while (isAnimating)
  {
    this->RenderNextFrame();
  }
}
...

myClass *myObject = new myClass;

... 
void myInteractorStyleTrackballCamera::OnKeyPress()
{
  switch (this->Interactor->GetKeyCode())
  {
    case 'a':
    case 'A':
      if (myObject)
      {
        myObject->isAnimating = !(myObject->isAnimating);

        if (myObject->isAnimating)
        {
          myObject->Animate();
        }
/* This is sort of what I'd like to do:
        else
        {
          myObject->StopAnimating();
        }
      }
*/
      break;

    default:
      break;
  }

  vtkInteractorStyleTrackballCamera::OnKeyPress();
}







More information about the vtkusers mailing list