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倍速度循环执行。