3D骨骼动画播放第二个动画时受第一个动画影响导致状态错误的bug反馈

使用Animate3D播放动作的时候,一个模型有可能有多个动作,但cocos的转换工具在导出动作时为了节省资源,在一个动作里从来没动过的骨骼节点就没有导出,但是在播放一个动作的时候(update里)只处理了当前动作的骨头(eg. BoneA)位移旋转缩放数据,但是如果之前此 Sprite3D 已经播放过另外一个动作,另外一个动作操纵了 BoneB, 在动作开始的时候没有重置 BoneB 的 transform ,导致 BoneB 的数据不对,希望下个版本能修正这个问题。

我已经修正这个问题,在 CCSkeleton3D.cpp 里这么做就可以了:

void Bone3D::updateLocalMat()
{
if (_blendStates.size())
{
// .......
}
else
{

// 如果执行了一个动作后 Bone 被设置了一个 transform,
//再执行另外一个动作,第二个动作没有控制此 Bone, 那么 _local 会停留在上一个动作时的状态,从而造成状态不正确
_local = _oriPose;
}

update 2016-02-28 01:23:15
刚才发现只修改这一个地方还是有问题,当多个摄像机访问同一个对象的时候,每个对象的 draw都会更新 BoneMatrix,但是每次执行此方法都会导致 Bone 的 _blendState 被清除,从而只有第一个摄像机看到的有动画,后面的摄像机看到的都不动了,所以还需要修改下面几个文件

自己顶一下