cocos2d的armature绑定到其他armature骨骼上的bug

  次阅读 作者:智能小宝 来源:互联网 2015-09-28 11:11 我要评论(0)

在cocos2dx中,rmature的骨骼上可以绑定另外的armature,在我的项目中使用了该功能来完成骑乘功能,但是在使用过程发现了如下的bug,特写在这里做一下记录。

首先说说cocos2dx的代码。在cocos2dx的骨骼的update函数中有如下代码用于骨骼的矩阵更新。

if (_boneTransformDirty)

{

if (_dataVersion >= VERSION_COMBINED)

{

TransformHelp::nodeConcat(*_tweenData, *_boneData);

_tweenData->scaleX -= 1;

_tweenData->scaleY -= 1;

}

//(1)

_worldInfo->copy(_tweenData);

_worldInfo->x = _tweenData->x + _position.x;

_worldInfo->y = _tweenData->y + _position.y;

_worldInfo->scaleX = _tweenData->scaleX * _scaleX;

_worldInfo->scaleY = _tweenData->scaleY * _scaleY;

_worldInfo->skewX = _tweenData->skewX + _skewX + CC_DEGREES_TO_RADIANS(_rotationZ_X);

_worldInfo->skewY = _tweenData->skewY + _skewY - CC_DEGREES_TO_RADIANS(_rotationZ_Y);

//(2)

if(_parentBone)

{

applyParentTransform(_parentBone);

}

else

{

if (_armatureParentBone)//(3)

{

applyParentTransform(_armatureParentBone);

}

}

//(4)

TransformHelp::nodeToMatrix(*_worldInfo, _worldTransform);

//(5)

if (_armatureParentBone)

{

_worldTransform = TransformConcat(_worldTransform, _armature->getNodeToParentTransform());

}

}

在上面的代码中,

1、程序首先计算了bone本身的变换信息,

2、然后在第二步,如果骨骼有父骨骼,则乘以父骨骼的变换信息。如果没有父骨骼但是该骨骼所在的armature有父骨骼(即armayure被作为了其他armature的bone的display,这时就先乘以armature的父骨骼的变换信息。

3、第四步将worldinfo转换为矩阵。

4、第五步计算再将bone所在的armature的变换信息应用于变换矩阵上,得到最终的骨骼的矩阵信息。

问题就出在上面代码标号为3的地方,我们都知道矩阵变换是不满足交换定律的(当然少数情况除外)。但是骨骼矩阵之间的关系应该如下:

parentArmature-------armatureParentBone------------armature------------bone

或者是armature-----------。。。。------parentBone-----bone 中间省略一些parentBone。

因此在上面的代码中,如果不包含armatureParentBone,那么矩阵变换关系是bone * parentBone *...*parentBone,结果正确,即没有armature作为bone的render。

但是如果有armature作为bone的render,那么关系是bone*armatureParentBone*armature,那么在矩阵变换的顺序上就出现了问题。因此我将代码做了一些修改如下:

//if it is a armature display render node, apply transform to armature.

BaseData worldInfo;

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...