Home | Documentation | Download | Screenshots | Developer |
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.
#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_; };
#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(); } }
#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