The keyFrames example

keyFrames

The KeyFrameInterpolator test example.

KeyFrameInterpolator smoothly interpolate their attached Frame over time on a path defined by Frames. The interpolation can be started/stopped/reset, played in loop, played at a different speed, etc...

In this examples, the path is defined by four ManipulatedFrame which all can be moved with the mouse. The interpolating path is updated accordingly.

The path and the interpolating axis are drawn using KeyFrameInterpolator::drawPath().

By default, the Camera holds 12 KeyFrameInterpolator, binded to the F1-12 keys. Use Alt-Fx to define a new keyFrame for path x, and simply press Fx to play/pause the path x. See the shortcuts page for details.

keyFrames.h


#include <QGLViewer/qglviewer.h>

class Viewer : public QGLViewer
{
public :
  Viewer();

protected :
  virtual void draw();
  virtual void keyPressEvent(QKeyEvent *e);
  virtual QString helpString() const;

private :
  qglviewer::ManipulatedFrame** keyFrame_;
  qglviewer::KeyFrameInterpolator kfi_;
  const int nbKeyFrames;
  int currentKF_;
};

keyFrames.cpp


#include "keyFrames.h"

using namespace qglviewer;
using namespace std;

Viewer::Viewer()
  : nbKeyFrames(4)
{
  restoreFromFile();

  // myFrame is the Frame that will be interpolated.
  Frame* myFrame = new Frame();

  // Set myFrame as the KeyFrameInterpolator interpolated Frame.
  kfi_.setFrame(myFrame);
  kfi_.setLoopInterpolation();

  // An array of manipulated (key) frames.
  keyFrame_ = new ManipulatedFrame*[nbKeyFrames];

  // Create an initial path
  for (int i=0; i<nbKeyFrames; i++)
    {
      keyFrame_[i] = new ManipulatedFrame();
      keyFrame_[i]->setPosition(-1.0 + 2.0*i/(nbKeyFrames-1), 0.0, 0.0);
      kfi_.addKeyFrame(keyFrame_[i]);
    }

  connect(&kfi_, SIGNAL(interpolated()), SLOT(updateGL()));

  kfi_.startInterpolation();

  currentKF_ = 0;
  setManipulatedFrame(keyFrame_[currentKF_]);

  // Save CAMERA binding. See setMouseStateKey() documentation.
  setMouseStateKey(QGLViewer::CAMERA, Qt::AltButton);
  setMouseStateKey(QGLViewer::FRAME,  Qt::NoButton);
  setMouseStateKey(QGLViewer::CAMERA, Qt::ControlButton);

  // Enable direct frame manipulation when the mouse hovers.
  setMouseTracking(true);

  help();
}

QString Viewer::helpString() const
{
  QString text("<h2>K e y F r a m e s</h2>");
  text += "A frame is animated using a <i>KeyFrameInterpolator</i>.<br>";
  text += "Use the left and right arrows to change the manipulated frame.<br>";
  text += "<b>+/-</b> changes the interpolation speed.<br>";
  text += "<b>Return</b> starts-stops the interpolation.<br>";
  text += "Press <b>Control</b> to move the camera.";
  return text;
}

void Viewer::keyPressEvent(QKeyEvent *e)
{
  switch (e->key())
    {
    case Qt::Key_Left :
      currentKF_ = (currentKF_+nbKeyFrames-1) % nbKeyFrames;
      setManipulatedFrame(keyFrame_[currentKF_]);
      updateGL();
      break;
    case Qt::Key_Right :
      currentKF_ = (currentKF_+1) % nbKeyFrames;
      setManipulatedFrame(keyFrame_[currentKF_]);
      updateGL();
      break;
    case Qt::Key_Return :
      if (e->state() != shortcutStateKey(FULL_SCREEN))
	kfi_.toggleInterpolation();
      else
	QGLViewer::keyPressEvent(e);
      break;
    case Qt::Key_Plus :
      kfi_.setInterpolationSpeed(kfi_.interpolationSpeed()+0.25);
      break;
    case Qt::Key_Minus :
      kfi_.setInterpolationSpeed(kfi_.interpolationSpeed()-0.25);
      break;
    // case Qt::Key_C :
      // kfi_.setClosedPath(!kfi_.closedPath());
      // break;
    default:
      QGLViewer::keyPressEvent(e);
    }
}

void Viewer::draw()
{
  glPushMatrix();
  glMultMatrixd(kfi_.frame()->matrix());
  drawAxis(0.3);
  glPopMatrix();

  kfi_.drawPath(5, 30);

  for (int i=0; i<nbKeyFrames; ++i)
    {
      glPushMatrix();
      glMultMatrixd(kfi_.keyFrame(i).matrix());
      if ((i == currentKF_) || (keyFrame_[i]->grabsMouse()))
	drawAxis(0.4);
      else
	drawAxis(0.2);
      glPopMatrix();
    }
}

main.cpp


#include "keyFrames.h"
#include <qapplication.h>

int main(int argc, char** argv)
{
  // Read command lines arguments.
  QApplication application(argc,argv);

  // Instantiate the viewer, show it on screen.
  Viewer viewer;
  viewer.show();

  // Set the viewer as the application main widget.
  application.setMainWidget(&viewer);

  // Run main loop.
  return application.exec();
}

Go back to the examples main page

Valid XHTML 1.0! Valid CSS! Last modified on Thursday, February 5, 2004.