OSG中的动画

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的影响,而动起来了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值