天天看點

Unity動畫關鍵幀與曲線操作一、擷取一個動畫檔案上的所有曲線二、關鍵幀KeyFrame的屬性和曲線的關系三、對曲線上的關鍵幀進行偏移四、複用曲線而不改變取值範圍五、上下和水準翻轉

在項目開發中,動畫的編輯一般由美術完成,他們會輸出一個.anim的檔案。

其實.anim檔案實際上由一系列的關鍵幀組成,可以對這些關鍵幀進行操作,達到一定的目的。

本文章介紹實作将曲線變換形狀,值偏移,時間偏移,上下、左右翻轉。

目錄

一、擷取一個動畫檔案上的所有曲線

1.獲得動畫檔案的bind屬性

2.通過bind屬性獲得曲線

3.拿到曲線後獲得關鍵幀

4.操作關鍵幀後,建立新的曲線

5.通過bind屬性,将對應的新曲線應用回去,或者應用到新的動畫檔案,最後儲存重新整理資源

二、關鍵幀KeyFrame的屬性和曲線的關系

三、對曲線上的關鍵幀進行偏移

四、複用曲線而不改變取值範圍

1.首先添加編輯好的曲線

2.擷取編輯好的曲線

3.根據原曲線上的關鍵幀進行一定比例的縮放和偏移

五、上下和水準翻轉

一、擷取一個動畫檔案上的所有曲線

1.獲得動畫檔案的bind屬性

EditorCurveBinding[] editorCurveBindings = AnimationUtility.GetCurveBindings(mClip);

2.通過bind屬性獲得曲線

AnimationCurve curve = AnimationUtility.GetEditorCurve(mClip, bind);

3.拿到曲線後獲得關鍵幀

Keyframe[] frame = curve.keys;

4.操作關鍵幀後,建立新的曲線

AnimationCurve ac2 = new AnimationCurve(frame);

5.通過bind屬性,将對應的新曲線應用回去,或者應用到新的動畫檔案,最後儲存重新整理資源

AnimationUtility.SetEditorCurve(targetClip, bind, curve);

二、關鍵幀KeyFrame的屬性和曲線的關系

通過操作關鍵幀上的數值,達到形狀變換,偏移,翻轉的目的。

關于屬性的詳細介紹和曲線形狀插值可以參考Unity動畫關鍵幀插值

inTangent、outTangent代表斜率

inWeight、outWeight代表這個方向上影響的權重

這幾個值是影響曲線走向的關鍵

Unity動畫關鍵幀與曲線操作一、擷取一個動畫檔案上的所有曲線二、關鍵幀KeyFrame的屬性和曲線的關系三、對曲線上的關鍵幀進行偏移四、複用曲線而不改變取值範圍五、上下和水準翻轉

三、對曲線上的關鍵幀進行偏移

偏移不影響原本的貝塞爾曲線插值,通過修改KeyFrame.value達到值偏移,修改KeyFrame.time達到時間偏移

四、複用曲線而不改變取值範圍

1.首先添加編輯好的曲線

Unity動畫關鍵幀與曲線操作一、擷取一個動畫檔案上的所有曲線二、關鍵幀KeyFrame的屬性和曲線的關系三、對曲線上的關鍵幀進行偏移四、複用曲線而不改變取值範圍五、上下和水準翻轉

2.擷取編輯好的曲線

EditorGUILayout.CurveField(shapeCurve);

3.根據原曲線上的關鍵幀進行一定比例的縮放和偏移

對值和時間進行偏移後,會改變原本的曲線形狀,這裡要根據原曲線的插值,對新曲線的關鍵幀參數進行修改

根據Unity動畫關鍵幀插值提供的公式,計算出未縮放前的坐标,按照縮放比例縮放計算新的P1和P2,然後利用縮放後的P0和P3這兩個端點的值,得到ow0,ot0,iw1,it1,設定到關鍵幀。

Unity動畫關鍵幀與曲線操作一、擷取一個動畫檔案上的所有曲線二、關鍵幀KeyFrame的屬性和曲線的關系三、對曲線上的關鍵幀進行偏移四、複用曲線而不改變取值範圍五、上下和水準翻轉

五、上下和水準翻轉

上下和水準翻轉都影響了原本貝塞爾曲線的斜率,tangent值其實是正切值,翻轉過後剛好為原本值對應的角α的補角正切,即-tanα

是以上下翻轉:

//切值取相反方向的切角補角的值
Keyframe key = new Keyframe(oldKey.time, 2 * first.value - oldKey.value, -oldKey.inTangent, -oldKey.outTangent, oldKey.inWeight, oldKey.outWeight);
           

左右翻轉還需要對權重翻轉,in和out對換

//切值取補角,權重調換
Keyframe key = new Keyframe(2 * midTime - oldKey.time, oldKey.value, -oldKey.inTangent, -oldKey.outTangent, oldKey.outWeight, oldKey.inWeight);
           
以上情況是針對預設曲線的(他們的關鍵幀inTangetn和outTangent相等),如果曲線是線性的,需要注意inTangent和outTangent不相等的情況
上一篇: Bezier

繼續閱讀