如何为特定动画帧进行骨骼变换

时间:2013-08-09 14:45:01

标签: animation unity3d

我有一个约20帧的动画。我需要能够访问给定动画帧的每个骨骼的局部变换。我知道如何访问骨骼及其局部变换(代码示例)

Transform root, spine1;
getChildFromName(gameObj, "Jnt_Root", out root);
getChildFromName(root, "Jnt_Spine1", out spine1);
spine1.localRotation = someValue;

所有这一切都很好,但我不知道我得到的值来自哪个动画帧?我假设它来自第1帧(可以使用调试器验证,但这不是重点)

问题是如何获取和设置特定帧的这些值?谢谢!

1 个答案:

答案 0 :(得分:1)

这样的东西应该适用于获得当前的变换:

AnimationState state = animation["your_animation"];
state.enabled = true;
state.normalizedTime = (1.0f/totalAnimationTime) * specificFrame;
animation.Sample();

// get all transforms of this animation, extract your root and spine from here.
Transform[] transforms = animation.gameObject.GetComponentsInChildren<Transform>();

或者,如果您在动画运行时尝试进行采样,则可以执行以下操作:

if(animation["your_animation"].normalizedTime > 0.3 && animation["your_animation"].normalizedTime < 0.5) {
   //... do something at this point in time.  You'll have to figure out the frame
   //from the time
}

最后我检查过你无法明确提取特定的帧。但是如果您知道动画的总长度(按时间),则可以使用以下内容将动画移动到该点:(1.0f/totalAnimationTime) * specificFrame;(这假设关键帧均匀分布。)

一旦存储,您应该能够直接修改变换,但我从未尝试过。