From 286d4bceaacc35f665f94e6b3f116cbdc413ff0b Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 4 Nov 2010 15:24:00 +0000 Subject: [PATCH] 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. " --- .../osganimationsolid/osganimationsolid.cpp | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/examples/osganimationsolid/osganimationsolid.cpp b/examples/osganimationsolid/osganimationsolid.cpp index 255767522..13d29ad60 100644 --- a/examples/osganimationsolid/osganimationsolid.cpp +++ b/examples/osganimationsolid/osganimationsolid.cpp @@ -24,6 +24,7 @@ #include #include #include +#include using namespace osgAnimation; @@ -72,13 +73,24 @@ int main (int argc, char* argv[]) osg::ref_ptr 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 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(); }