I would define an Animation class, which can implement the following animations:
- Rotation/translation/scale animation
- Key frame animation
- Skinning animation
Of course, one of the animation techniques listed above need some generic access to the Object class.
RotoTranslation animation requires access to the Object model view matrix; KeyFrame animation requires access to the model vertices buffers; Skinning animation requires access to the rendering state of the Object (shader attributes and programs, or vertex attributes using extensions).
Apart skinning, the interpolation of generic values (floats, vector or matrices) shall be implemented, in order to change the values using an interpolation formula (nice those linked by genpfault). So an Interpolator class shall be able to ease the introduction of new interpolation equations.
An Animation class uses a set of Interpolator instances to execute the animation (changing the values to be interpolated). How the values are choosed, accessed and modified (ranges) shall be defined at Object class.
At this point there must be a TimeLine class which defines the time elapsed (which could not be the real one), which trigger Animation instances (or perhaps the single Interpolator instances) making the interpolated values advance the intermediate value.
The Animation instances are queued on the TimeLine class, so it knows which Animation instances are active. The activation could be caused by user input or programmatically using internally generated events. To terminate the Animation execution, the Animation class could define a IsTerminated method is order to be dequeued from the TimeLine instance (perhaps the Animation could loop back the animation to have a continuous animation).
Of course everything depending on your real needs.
In the case the computation of the animation could take long time, you could cache the entire model data and run the animation in a separated thread. Once terminated, the model could be updated blocking the rendering loop.
However, I would consider to inline the animation processing by issuing proper data to shader programs allowing a faster computation, which could enhances system performances.