1. 程式人生 > >Spine 多個動作連播時是否要K初始幀

Spine 多個動作連播時是否要K初始幀

“動畫”只能影響有關鍵幀的骨骼和插槽。 這允許骨架的狀態完全由應用程式控制。 當按順序播放動畫時,前一個動畫對骨骼或插槽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);
	}