假如三维模型自带动画,在OSG中,只需要得到模型的动画列表,然后从中选择一个动画,进行播放就可以了。而模型的动画列表,通常存放在UpdateCallBack中。
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgAnimation/BasicAnimationManager>
int main(int argc, char* argv[])
{
osgViewer::Viewer viewer;
//读取带动画的节点
osg::Node *animationNode = osgDB::readNodeFile("nathan.osg");
//获得节点的动画列表
osgAnimation::BasicAnimationManager* anim =
dynamic_cast<osgAnimation::BasicAnimationManager*>(animationNode->getUpdateCallback());
const osgAnimation::AnimationList& list = anim->getAnimationList();
//从动画列表中选择一个动画,播放
anim->playAnimation(list[0].get());
viewer.setSceneData(animationNode);
return viewer.run();
}
这里有一个主要的类, BasicAnimationManager,这个类用来对动画进行管理,它里面保存了动画列表,还提供函数来对动画进行播放。
BasicAnimationManager提供函数,播放动画。 而其父类,AnimationManagerBase保存了动画列表。而AnimationManagerBase又继承自NodeCallback,NodeCallback正是制作动画时,setAnimationPathCallback的参数类型。
实际使用的时候,根据动画的名称,来从动画列表中选择一个动画。
if( list[i]->getName() == std::string("Idle_Head_Scratch.02") )
{
anim->playAnimation(list[i].get());
}