osgAnimation.CompositeMotion类实现了一个由多个动画合成而成的运动轨迹,同时也可以应用缩放和偏移变换。
osgAnimation.CompositeMotion
类用于实现将多个动画合成为一个运动轨迹的操作,并可以通过进行缩放和偏移变换来调整合成后的运动轨迹。该类继承自osgAnimation.Motion
类,并通过组合多个osgAnimation.KFFrameAnimation
成员实现复合动画。
#include <osg/Node>
#include <osgAnimation/CompositeMotion>
#include <osgAnimation/MorphGeometry>
#include <osgAnimation/Sampler>
#include <osgAnimation/UpdateMatrixTransform>
osg::Node* createModel()
{
// ...
}
osg::ref_ptr<osg::Node> createAnimation(osg::Node* model)
{
// 创建一个空的姿态矩阵变换器
osg::ref_ptr<osgAnimation::UpdateMatrixTransform> umt = new osgAnimation::UpdateMatrixTransform;
// 创建一个合成动画
osg::ref_ptr<osgAnimation::CompositeMotion> compositeMotion = new osgAnimation::CompositeMotion;
// 添加动画
osg::ref_ptr<osgAnimation::KFFrameAnimation> anim1 = new osgAnimation::KFFrameAnimation;
// ... 设置动画帧
compositeMotion->addChild(anim1);
osg::ref_ptr<osgAnimation::KFFrameAnimation> anim2 = new osgAnimation::KFFrameAnimation;
// ... 设置动画帧
compositeMotion->addChild(anim2);
osg::ref_ptr<osgAnimation::KFFrameAnimation> anim3 = new osgAnimation::KFFrameAnimation;
// ... 设置动画帧
compositeMotion->addChild(anim3);
// 添加变换器到计算树中
umt->addChild(model);
// 将运动轨迹应用到变换矩阵上
osg::ref_ptr<osgAnimation::Sampler> sampler = new osgAnimation::Sampler(compositeMotion);
umt->setMatrix( osg::Matrixd(sampler->getValue(0.0)) );
umt->setMatrixInterpolator( sampler.get() );
return umt;
}
/**
* 添加一个动画到复合运动轨迹中。
* @param animation 动画指针。
*/
void addChild(KFFrameAnimation* animation);
/**
* 获取子动画数量。
* @return 子动画数量。
*/
unsigned int getNumChildren() const;
/**
* 获取指定索引的子动画。
* @param i 索引号。
* @return 子动画指针。
*/
KFFrameAnimation* getChild(unsigned int i);