查看: 1605|回复: 6

FBX骨骼动画单次播放动画一闪而过

[复制链接]

该用户从未签到

发表于 2013-10-17 14:21:34 | 显示全部楼层 |阅读模式
需求:我有几个FBX骨骼动画模型需要切换播放,由于大量骨骼动画模型会导致运行帧速下降,而我的动画在整个程序运行时只是偶尔播放,所以我在播放完一个骨骼动画后马上将替换成与最后一帧状态相同的IVE模型,等需要播放动画时在切换需要的FBX模型进行动画播放。
我的每一个模型都只有一个动画,因此我参照AnimationViewer例子,我改写了AnimtkViewerModelController,并设置了播放模式为ONCE,代码如下:
  1. class AnimtkViewerModelController
  2. {
  3. public:
  4.         typedef std::vector<std::string> AnimationMapVector;
  5.        
  6.         AnimtkViewerModelController()
  7.         {
  8.                 _model = NULL;
  9.                 _animation = NULL;
  10.         }

  11.         bool setModel(osgAnimation::BasicAnimationManager* model)
  12.         {
  13.                 _model = model;
  14.                 osgAnimation::AnimationList::const_iterator it = _model->getAnimationList().begin();
  15.                 _animation = *it;
  16.                 return true;
  17.         }

  18.         bool play()
  19.         {
  20.                 if(_animation)
  21.                 {
  22.                         _animation->setPlayMode(osgAnimation::Animation::LOOP);
  23.                         _model->playAnimation(_animation);
  24.                         return true;
  25.                 }

  26.                 return false;
  27.         }

  28.         bool playOnce()
  29.         {
  30.                 if(_animation)
  31.                 {
  32.                         _animation->setPlayMode(osgAnimation::Animation::ONCE);
  33.                         _model->playAnimation(_animation);
  34.                         return true;
  35.                 }

  36.                 return false;
  37.         }

  38.         bool stop()
  39.         {
  40.                 if(_animation)
  41.                 {
  42.                         _model->stopAnimation(_animation);
  43.                         return true;
  44.                 }
  45.                 return false;
  46.         }   

  47.         bool isPlay()
  48.         {
  49.                 return _model->isPlaying(_animation);
  50.         }

  51. private:
  52.         osg::ref_ptr<osgAnimation::Animation> _animation;
  53.         osg::ref_ptr<osgAnimation::BasicAnimationManager> _model;
  54. };
复制代码
注:由于程序需要,这里我去掉了示例中原有的单例模式。
用法我是参照例子里的操作:
  1. AnimationManagerFinder finder;
  2.                 _xxmodel->accept(finder);
  3.                 _xxmodel->setNodeMask(0x0001);
  4.                 if (finder._am.valid())
  5.                 {
  6.                         _xxmodel->setUpdateCallback(finder._am.get());
  7.                         entity->_xxController.setModel(finder._am.get());
  8.                 }
  9.                 entity->_xxController.playOnce();
复制代码
出现的效果是动画瞬间被播放完毕回到了动画的第一帧,求解~

该用户从未签到

发表于 2013-10-17 16:12:20 | 显示全部楼层
每次我运行AnimationViewer这个例子总是出现黑框的命令提示符,不知道下一步该怎么办呢,请问AnimationViewer例子怎么用呢?

该用户从未签到

 楼主| 发表于 2013-10-18 09:21:49 | 显示全部楼层
天行剑 发表于 2013-10-17 16:12
每次我运行AnimationViewer这个例子总是出现黑框的命令提示符,不知道下一步该怎么办呢,请问AnimationView ...

您需要命令行运行,输入参数是您的模型,比如:D:/..../AnimationViewer.exe xxx.fbx
或者您可以直接把fbx文件拖到AnimationViewer.exe上打开。

该用户从未签到

发表于 2013-10-18 10:11:42 | 显示全部楼层
我把fbx文件拖到AnimationViewer.exe上打开还是不行啊,打开AnimationViewer.exe也是一闪而过。请问在运行fbx时候预先要做什么工作呢?谢谢~

该用户从未签到

 楼主| 发表于 2013-10-18 14:52:08 | 显示全部楼层
天行剑 发表于 2013-10-18 10:11
我把fbx文件拖到AnimationViewer.exe上打开还是不行啊,打开AnimationViewer.exe也是一闪而过。请问在运行f ...

用命令行运行一下,看是不是缺少FBX插件导致模型载入不进去。

该用户从未签到

 楼主| 发表于 2013-10-18 17:36:02 | 显示全部楼层
重新改写了osgAnimation库解决了问题,此贴结贴,谢谢关注。

该用户从未签到

发表于 2013-10-19 15:16:20 | 显示全部楼层
xxcc309 发表于 2013-10-18 14:52
用命令行运行一下,看是不是缺少FBX插件导致模型载入不进去。

好的,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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