From Jan Klimke, "I did recently some work understanding the osgAnimation classes. Here the osganimationsolid example seems not to be very helpful at the moment. There are basically no comments in it and additionally there is a second animation defined which was simply not working (wrong channel type for angle animation). I added some comments and fixed the example to contain 2 working animations by now. I think this could help others who are trying to understand the osgAnimation plugin.

"
This commit is contained in:
Robert Osfield
2010-11-04 15:24:00 +00:00
parent f7b33de6fc
commit 286d4bceaa

View File

@@ -24,6 +24,7 @@
#include <osgAnimation/Channel>
#include <osgAnimation/UpdateMatrixTransform>
#include <osgAnimation/StackedTranslateElement>
#include <osgAnimation/StackedRotateAxisElement>
using namespace osgAnimation;
@@ -72,13 +73,24 @@ int main (int argc, char* argv[])
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f,0.0f,0.0f),0.5)));
//Tranformation to be manipulated by the animation
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform();
trans->setName("AnimatedNode");
//Dynamic object, has to be updated during update traversal
trans->setDataVariance(osg::Object::DYNAMIC);
//Animation callback for Matrix transforms, name is targetName for Channels
osgAnimation::UpdateMatrixTransform* updatecb = new osgAnimation::UpdateMatrixTransform("AnimatedCallback");
//add manipulator Stack, names must match with channel names
//elements are applied in LIFO order
//The first element modifies the position component of the matrix
//The second element modifies the rotation around x-axis
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("position"));
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("euler",osg::Vec3(1,0,0),0));
//connect the UpdateMatrixTransform callback to the MatrixTRanform
trans->setUpdateCallback(updatecb);
//initialize MatrixTranform
trans->setMatrix(osg::Matrix::identity());
//append geometry node
trans->addChild (geode.get());
root->addChild (axe.get());
@@ -86,27 +98,35 @@ int main (int argc, char* argv[])
// Define a scheduler for our animations
osg::Group* grp = new osg::Group;
//add the animation manager to the scene graph to get it called during update traversals
osgAnimation::BasicAnimationManager* mng = new osgAnimation::BasicAnimationManager();
grp->setUpdateCallback(mng);
//add the rest of the scene to the grp node
grp->addChild(root);
// And we finaly define our channel
// And we finaly define our channel for linear Vector interpolation
osgAnimation::Vec3LinearChannel* channelAnimation1 = new osgAnimation::Vec3LinearChannel;
//name of the AnimationUpdateCallback
channelAnimation1->setTargetName("AnimatedCallback");
//name of the StackedElementTransform for position modification
channelAnimation1->setName("position");
//Create keyframes for (in this case linear) interpolation of a osg::Vec3
channelAnimation1->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::Vec3Keyframe(0, osg::Vec3(0,0,0)));
channelAnimation1->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::Vec3Keyframe(2, osg::Vec3(1,1,0)));
osgAnimation::Animation* anim1 = new osgAnimation::Animation;
anim1->addChannel(channelAnimation1);
anim1->addChannel(channelAnimation1);
anim1->setPlayMode(osgAnimation::Animation::PPONG);
osgAnimation::Vec3LinearChannel* channelAnimation2 = new osgAnimation::Vec3LinearChannel;
//define the channel for interpolation of a float angle value
osgAnimation::FloatLinearChannel* channelAnimation2 = new osgAnimation::FloatLinearChannel;
//name of the AnimationUpdateCallback
channelAnimation2->setTargetName("AnimatedCallback");
//name of the StackedElementTransform for position modification
channelAnimation2->setName("euler");
channelAnimation2->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::Vec3Keyframe(0, osg::Vec3(0,0,0)));
channelAnimation2->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::Vec3Keyframe(1.5, osg::Vec3(2*osg::PI,0,0)));
//Create keyframes for (in this case linear) interpolation of a osg::Vec3
channelAnimation2->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(0, 0));
channelAnimation2->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(1.5, 2*osg::PI));
osgAnimation::Animation* anim2 = new osgAnimation::Animation;
anim2->addChannel(channelAnimation2);
anim2->setPlayMode(osgAnimation::Animation::LOOP);
@@ -115,10 +135,12 @@ int main (int argc, char* argv[])
// We register all animation inside the scheduler
mng->registerAnimation(anim1);
mng->registerAnimation(anim2);
//start the animation
mng->playAnimation(anim1);
mng->playAnimation(anim2);
//set the grp-Group with the scene and the AnimationManager as viewer's scene data
viewer.setSceneData( grp );
return viewer.run();
}