OSG中的动画, AnimationPath, AnimationPathCallback, PositionAttitudeTransform的使用。
之前搞了两头牛了,但是它们都是静止的。现在我想让一头牛,向另一头牛移动。这就涉及OSG中的动画了。
动画,运动的画面。在实际生活中,我们的动作什么的,都是连续的。而我们制作电影或者软件时的动画,其本身是非连续的画面,但是当这些非连续的画面以足够快的时间进行切换时,我们大脑就会将这些非连续的画面连起来,让我们感觉这是一个运动的画面。小时候的连环画,当我们以足够快的时间翻页时,就仿佛看到里面的画面动起来了。
动画,首先要有运动的物体,然后要有运动路径,最后将物体和运动路径关联起来,就可以了。物体在OSG中用Node表示,运动路径,在OSG中有个类叫osg::AnimationPath,然后两者通过node->setUpdateCallBack, AnimationPathCallback关联起来。
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
#include <osg/AnimationPath>
#include <osg/PositionAttitudeTransform>
int main(int argc, char **argv)
{
osgViewer::Viewer viewer;
//create model
osg::Node *cow = osgDB::readNodeFile("cow.osg");
// set up the animation path
osg::AnimationPath* animationPath = new osg::AnimationPath;
animationPath->insert(0, osg::AnimationPath::ControlPoint(osg::Vec3(0, 0, 0)));
animationPath->insert(5, osg::AnimationPath::ControlPoint(osg::Vec3(10, 0, 0)));
//connect model and animation path
osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;
xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath, 0.0, 1.0));
xform->addChild(cow);
viewer.setSceneData(xform);
return viewer.run();
}
上述代码,先建一个场景查看器osgViewer::Viewer,然后读取牛的三维模型,然后建立一个动画路径,这个动画路径通过使用ControlPoint来创建的,相当于3dmax制作的动画中的关键帧,将一个时刻,一个关键点组成一个关键帧,表示在时刻 t ,物体运动到ControlPoint上面去。
接下来连接模型和运动路径。由于物体的位置移动,属于物体外部的动画,所以需要在物体外部setUpdateCallback,而不能使用物体本身的setUpdateCallback。所以这里建一个PositionAttitudeTransform,调用它的setUpdateCallback,然后将牛的三维模型作为它的孩子,这样的话,牛受到PostionAttitudeTransform的影响,而动起来了。