关于骨骼动画两个动作衔接的问题

请教大家一个关于骨骼动画两个动作衔接的问题。

问题是这样的,我们在做一个动作游戏,用的是cocostudio做骨骼动画的方式。现在有两套人物动作,一个是抱枪跑步,一个是抱枪跑步的时候开枪。美术在做动作的时候,给做了两个完整的全身动作

    现在问题来了,如果角色刚开始在跑步,然后点了攻击键,需要播放抱枪跑步开枪的动画。可如果这时候腿已经迈出去一半了,直接播抱枪跑步开枪的动画,腿肯定会瞬间闪回初始位置,看上去很不流畅。请教大家,这种情况都是如何处理的呢?




    以前从没有接触过骨骼动画,有了这个问题后,请教了群里的一些人,尝试过以下的解决方式:

1、在查看骨骼动画的相关源码的时候,看到播放动画的函数

void ArmatureAnimation::play(const std::string& animationName, int durationTo, int loop)
这个函数的第二个参数,dutationTo,这个可以让一个动作在几帧之内平缓的过度到第二个动作上。我试了一下,发现这个参数适合不同的动作之间切换,比如从站立到跑步这两个动作,如果放到我说的这个问题上,这个值输的大了,用户会感觉到卡顿,少了,还是会有闪动画的现象。

2、有人建议我说将上下半身分开,建立两个cocostusio工程,然后用两个Armature分别生成上下半身,组合起来。上半身播放开枪动画的时候,下半身依然播放跑步,互不影响。但是经过我的尝试后,发现会有新的问题。因为上下半身是一个整体,在播放的时候会有节奏的上下移动,这样才会形成跑步的效果。所以上半身的动画和下半身的动画必须同时从第0帧开始播放。那么假如上半身和下半身的完整动画都是24帧,如果在播到第6帧的时候,点了攻击键,上半身播放攻击动画24帧,下半身也播完24帧,还是在第6帧,这时候,上半身是不能直接再播放跑步动画的,会和腿部的节奏对不起来,有可能出现上半身在最高点,下半身在最低点,身体分离了。。。。。如果让上半身等待18帧,等腿部也到第0帧了,再同时播放,上半身还是会卡在那,很不流畅。

请问大家是怎么处理这种情况的呢?

没人知道么。。。求解决方案啊

看了这个骨骼动画也是醉了

首先,你要建立一个最小动作循环, 从走路动作切换到开枪动作,可以立即切换,如果你的动作循环较小,就不会有太大问题,如果从一个较长的动作循环切换到其他动作,就会比较有突变感,在此,如果想得到比较好的效果,建议 走步的循环较小,收枪的动作要慢,完成一个跑步循环,再实际切换到走步。

基本思路是,完成当前的动作,或接近完成,或者设置 可随时切换的动作序列, 比如说,做一个每一帧切换到另一个动作的改变。

还有一种更加高级的东西,动作融合,就是两个动作通过算法来差值,逐渐变化成另一个动作。

请问你说的动作融合是什么呢?因为我发的那两个动作,其实腿部动作完全一样的,就是上半身不一样

每一个东西的位置和角度都是有一个数值的,两个数值之间就可以找出中间一点,按照比例来计算出新的位置。

感觉不太理解。好像下半身这样算角度应该是可以的。如果上半身,比如播到一半了,你的意思是上半身也直接从第12帧开始播?那身体的动画不就不完整了么?

根据你的需求,相比较第二个方案会更合适一些,因这两个身体上下两部分相对独立,可以考虑拆开。

还是spine厉害 可以动作平滑过渡

第二个方案还是会遇到上半身和下半身不协调的问题啊。因为上半身播完动画后,下半身不可能总是第0帧(只有上半身和下半身同时从第0帧开始播,动画才不会有问题)

如果上半身播完,下半身可能才播一般,必须让上半身再等X帧,才能等下半身播完,和下半身一起从0帧开始播

我看了看类似的这种横版过关动作游戏,大部分都是用unity3D做的,类似于这个,崩坏学园系列。

我也问了一些做u3d的童鞋,他们说u3d里面自带一种动画融合的功能,可以实现类似的功能。不知道cocos2d-x,遇到这种问题,是如何解决的呢?

参考下 test 的Armature Nesting。
这个就是分开两个动画的

可以直接把这个动画移除掉,创建一个新的抱枪跑的动画出来添加上去

楼主还在吗?我也遇到了这个问题,急求你这是怎么解决的?