Spine 多个动作连播时是否要K初始帧

Spine 多个动作连播时是否要K初始帧 K首帧

大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!
欢迎加入专业Spine技术交流群 Spine2D骨骼动画 7708065
转载请保留原始链接:https://blog.csdn.net/jx520/article/details/83048115

“动画”只能影响有关键帧的骨骼和插槽。 这允许骨架的状态完全由应用程序控制。
当按顺序播放动画时,前一个动画对骨骼或插槽K了帧(比如做了旋转缩放什么的)。那么这个效果会延续到第二个动画。(就是A动画的最后一帧和B动画的第一帧之间会自动产生补间动画,因为在程序中播放时这两个动画是连续的。但问题在于我们K动画时,初始POSE是从装配模式继承过来的,就是装配模式到B动画第一帧的过度才是我们期望的)
这个问题可以通过给所有受到影响的动画元素K首帧来解决(就是在动画的第一帧,把所有会受影响的骨骼、插槽、等等 都K上个帧)。但这并不是最优解。因为给每个属性K的每一帧都会增加少量开销。
另外一个解决方案是在改变当前动画时调用 skeleton 的方法

// 将未K帧的骨骼插槽设置为绑定POSE
setToSetupPose //设置骨骼和插槽为绑定POSE
setBonesToSetupPose //设置骨骼为绑定POSE
or setSlotsToSetupPose  //设置插槽为绑定POSE

(或者另外编写你需要的设置骨骼、插槽的代码)。它可以避免从A动画切换到B动画后,骨骼和插槽受到A动画的影响,而不需要K首帧来得到绑定POSE。总之它会吧B动画中所有没K帧的骨骼、插槽设置为绑定POSE。AnimationState将无法对骨骼进行交叉淡化 (我猜他说的是无法为骨骼做混合动画)

源代码

/** Sets the bones and slots to their setup pose values. */
	public void setToSetupPose () {
		setBonesToSetupPose();
		setSlotsToSetupPose();
	}

	public void setBonesToSetupPose () {
		Array<Bone> bones = this.bones;
		for (int i = 0, n = bones.size; i < n; i++)
			bones.get(i).setToSetupPose();

		Array<IkConstraint> ikConstraints = this.ikConstraints;
		for (int i = 0, n = ikConstraints.size; i < n; i++) {
			IkConstraint ikConstraint = ikConstraints.get(i);
			ikConstraint.bendDirection = ikConstraint.data.bendDirection;
			ikConstraint.mix = ikConstraint.data.mix;
		}
	}

	public void setSlotsToSetupPose () {
		Array<Slot> slots = this.slots;
		System.arraycopy(slots.items, 0, drawOrder.items, 0, slots.size);
		for (int i = 0, n = slots.size; i < n; i++)
			slots.get(i).setToSetupPose(i);
	}

猜你喜欢

转载自blog.csdn.net/jx520/article/details/83048115