如何无缝循环播放animation?

我正在尝试一个完整的方法,它使用SkinnedModelProcessor将Maya-Animations(从Maya-Models)剪切成特定的方法。

我唯一的问题是,一个animation循环完成后,模型停留在最后的位置约2-3秒,直到他再次赶上运行周期。

我的目标是摆脱冻结时间。 我想循环无缝。

这是我写的:

public AnimationClip getCurrentAnimation(string clipName, string cropName, float blendTime, int beginFrame, int endFrame, int totalFrames) { //The new list which only has the specific keyframes List<Keyframe> region = new List<Keyframe>(); //The original clip "Take 001" from Maya, which has every //animation in one timeline AnimationClip clip = _skinningData.AnimationClips[clipName]; //The new duration of the cropped clip int duration = 0; //Since XNA makes 7502 frames out of 21, I have to //calc the region-keyframes to proper numbers if (endFrame == 0) endFrame = clip.Keyframes.Count; else endFrame = ((endFrame * clip.Keyframes.Count) / totalFrames); beginFrame = ((beginFrame * clip.Keyframes.Count) / totalFrames); //Start to sort out for (int i = beginFrame; i < endFrame; i += 1) { Keyframe k = clip.Keyframes[i]; //Add duration of 16 (60fps) to overall-length //of animation, if this keyframe does some "real" //transformation, instead of being a static keyframe of XNA if (k.Time.Milliseconds > duration) duration += 16; k.Time = TimeSpan.FromMilliseconds(duration); region.Add(k); } AnimationClip cropped = new AnimationClip(cropName, TimeSpan.FromMilliseconds(duration), region); return cropped; } 

如果您想要无缝循环animation,请创建animation,以便循环的开始位置与循环结束的位置相同。 然后当一个循环结束时,您可以简单地开始播放第二个循环,而无需进行任何更改。

或者,您可以在两个animation姿势之间进行混合。 这是您将使用您的blendTime值的地方。 跨越blendTime定义的时间量,使用线性插值在当前animation的最后一个姿态和下一个animation的第一个姿态之间进行混合。