本文主要是介绍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);
以上情况是针对默认曲线的(他们的关键帧inTangetn和outTangent相等),如果曲线是线性的,需要注意inTangent和outTangent不相等的情况
这篇关于Unity动画关键帧与曲线操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!