Hi,
Thank you for your reply.
I have attached a sample of code, that presents how I create my
animation.
Cheers,
Bao-Anh.
--8<---------------cut here---------------start------------->8---
// The Callback that refreshes the animation and creates frames.
class codaNodeCallback : public osg::NodeCallback
{
public:
codaNodeCallback(unsigned id, osgAnimation::Vec3KeyframeContainer* key)
: id_(id), key_(key), frame_nb_(0)
{}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
osg::ref_ptr<osg::Geode> codaData = node->asGeode();
if (codaData)
{
osg::Vec3 position(getPositionX(id_),
getPositionY(id_),
getPositionZ(id_));
// Add a frame to the animation.
key_->push_back(osgAnimation::Vec3Keyframe(++frame_nb_, position));
// Also display the Sphere in real-time. We got the expected behavior.
osg::Sphere* s = new osg::Sphere(position, RAYON);
codaData->replaceDrawable(codaData->getDrawable(0),
new osg::ShapeDrawable(s));
}
traverse(node, nv);
}
private:
unsigned id_;
osgAnimation::Vec3KeyframeContainer* key_;
unsigned frame_nb_;
};
// The creation of the animation.
osg::ref_ptr<osgAnimation::Skeleton> skelroot = new osgAnimation::Skeleton;
skelroot->setDefaultUpdateCallback();
// The bone that follows some positions.
osg::ref_ptr<osgAnimation::Bone> bone = new osgAnimation::Bone;
bone->setBindMatrixInBoneSpace(osg::Matrix::translate(1,0,0));
bone->setName("a bone");
bone->setDefaultUpdateCallback("a bone");
skelroot->addChild(bone.get());
osg::Node* sphereNode = createSphere(osg::Vec3(0, 0, 0), RAYON);
bone->addChild(sphereNode);
osgAnimation::Vec3KeyframeContainer* key = new
osgAnimation::Vec3KeyframeContainer;
// We also display the position in realtime. Hence, the callback records
// the animation.
sphereNode_realtime->addUpdateCallback(new codaNodeCallback(0, key));
root_realtime->addChild(sphereNode);
viewer.setSceneData(root_realtime);
viewer.run();
// When the view is done, we save the animation.
osg::Group* scene = new osg::Group;
osg::ref_ptr<osgAnimation::BasicAnimationManager> manager =
new osgAnimation::BasicAnimationManager;
scene->setUpdateCallback(manager.get());
osgAnimation::Animation* anim = new osgAnimation::Animation;
osgAnimation::Vec3LinearSampler* sampler = new osgAnimation::Vec3LinearSampler;
sampler->setKeyframeContainer(key);
osgAnimation::Vec3LinearChannel* channel = new
osgAnimation::Vec3LinearChannel(sampler);
channel->setName("position");
channel->setTargetName("a bone");
anim->addChannel(channel);
manager->registerAnimation(anim);
manager->buildTargetReference();
// Then, we add some root nodes, it comes from the example
// “osganimationskinning” and stay a little bit fuzzy.
osg::MatrixTransform* trueroot = new osg::MatrixTransform;
trueroot->setMatrix(osg::Matrix(osg::Matrix::translate(50,50,20).ptr()));
trueroot->addChild(skelroot.get());
trueroot->setDataVariance(osg::Object::DYNAMIC);
rootTransform->addChild(trueroot);
scene->addChild(rootTransform);
// We save the scene.
osgDB::writeNodeFile(*scene, "scene.osg");
--8<---------------cut here---------------end--------------->8---
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=16854#16854
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org