Unity動畫關鍵幀與曲線操作

在項目開發中,動畫的編輯一般由美術完成,他們會輸出一個.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代表這個方向上影響的權重

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

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

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

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

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

2.獲取編輯好的曲線

EditorGUILayout.CurveField(shapeCurve);

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

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

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

五、上下和水平翻轉

上下和水平翻轉都影響了原本貝塞爾曲線的斜率,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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章