osg.AnimationPathCallback是OpenSceneGraph中使用的一个回调类,在动画播放过程中被用来更新节点的位置、旋转等信息,从而实现动画效果。
osg::Object -> osg::Referenced -> osg::Callback -> osg::AnimationPathCallback
osg::AnimationPathCallback(const osg::AnimationPath* animationPath, double timeMultiplier = 1.0, double timeOffset = 0.0);
参数:
void setAnimationPath(const osg::AnimationPath* animationPath)设置动画路径。
const osg::AnimationPath* getAnimationPath() const返回动画路径。
void setPause(bool pause)暂停/恢复播放。
bool getPause() const返回当前播放状态,true表示暂停,false表示正在播放。
void reset()重置动画,回到起始状态。
void setStartTime(double startTime)设置动画开始时间,单位为秒。
double getStartTime() const返回动画开始时间,单位为秒。
void setTimeMultiplier(double timeMultiplier)设置时间倍数,控制动画播放速度。
double getTimeMultiplier() const返回时间倍数。
void setTimeOffset(double timeOffset)设置时间偏移量,可以用来控制动画播放的相位。
double getTimeOffset() const返回时间偏移量。
void operator()(osg::Node* node, osg::NodeVisitor* nv)回调函数,更新节点的位置、旋转等信息,并将结果赋值给节点的矩阵变换内部状态。
// 创建一个动画路径
osg::AnimationPath* animationPath = new osg::AnimationPath;
animationPath->setLoopMode(osg::AnimationPath::LOOP);
animationPath->insert(0.0, osg::AnimationPath::ControlPoint(osg::Vec3(0, 0, 0)));
animationPath->insert(5.0, osg::AnimationPath::ControlPoint(osg::Vec3(2, 0, 0)));
animationPath->insert(10.0, osg::AnimationPath::ControlPoint(osg::Vec3(0, 0, 0)));
// 创建一个AnimationPathCallback
osg::ref_ptr<osg::AnimationPathCallback> callback = new osg::AnimationPathCallback(animationPath);
// 设置动画属性
callback->setPause(false);
callback->setTimeMultiplier(2.0);
// 创建一个组节点,并添加子节点
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(createObject());
// 设置回调函数
root->setUpdateCallback(callback.get());
// 创建视图窗口
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
// 运行动画
viewer.run();
以上代码,创建了一个动画路径,使用AnimationPathCallback作为根节点的回调函数,控制节点运动。在程序运行时,该动画会以2倍速度循环执行。