参考源码:osg的官方例子:osganimationviewer

首先制作一个带骨骼动画的模型  demo.FBX

这里面我们做了两个骨骼动画:1.open   2.close

下面开始在osg中使用这个动画。

我们用几种代码从简到繁来演示加载播放等过程:

1.最简单的示例代码

  1. #include <osgViewer/Viewer>
  2. #include <osgDB/ReadFile>
  3. #include <osgAnimation/BasicAnimationManager>
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7. osgViewer::Viewer viewer;
  8.  
  9. //读取带动画的节点
  10. osg::Node *animationNode = osgDB::readNodeFile("demo.FBX");
  11. //获得节点的动画列表
  12. osgAnimation::BasicAnimationManager* anim =
  13. dynamic_cast<osgAnimation::BasicAnimationManager*>(animationNode->getUpdateCallback());
  14. const osgAnimation::AnimationList& list = anim->getAnimationList();
  15. //从动画列表中选择一个动画,播放
  16. anim->playAnimation(list[].get());
  17.  
  18. viewer.setSceneData(animationNode);
  19. return viewer.run();
  20. }

2.通过自定义AnimationManagerFinder加载

本段代码,我没有测试,但是大体是这样。

  1. #include <osgViewer/Viewer>
  2. #include <osgDB/ReadFile>
  3. #include <osgAnimation/BasicAnimationManager>
  4.  
  5. struct AnimationManagerFinder : public osg::NodeVisitor
  6. {
  7. osg::ref_ptr<osgAnimation::BasicAnimationManager> _am;
  8. AnimationManagerFinder() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
  9. void apply(osg::Node& node) {
  10. if (_am.valid())
  11. return;
  12. if (node.getUpdateCallback()) {
  13. osgAnimation::AnimationManagerBase* b = dynamic_cast<osgAnimation::AnimationManagerBase*>(node.getUpdateCallback());
  14. if (b) {
  15. _am = new osgAnimation::BasicAnimationManager(*b);
  16. return;
  17. }
  18. }
  19. traverse(node);
  20. }
  21. };
  22.  
  23. int main(int argc, char* argv[])
  24. {
  25. osgViewer::Viewer viewer;
  26.  
  27. //读取带动画的节点
  28. osg::Node *animationNode = osgDB::readNodeFile("demo.FBX");
  29.  
  30. AnimationManagerFinder m_cFinder;
  31. //获得节点的动画列表
  32. animationNode ->accept(*m_cFinder);
  33. if (m_cFinder->_am.valid())
  34. {
  35. animationNode ->setUpdateCallback(m_cFinder->_am.get());
  36. }
  37.  
  38. for (osgAnimation::AnimationList::const_iterator it = m_cFinder->_am->getAnimationList().begin(); it != m_cFinder->_am->getAnimationList().end(); it++)
  39. {
  40. std::string animationName = (*it)->getName();
  41. osgAnimation::Animation::PlayMode playMode = osgAnimation::Animation::ONCE;
  42. (*it)->setPlayMode(playMode);//设置播放模式
  43. (*it)->setDuration(5.0);//设置播放时间
  44. }
  45.  
  46. //从动画列表中选择一个动画,播放
  47. m_cFinder->_am->->playAnimation(*m_cFinder->_am->getAnimationList().begin());
  48.  
  49. viewer.setSceneData(animationNode);
  50. return viewer.run();
  51. }

[原]osg模型动画|骨骼动画的更多相关文章

  1. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  2. 浅谈Unity3D 骨骼动画

    转载请标明出处http://www.cnblogs.com/zblade/ 最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭 ...

  3. Axiom3D:Ogre动画基本流程与骨骼动画

    在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...

  4. cocos2dx骨骼动画Armature源码分析(一)

    源码分析一body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-to ...

  5. 【Away3D代码解读】(五):动画模块及骨骼动画

    动画模块核心存放在away3d.animators包里: Away3D支持下面几种动画格式: VertexAnimator:顶点动画 SkeletonAnimator:骨骼动画 UVAnimator: ...

  6. osg学习示例之遇到问题四骨骼动画编译osgCal

    osg学习示例之遇到问题四骨骼动画编译osgCal 转自:http://blog.csdn.net/wuwangrun/article/details/8239451 今天学到书<OpenSce ...

  7. 基于babylon3D模型研究3D骨骼动画(1)

    3D骨骼动画是实现较为复杂3D场景的重要技术,Babylon.js引擎内置了对骨骼动画的支持,但Babylon.js使用的骨骼动画的模型多是从3DsMax.Blender等3D建模工具转换而来,骨骼动 ...

  8. MD5骨骼动画模型加载(一)

    前面我们分析了静态模型OBJ格式,桢动画模型MD2,这篇主要分析骨骼动画MD5的一些概念并且实现. 混合桢动画有计算简单,容易实现等优点,但是在需要比较细致的效果时,则需要更多的关键桢,每桢都添加相同 ...

  9. MD5骨骼动画模型加载

    前面我们分析了静态模型OBJ格式,桢动画模型MD2,这篇主要分析骨骼动画MD5的一些概念并且实现. 混合桢动画有计算简单,容易实现等优点,但是在需要比较细致的效果时,则需要更多的关键桢,每桢都添加相同 ...

随机推荐

  1. 极客时间 深入拆解java虚拟机 一至三讲学习总结

    为什么要学习java虚拟机 1.学习java虚拟机的本质,是了解java程序是如何被执行且优化的.这样一来,才可以从内部入手,达到高效编程的目的.与此同时,你也可以为学习更深层级.更为核心的java技 ...

  2. jq点击事件不生效,效果只闪现一次又立马消失的原因?

    出现的问题:jq点击事件不生效,点击的时候效果实现但又立马消失,页面重新刷新了一次 可能出现的原因: a标签href属性的原因,虽然点击事件生效,但页面又刷新了一次,所以没有效果,只闪了一次 解决方案 ...

  3. mysql获取连接connection失败

    好久不写jdbc了,今天写了个小东西,数据库连接失败,错误信息如下: java.sql.SQLException: The server time zone value '???ú±ê×??±??' ...

  4. 学Python的感受

    这门课程已经上了两周了,虽然还没学到什么实质上的东西,只是做了几道题,但是我也感受到了Python的魅力.我感觉这门课真的很有用,比如老师所说的网络爬虫,我对这个非常感兴趣.再说说老师的教学方式,理论 ...

  5. 记一次ORACLE无法启动登陆事故

    打开XSHELL 登陆ORACLE用户 1.sqlplus scott/scott 提示登陆失败 2.sqplus / as sysdba 启动数据库提示 3.查找日志 操作日志:$ORACLE_HO ...

  6. java中String字符串的==解析

    今天不知道怎么看了下string的==的问题,本身我觉得我这个水平去判断几个字符串相等还能出问题?呵呵,真的出了大问题,根本原因在于对java字节码的不了解. 首先,==运算符比较的是两个变量所指向的 ...

  7. 文本框defalutValue的使用

    以下页面中的文本框的值无论怎么改变,点击“原始值”按钮始终会得到初始页面的时候的值,即“ffffffffffffff” <!DOCTYPE html> <html> <h ...

  8. 转载 usb_alloc_coherent 和 usb_free_coherent

    今天做移植的时候,随手记录一下,今天所遇到的问题解决方法. 在linux2.6.34和之前的代码中还可以使用usb_buffer_alloc 和 usb_buffer_free 这两个函数,在2.6. ...

  9. 第一个SDL程序

    不废话,就WinMain主体: SDL_Window* window = NULL; SDL_Renderer* renderer = NULL; SDL_Event e; bool q = 0; i ...

  10. IP通信基础学习第四周(上)

    IP地址现在由因特网名字与号码指派公司ICANN进行分配,它是标志一个主机(或路由器)和一条链路的接口,其编址方法有:分类的IP地址.子网的划分.构成超网. 分类两级IP地址可以记为:IP::={&l ...