2013-06-27 17:59:33 +08:00
|
|
|
/* -*-c++-*-
|
2010-01-27 20:24:55 +08:00
|
|
|
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
|
2008-11-22 20:14:19 +08:00
|
|
|
*
|
2013-06-27 17:59:33 +08:00
|
|
|
* This library is open source and may be redistributed and/or modified under
|
|
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
2008-11-22 20:14:19 +08:00
|
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
|
|
* included with this distribution, and on the openscenegraph.org website.
|
2013-06-27 17:59:33 +08:00
|
|
|
*
|
2008-11-22 20:14:19 +08:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2013-06-27 17:59:33 +08:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2008-11-22 20:14:19 +08:00
|
|
|
* OpenSceneGraph Public License for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <osg/Geometry>
|
|
|
|
#include <osg/Shape>
|
|
|
|
#include <osg/ShapeDrawable>
|
|
|
|
#include <osgViewer/Viewer>
|
|
|
|
#include <osgGA/TrackballManipulator>
|
|
|
|
#include <osg/MatrixTransform>
|
|
|
|
|
2008-12-17 04:29:00 +08:00
|
|
|
#include <osgAnimation/BasicAnimationManager>
|
2008-11-22 20:14:19 +08:00
|
|
|
#include <osgAnimation/Channel>
|
2010-01-27 20:24:55 +08:00
|
|
|
#include <osgAnimation/UpdateMatrixTransform>
|
|
|
|
#include <osgAnimation/StackedTranslateElement>
|
2010-11-04 23:24:00 +08:00
|
|
|
#include <osgAnimation/StackedRotateAxisElement>
|
2008-11-22 20:14:19 +08:00
|
|
|
|
|
|
|
using namespace osgAnimation;
|
|
|
|
|
|
|
|
osg::ref_ptr<osg::Geode> createAxis()
|
|
|
|
{
|
2013-06-27 17:59:33 +08:00
|
|
|
osg::ref_ptr<osg::Geode> geode (new osg::Geode());
|
2008-11-22 20:14:19 +08:00
|
|
|
osg::ref_ptr<osg::Geometry> geometry (new osg::Geometry());
|
|
|
|
|
|
|
|
osg::ref_ptr<osg::Vec3Array> vertices (new osg::Vec3Array());
|
|
|
|
vertices->push_back (osg::Vec3 ( 0.0, 0.0, 0.0));
|
|
|
|
vertices->push_back (osg::Vec3 ( 10.0, 0.0, 0.0));
|
|
|
|
vertices->push_back (osg::Vec3 ( 0.0, 0.0, 0.0));
|
|
|
|
vertices->push_back (osg::Vec3 ( 0.0, 10.0, 0.0));
|
|
|
|
vertices->push_back (osg::Vec3 ( 0.0, 0.0, 0.0));
|
|
|
|
vertices->push_back (osg::Vec3 ( 0.0, 0.0, 10.0));
|
|
|
|
geometry->setVertexArray (vertices.get());
|
|
|
|
|
|
|
|
osg::ref_ptr<osg::Vec4Array> colors (new osg::Vec4Array());
|
|
|
|
colors->push_back (osg::Vec4 (1.0f, 0.0f, 0.0f, 1.0f));
|
|
|
|
colors->push_back (osg::Vec4 (1.0f, 0.0f, 0.0f, 1.0f));
|
|
|
|
colors->push_back (osg::Vec4 (0.0f, 1.0f, 0.0f, 1.0f));
|
|
|
|
colors->push_back (osg::Vec4 (0.0f, 1.0f, 0.0f, 1.0f));
|
|
|
|
colors->push_back (osg::Vec4 (0.0f, 0.0f, 1.0f, 1.0f));
|
|
|
|
colors->push_back (osg::Vec4 (0.0f, 0.0f, 1.0f, 1.0f));
|
2013-06-27 17:59:33 +08:00
|
|
|
geometry->setColorArray (colors.get(), osg::Array::BIND_PER_VERTEX);
|
2008-11-22 20:14:19 +08:00
|
|
|
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,6));
|
|
|
|
|
|
|
|
geode->addDrawable( geometry.get() );
|
|
|
|
geode->getOrCreateStateSet()->setMode(GL_LIGHTING, false);
|
|
|
|
return geode;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main (int argc, char* argv[])
|
|
|
|
{
|
2009-01-07 19:24:47 +08:00
|
|
|
osg::ArgumentParser arguments(&argc, argv);
|
|
|
|
osgViewer::Viewer viewer(arguments);
|
|
|
|
|
2008-11-22 20:14:19 +08:00
|
|
|
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
|
|
|
|
|
|
|
|
osg::Group* root = new osg::Group;
|
|
|
|
|
|
|
|
osg::ref_ptr<osg::Geode> axe = createAxis();
|
|
|
|
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)));
|
|
|
|
|
2015-04-13 18:43:56 +08:00
|
|
|
//Transformation to be manipulated by the animation
|
2008-11-22 20:14:19 +08:00
|
|
|
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform();
|
|
|
|
trans->setName("AnimatedNode");
|
2010-11-04 23:24:00 +08:00
|
|
|
//Dynamic object, has to be updated during update traversal
|
2008-11-22 20:14:19 +08:00
|
|
|
trans->setDataVariance(osg::Object::DYNAMIC);
|
2010-11-04 23:24:00 +08:00
|
|
|
//Animation callback for Matrix transforms, name is targetName for Channels
|
2010-01-27 20:24:55 +08:00
|
|
|
osgAnimation::UpdateMatrixTransform* updatecb = new osgAnimation::UpdateMatrixTransform("AnimatedCallback");
|
2010-11-04 23:24:00 +08:00
|
|
|
//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
|
2010-01-27 20:24:55 +08:00
|
|
|
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("position"));
|
2010-11-04 23:24:00 +08:00
|
|
|
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("euler",osg::Vec3(1,0,0),0));
|
2015-04-13 18:43:56 +08:00
|
|
|
//connect the UpdateMatrixTransform callback to the MatrixTransform
|
2010-01-27 20:24:55 +08:00
|
|
|
trans->setUpdateCallback(updatecb);
|
2010-11-04 23:24:00 +08:00
|
|
|
//initialize MatrixTranform
|
2008-11-22 20:14:19 +08:00
|
|
|
trans->setMatrix(osg::Matrix::identity());
|
2010-11-04 23:24:00 +08:00
|
|
|
//append geometry node
|
2008-11-22 20:14:19 +08:00
|
|
|
trans->addChild (geode.get());
|
|
|
|
|
|
|
|
root->addChild (axe.get());
|
|
|
|
root->addChild (trans.get());
|
|
|
|
|
|
|
|
// Define a scheduler for our animations
|
2008-12-17 04:29:00 +08:00
|
|
|
osg::Group* grp = new osg::Group;
|
2010-11-04 23:24:00 +08:00
|
|
|
//add the animation manager to the scene graph to get it called during update traversals
|
2008-12-17 04:29:00 +08:00
|
|
|
osgAnimation::BasicAnimationManager* mng = new osgAnimation::BasicAnimationManager();
|
|
|
|
grp->setUpdateCallback(mng);
|
2010-11-04 23:24:00 +08:00
|
|
|
//add the rest of the scene to the grp node
|
2008-12-17 04:29:00 +08:00
|
|
|
grp->addChild(root);
|
2008-11-22 20:14:19 +08:00
|
|
|
|
2015-04-13 18:43:56 +08:00
|
|
|
// And we finally define our channel for linear Vector interpolation
|
2008-11-22 20:14:19 +08:00
|
|
|
osgAnimation::Vec3LinearChannel* channelAnimation1 = new osgAnimation::Vec3LinearChannel;
|
2010-11-04 23:24:00 +08:00
|
|
|
//name of the AnimationUpdateCallback
|
2008-11-22 20:14:19 +08:00
|
|
|
channelAnimation1->setTargetName("AnimatedCallback");
|
2010-11-04 23:24:00 +08:00
|
|
|
//name of the StackedElementTransform for position modification
|
2008-11-22 20:14:19 +08:00
|
|
|
channelAnimation1->setName("position");
|
2010-11-04 23:24:00 +08:00
|
|
|
//Create keyframes for (in this case linear) interpolation of a osg::Vec3
|
2008-11-22 20:14:19 +08:00
|
|
|
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;
|
2013-06-27 17:59:33 +08:00
|
|
|
anim1->addChannel(channelAnimation1);
|
From Wang Rui, "Attached is the osgAnimation wrappers for serialize IO operations. A
few headers and the osgAnimation sources are also modified to make
everything goes well, including:
A new REGISTER_OBJECT_WRAPPER2 macro to wrap classes like
Skeleton::UpdateSkeleton.
A bug fix in the Seralizer header which avoids setting default values
to objects.
Naming style fixes in osgAnimation headers and sources, also in the
deprecated dotosg wrappers.
A bug fix for the XML support, to write char values correctly.
A small change in the osg::Geometry wrapper to ignore the
InternalGeometry property, which is used by the MorphGeometry and
should not be set by user applications.
The avatar.osg, nathan.osg and robot.osg data files all work fine with
serializers, with some 'unsupported wrapper' warnings when converting.
I'm thinking of removing these warnings by disabling related property
serializers (ComputeBoundingBoxCallback and Drawable::UpdateCallback),
which are seldom recorded by users.
By the way, I still wonder how would we handle the C4121 problem,
discussed some days before. The /Zp compile option is set to 16 in the
attached cmake script file. And is there a better solution now?"
2010-04-19 18:35:18 +08:00
|
|
|
anim1->setPlayMode(osgAnimation::Animation::PPONG);
|
2008-11-22 20:14:19 +08:00
|
|
|
|
|
|
|
|
2010-11-04 23:24:00 +08:00
|
|
|
//define the channel for interpolation of a float angle value
|
|
|
|
osgAnimation::FloatLinearChannel* channelAnimation2 = new osgAnimation::FloatLinearChannel;
|
|
|
|
//name of the AnimationUpdateCallback
|
2008-11-22 20:14:19 +08:00
|
|
|
channelAnimation2->setTargetName("AnimatedCallback");
|
2010-11-04 23:24:00 +08:00
|
|
|
//name of the StackedElementTransform for position modification
|
2008-11-22 20:14:19 +08:00
|
|
|
channelAnimation2->setName("euler");
|
2010-11-04 23:24:00 +08:00
|
|
|
//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));
|
2008-11-22 20:14:19 +08:00
|
|
|
osgAnimation::Animation* anim2 = new osgAnimation::Animation;
|
|
|
|
anim2->addChannel(channelAnimation2);
|
From Wang Rui, "Attached is the osgAnimation wrappers for serialize IO operations. A
few headers and the osgAnimation sources are also modified to make
everything goes well, including:
A new REGISTER_OBJECT_WRAPPER2 macro to wrap classes like
Skeleton::UpdateSkeleton.
A bug fix in the Seralizer header which avoids setting default values
to objects.
Naming style fixes in osgAnimation headers and sources, also in the
deprecated dotosg wrappers.
A bug fix for the XML support, to write char values correctly.
A small change in the osg::Geometry wrapper to ignore the
InternalGeometry property, which is used by the MorphGeometry and
should not be set by user applications.
The avatar.osg, nathan.osg and robot.osg data files all work fine with
serializers, with some 'unsupported wrapper' warnings when converting.
I'm thinking of removing these warnings by disabling related property
serializers (ComputeBoundingBoxCallback and Drawable::UpdateCallback),
which are seldom recorded by users.
By the way, I still wonder how would we handle the C4121 problem,
discussed some days before. The /Zp compile option is set to 16 in the
attached cmake script file. And is there a better solution now?"
2010-04-19 18:35:18 +08:00
|
|
|
anim2->setPlayMode(osgAnimation::Animation::LOOP);
|
2013-06-27 17:59:33 +08:00
|
|
|
|
2008-11-22 20:14:19 +08:00
|
|
|
|
|
|
|
// We register all animation inside the scheduler
|
|
|
|
mng->registerAnimation(anim1);
|
|
|
|
mng->registerAnimation(anim2);
|
2013-06-27 17:59:33 +08:00
|
|
|
|
2010-11-04 23:24:00 +08:00
|
|
|
//start the animation
|
2008-11-22 20:14:19 +08:00
|
|
|
mng->playAnimation(anim1);
|
|
|
|
mng->playAnimation(anim2);
|
|
|
|
|
2010-11-04 23:24:00 +08:00
|
|
|
//set the grp-Group with the scene and the AnimationManager as viewer's scene data
|
2008-12-17 04:29:00 +08:00
|
|
|
viewer.setSceneData( grp );
|
2008-11-22 20:14:19 +08:00
|
|
|
return viewer.run();
|
|
|
|
}
|