查看: 3661|回复: 12

AnimationPath怎么让物体停在某一特定的点

[复制链接]

该用户从未签到

发表于 2009-1-13 17:56:55 | 显示全部楼层 |阅读模式
用AnimationPath,如果想让物体停在始点或终点,该怎么做?

该用户从未签到

发表于 2009-1-13 18:26:57 | 显示全部楼层
AnimationPath不是很好控制,功能也很弱,可以操作AnimationPathCallback::setTimeOffset()将时间轴移至始点或终点,然后用setPause暂停动画。
如果想要更强大的场景动画功能,建议楼主有时间钻研一下2.7.6以后加入的osgAnimation库,应当是今后OSG场景动画设计的首选。

该用户从未签到

发表于 2009-5-10 21:02:06 | 显示全部楼层

Settimeoffset是什么呢?

看不懂timeoffset和timeMultiplier是什么?

osg::AnimationPathCallback::AnimationPathCallback  ( AnimationPath *  ap,  
  double  timeOffset = 0.0,  
  double  timeMultiplier = 1.0   
)
??

停在path中的某个controlpoint怎么停?

[ 本帖最后由 dlhuaan 于 2009-5-10 22:02 编辑 ]

该用户从未签到

发表于 2009-5-10 22:23:34 | 显示全部楼层
timeoffset是时间的偏移值,因为AnimationPath是根据当前系统运行的总时间来控制路径动画的,因此设置偏移可以使动画从指定的帧位置开始或重新开始

timeMultiplier则顾名思义可以改变动画运行的速度倍率。我想多多阅读源代码也许更有助于您对他的了解

该用户从未签到

发表于 2009-5-10 22:36:45 | 显示全部楼层

谢谢

谢谢版主回答。

您说的:因此设置偏移可以使动画从指定的帧位置开始或重新开始
我还是理解不好,

比如说:一个节点的动画callbackpath有10秒。
现在设timeoffset=2


指的是程序开始运行2秒后调用该节点动画callbackpath 10秒呢?
还是指从动画callbackpath的第2秒开始调用动画callbackpath 的后8秒呢?

该用户从未签到

发表于 2009-5-10 23:18:31 | 显示全部楼层
  1. TimeControlPointMap &  getTimeControlPointMap ()
  2. const TimeControlPointMap &  getTimeControlPointMap () const  
复制代码
通过这个可以得到定时定点的位置,,,控制暂停的问题不大吧~注意控制时选择范围,而不是等于比较,,因为路径是path插值得到的~~~

该用户从未签到

发表于 2009-5-11 00:13:09 | 显示全部楼层
const osg::AnimationPath::TimeControlPointMap& tcpm = animationPathCallback->getAnimationPath()->getTimeControlPointMap();

                          for (osg::AnimationPath::TimeControlPointMap::const_iterator itr=tcpm.begin();itr!=tcpm.end();++itr)
                                                {
                                 
                                                        //map(key,value).first是time,second是positon
                                                        std::cout << itr->first  << " " << itr->second.getPosition().x()<< std::endl;

                                                }
这样确实可以取得时间和关键点,但如何在这些关键点停下(pause)?

如果有这样一个函数就好了:setpause(double sec)

[ 本帖最后由 dlhuaan 于 2009-5-11 00:15 编辑 ]

该用户从未签到

发表于 2009-5-11 09:06:23 | 显示全部楼层
AnimationPathCallback::setTimeOffset( ... )
AnimationPathCallback::setPause( true )

该用户从未签到

发表于 2009-5-11 11:13:12 | 显示全部楼层
得到了所有的定时定点的位置,,,停下来还不容易么~~~比较一下,,然后可以设置暂停啊~~~~~~~~~王锐说的也是可以的~········

该用户从未签到

发表于 2009-5-11 11:19:50 | 显示全部楼层
好啊,我再试试。谢谢

该用户从未签到

发表于 2009-5-13 10:37:52 | 显示全部楼层
二楼所说的setTimeOffset()我试过,我想得到的是分段播放的动画,但是设置TimeOffSet后,暂停在开始,只能从设置的time点播放,动画出现不连贯的现象。
TimeControlPointMap &  getTimeControlPointMap () 只是得到压入的控制点和时间的对应关系,得不到正在运行的动画某一时刻运动点的坐标。
virtual bool  getInterpolatedControlPoint (double time, ControlPoint &controlPoint) const  
我试过如上的方法,但是animation中的lasttime是一直在增加的,就算是暂停动画。这样得到的controlPoint始终在变化,达不到想暂停在自己所想要的点的目的,总是出现暂停在某一个未知位置,这个未知的位置取决你暂停多久。
不知道各位还有什么意见可以交流一下!!!

该用户从未签到

发表于 2009-5-14 04:57:41 | 显示全部楼层
应该不会出现你的这个问题,,因为这个我好像曾经就这样做过的,,,还有就是即使不用这个得到位置,,,得到位置的方法太多,,没有必要这条路,,这样提示很浅显了吧~~~~

其实,我每天看帖子对自己也是一个提高,我不提供全权方案,,只是提供一些可行意见,,自己想想就能解决~~~~~

该用户从未签到

发表于 2009-5-17 16:23:38 | 显示全部楼层
整了半天终于可以使动画分段播放了。
不过还有什么方法也可得到位置呢,给个小提示。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表