查看: 1917|回复: 2

关键帧动画上的little question 希望共同学习

[复制链接]

该用户从未签到

发表于 2012-10-30 17:54:17 | 显示全部楼层 |阅读模式
代码来自王锐的OSG设计与实践第9章关键帧动画的例子,敲完编译后发现代码有点low了,代码中体现如下几点:1.osgAnimation::UpdateTransform类在3.0版本后被osgAnimation::UpdateMatrixTransform取代;
2. osgAnimation::AnimationUpdateCallback类由非模板变成模板了;
3.osgAnimation::Target类的normalize功能函数被废除了。。

这里简要阐述下我的问题:
根据书上所述,Animiation动画体的update(time)内部调用对应动画频道channel的update(t),而channel的update(t)内部继续调用
Target的update(weight,val)..而target的update已经执行了_result的更新,那么target的normalize用来干嘛(书上说是加权计算,target的update已经加权了啊)?
所以我注掉了target->normalize(),可是运行结果仍是是静态的,why?下面贴出源码:

  1. #include <iostream>
  2. using namespace std;
  3. #include <osg/MatrixTransform>
  4. #include <osgAnimation/UpdateMatrixTransform>
  5. #include <osgDB/ReadFile>
  6. #include <osgViewer/Viewer>

  7. class PlayCallback: public osg::NodeCallback
  8. {
  9. public:
  10.         PlayCallback(osgAnimation::Animation* anim):_animation(anim){}

  11.         void operator()(osg::Node* node,osg::NodeVisitor* nv)
  12.         {
  13.                 if(nv->getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR)
  14.                 {
  15.                         osgAnimation::ChannelList& channels=_animation->getChannels();
  16.                         for(osgAnimation::ChannelList::iterator itr=channels.begin();
  17.                                 itr!=channels.end();++itr)
  18.                         {
  19.                                 osgAnimation::Target* target=(*itr)->getTarget();
  20.                                 target->reset();
  21.                         }
  22.                         const osg::FrameStamp* fs=nv->getFrameStamp();
  23.                         _animation->update(fs->getSimulationTime());

  24.                         for(osgAnimation::ChannelList::iterator itr=channels.begin();
  25.                                 itr!=channels.end();++itr)
  26.                         {
  27.                                 osgAnimation::Target* target=(*itr)->getTarget();
  28.                                 //target->normalize();
  29.                                
  30.                         }
  31.                 }
  32.                 traverse(node,nv);
  33.         }
  34. protected:
  35.         osgAnimation::Animation* _animation;
  36. };

  37. void createPositionKeyframes(osgAnimation::Vec3KeyframeContainer* kc)
  38. {
  39.         kc->push_back(osgAnimation::Vec3Keyframe(0.0,osg::Vec3(0.0,0.0,0.0)));
  40.         kc->push_back(osgAnimation::Vec3Keyframe(2.0,osg::Vec3(5.0,0.0,0.0)));
  41.         kc->push_back(osgAnimation::Vec3Keyframe(4.0,osg::Vec3(5.0,0.0,5.0)));
  42.         kc->push_back(osgAnimation::Vec3Keyframe(6.0,osg::Vec3(0.0,0.0,5.0)));
  43.         kc->push_back(osgAnimation::Vec3Keyframe(8.0,osg::Vec3(0.0,0.0,0.0)));
  44. }

  45. void createEulerKeyframes(osgAnimation::Vec3KeyframeContainer* kc)
  46. {
  47.        
  48.         kc->push_back(osgAnimation::Vec3Keyframe(0.0,osg::Vec3(0.0,0.0,0.0)));
  49.         kc->push_back(osgAnimation::Vec3Keyframe(2.0,osg::Vec3(osg::PI,0.0,0.0)));
  50.         kc->push_back(osgAnimation::Vec3Keyframe(4.0,osg::Vec3(osg::PI,0.0,osg::PI)));
  51.         kc->push_back(osgAnimation::Vec3Keyframe(6.0,osg::Vec3(0.0,0.0,osg::PI)));
  52.         kc->push_back(osgAnimation::Vec3Keyframe(8.0,osg::Vec3(0.0,0.0,0.0)));
  53. }

  54. int main(int argc, char** argv)
  55. {
  56.         osg::ArgumentParser arguments(&argc,argv);
  57.         osg::Node* model=osgDB::readNodeFiles(arguments);
  58.         if(!model) model=osgDB::readNodeFile("glider.osg");

  59.         osg::ref_ptr<osgAnimation::Vec3LinearChannel> ch1=
  60.                 new osgAnimation::Vec3LinearChannel;
  61.         ch1->setName("position");
  62.         ch1->setTargetName("PathCallback");
  63.         createPositionKeyframes(
  64.                 ch1->getOrCreateSampler()->getOrCreateKeyframeContainer());

  65.         osg::ref_ptr<osgAnimation::Vec3LinearChannel> ch2=
  66.                 new osgAnimation::Vec3LinearChannel;
  67.      
  68.         ch2->setName("euler");
  69.         ch2->setTargetName("PathCallback");
  70.         createEulerKeyframes(
  71.                 ch2->getOrCreateSampler()->getOrCreateKeyframeContainer());

  72.         osg::ref_ptr<osgAnimation::Animation> anim=
  73.                 new osgAnimation::Animation;
  74.         anim->setPlayMode(osgAnimation::Animation::LOOP);
  75.         anim->setStartTime(0.0);
  76.         anim->setWeight(1.0);
  77.         anim->addChannel(ch1.get());
  78.         anim->addChannel(ch2.get());

  79.         osg::ref_ptr<osgAnimation::UpdateMatrixTransform> callback=
  80.                 new osgAnimation::UpdateMatrixTransform("PathCallback");
  81.         callback->osgAnimation::AnimationUpdateCallback<osg::NodeCallback>::link(anim.get());


  82.         osg::ref_ptr<osg::MatrixTransform> animMat=new osg::MatrixTransform;
  83.         animMat->addChild(model);
  84.         animMat->setDataVariance(osg::Object::DYNAMIC );
  85.         animMat->setUpdateCallback(callback.get());

  86.         osg::ref_ptr<osg::Group> root=new osg::Group;
  87.         root->addChild(animMat.get());
  88.         root->setUpdateCallback(new PlayCallback(anim.get()));

  89.         osgViewer::Viewer viewer;
  90.         viewer.setSceneData(root.get());
  91.         return viewer.run();
  92. }

复制代码

该用户从未签到

发表于 2012-10-30 20:42:07 | 显示全部楼层
问题很简单,3.0中的动画需要手动添加element向updatematrixtransform。您的代码不起作用,那么请使用阿锐写书时的osg代码的版本,相应的源码分析也按照那个版本。

该用户从未签到

发表于 2012-11-5 09:35:12 | 显示全部楼层
设计与实践中的osgAnimation已经很古老了。请参看osg cookbook中的相关例子,可以在osgRecipes站点免费下载
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表