#include <osgViewer/Viewer>
#include <osg/MatrixTransform>
#include <osgDB/ReadFile>
#include <osg/Callback>
#include <osgAnimation/Animation>
class RotateCallback : public osg::NodeCallback
{
public:
RotateCallback(osgAnimation::Animation *dls)
{
_startTick = osg::Timer::instance()->tick();
_animation = dls;
}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
osg::MatrixTransform *mt = dynamic_cast<osg::MatrixTransform*>(node);
if (mt)
{
double currentTick = osg::Timer::instance()->tick();
double elaspedTime = osg::Timer::instance()->delta_s(_startTick, currentTick);
_animation->resetTargets();
_animation->setPlayMode(osgAnimation::Animation::LOOP);
_animation->update(elaspedTime);
_animation->setWeight(1.0);
osgAnimation::ChannelList cls = _animation->getChannels();
double currentRot = dynamic_cast<osgAnimation::DoubleTarget*>(cls.at(0)->getTarget())->getValue();
osg::Quat rotQuat(currentRot, osg::Z_AXIS);
osg::Matrix rotMatrix(rotQuat);
mt->setMatrix(rotMatrix);
}
traverse(node, nv);
}
protected:
osgAnimation::Animation* _animation;
double _startTick;
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("cow.osg");
osg::ref_ptr<osg::MatrixTransform> root = new osg::MatrixTransform;
root->addChild(cowNode);
osgAnimation::DoubleKeyframe keyframe1(0.0, 0.0);
osgAnimation::DoubleKeyframe keyframe2(10.0, osg::PI * 2);
osg::ref_ptr<osgAnimation::DoubleKeyframeContainer> keyframeContainer = new osgAnimation::DoubleKeyframeContainer();
keyframeContainer->push_back(keyframe1);
keyframeContainer->push_back(keyframe2);
osg::ref_ptr<osgAnimation::DoubleLinearSampler> sampler = new osgAnimation::DoubleLinearSampler();
sampler->setKeyframeContainer(keyframeContainer.get());
osg::ref_ptr<osgAnimation::DoubleLinearChannel> channel = new osgAnimation::DoubleLinearChannel();
channel->setSampler(sampler.get());
osg::ref_ptr<osgAnimation::Animation> animation = new osgAnimation::Animation();
animation->addChannel(channel.get());
root->addUpdateCallback(new RotateCallback(animation.get()));
viewer->setUpViewInWindow(200, 200, 800, 600);
viewer->setSceneData(root);
return viewer->run();
}
osg动画
最新推荐文章于 2024-01-16 07:07:45 发布