osganimationmorph例子

来源:互联网 发布:各项异性采样优化 编辑:程序博客网 时间:2024/05/16 18:47
该例子演示了渐变动画。
应用osgAnimation::Animation库
这个库是专门的动画库,里面有几个关键的概念:
KeyFrame关键帧,记录一个运动中指定时间的几个关键的值,根据这几个值其他的时间就可以进行插值运算。
由于关键帧值的类型不确定,可以是值、点、旋转等等等等,因此class TemplateKeyframe : public Keyframe实现一个模板类,用于不同类型关键帧的值。
FloatKeyframe
DoubleKeyframe
Vec2Keyframe
Vec3Keyframe
Vec4Keyframe
QuatKeyframe
MatrixKeyframe
Vec3PackedKeyframe
FloatCubicBezierKeyframe
DoubleCubicBezierKeyframe
Vec2CubicBezierKeyframe
Vec3CubicBezierKeyframe
Vec4CubicBezierKeyframe
有了关键帧,就应该有包含关键帧的容器
KeyframeContainer,同样,通过模板定义一个不同类型的关键帧容器class TemplateKeyframeContainer : public std::vector<TemplateKeyframe<T> >, public KeyframeContainer
继承了std::vector因此具有了容器的功能。
上面说到了通过关键帧进行插值,因此,应该有一个插值器,根据关键帧的类型可以进行指定算法的插值。
Interpolator中的TemplateInterpolatorBase插值器,可以进行不同算法的插值,osg中定义了很多的算法,我们也可以实现自己的插值算法。
有了关键帧,又通过插值器可以计算出其他的值,需要有一个类包含这些数据。没错,这个就是
Sampler 采样器,通过这个对象就可以进行基本的动画
而Channel封装了了Sampler和运动的对象,这个类就是一个运动屏道。
Animation这个类封装了多个Channel,实现了运动的组合。
因此,我们很容易理解一下的代码:
osgAnimation::Animation* animation = new osgAnimation::Animation;
    osgAnimation::FloatLinearChannel* channel0 = new osgAnimation::FloatLinearChannel;
    channel0->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(0,0.0));
    channel0->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(1,1.0));
    channel0->setTargetName("MorphNodeCallback");
    channel0->setName("0");

    animation->addChannel(channel0);
    animation->setName("Morph");
    animation->computeDuration();
    animation->setPlayMode(osgAnimation::Animation::PPONG);
    osgAnimation::BasicAnimationManager* bam = new osgAnimation::BasicAnimationManager;
    bam->registerAnimation(animation);

定义一个动画类,定义一个Float线性插值的屏道,插入两个关键帧,屏道加入到动画,注册动画。
osg中对Node和drawable的操作都是通过Callback实现的,动画也不例外,因此setTargetName("MorphNodeCallback");绑定了这个callback函数。
之后加入了两个Geometry
osgAnimation::MorphGeometry* morph = new osgAnimation::MorphGeometry(*geom0);
    morph->addMorphTarget(geom1.get());
定义了一个几何体渐变运动,有geom0变化到geom1

 geode->addUpdateCallback(new osgAnimation::UpdateMorph("MorphNodeCallback"));
根据名称找到调用的回调函数,实现渐变效果
原创粉丝点击