|
需求:我有几个FBX骨骼动画模型需要切换播放,由于大量骨骼动画模型会导致运行帧速下降,而我的动画在整个程序运行时只是偶尔播放,所以我在播放完一个骨骼动画后马上将替换成与最后一帧状态相同的IVE模型,等需要播放动画时在切换需要的FBX模型进行动画播放。
我的每一个模型都只有一个动画,因此我参照AnimationViewer例子,我改写了AnimtkViewerModelController,并设置了播放模式为ONCE,代码如下:- class AnimtkViewerModelController
- {
- public:
- typedef std::vector<std::string> AnimationMapVector;
-
- AnimtkViewerModelController()
- {
- _model = NULL;
- _animation = NULL;
- }
- bool setModel(osgAnimation::BasicAnimationManager* model)
- {
- _model = model;
- osgAnimation::AnimationList::const_iterator it = _model->getAnimationList().begin();
- _animation = *it;
- return true;
- }
- bool play()
- {
- if(_animation)
- {
- _animation->setPlayMode(osgAnimation::Animation::LOOP);
- _model->playAnimation(_animation);
- return true;
- }
- return false;
- }
- bool playOnce()
- {
- if(_animation)
- {
- _animation->setPlayMode(osgAnimation::Animation::ONCE);
- _model->playAnimation(_animation);
- return true;
- }
- return false;
- }
- bool stop()
- {
- if(_animation)
- {
- _model->stopAnimation(_animation);
- return true;
- }
- return false;
- }
- bool isPlay()
- {
- return _model->isPlaying(_animation);
- }
- private:
- osg::ref_ptr<osgAnimation::Animation> _animation;
- osg::ref_ptr<osgAnimation::BasicAnimationManager> _model;
- };
复制代码 注:由于程序需要,这里我去掉了示例中原有的单例模式。
用法我是参照例子里的操作:- AnimationManagerFinder finder;
- _xxmodel->accept(finder);
- _xxmodel->setNodeMask(0x0001);
- if (finder._am.valid())
- {
- _xxmodel->setUpdateCallback(finder._am.get());
- entity->_xxController.setModel(finder._am.get());
- }
- entity->_xxController.playOnce();
复制代码 出现的效果是动画瞬间被播放完毕回到了动画的第一帧,求解~ |
|