动画曲线
概述
在动画上附加曲线数据,并且曲线之间可以混合,逻辑层可以用这些曲线数据来驱动不同的效果(如驱动IK的强度,驱动材质的数值等)。使用动画曲线 (Animation Curve) 可以自定义动画数据,也就是对动画数据的语义描述。
下图中展示了动画曲线功能效果,让角色脚的大小不断发生变化。
动画曲线面板
在动画曲线面板中,可以创建并编辑动画曲线。动画曲线面板在动画序列和蒙太奇中显示。
创建动画曲线
打开动画序列资产,在该动画序列编辑器中的动画曲线面板(Animation Curve)中点击 按钮,然后在弹出的窗口中输入曲线名称,点击OK按钮完成创建。
编辑动画曲线
创建完动画曲线后,勾选复选框可以展开曲线编辑面板,取消勾选则可收缩曲线编辑面板,曲线的编辑可以在展开后的曲线编辑面板中完成。
在文本框中可修改曲线名称。
点击 按钮后可删除该曲线。
想再次编辑之前创建的动画曲线,点击 按钮可以选择一个之前所创建的曲线,打开其曲线编辑面板。
关键帧编辑
双击空白区域可增加关键帧,点击关键帧并移动关键帧可改变其时间(Time)和值(Value),也可以选中关键帧,在左上方弹出的时间和值的输入框中修改它们的值。
选中关键帧右击,在弹出的快捷菜单中可选择删除选中的关键帧。按住Ctrl键可对关键帧进行多选,或者可直接左击框选多个关键帧。
视口调整
点击左上角的两个按钮可以根据曲线取值范围将视口调整至合适区间。
可通过滚动滚轮手动调整视口;同时按住Ctrl键将仅水平缩放;同时按住Shift键将仅垂直缩放。
关联骨骼
在动画编辑器中依次点击菜单栏窗口(Window) -> 动画曲线查看器(Anim Curve Viewer)来打开动画曲线查看器面板,在动画曲线面板中可以查看曲线数据的实时变化。
在动画曲线查看器(Anim Curve Viewer)面板中选中曲线,该曲线的相关信息将会显示在上方的详细面板(Details Panel)中。
在详细面板(Details Panel)中还可以为曲线关联骨骼数据。点击骨骼(Bones)下的添加(Add)按钮,然后点击根(Root)按钮,在弹出的窗口中可选择所要关联的骨骼,选择完成后关闭该窗口。
若要删除特定关联骨骼,在详细面板中点击关联骨骼后的删除(Del)按钮即可取消该骨骼与曲线的关联。点击清除(Clear)按钮可一次性取消当前所有骨骼与曲线的关联。
示例
以下为展示动画曲线功能的一个示例:
创建组合体
参考Actor组装文档,创建一个组合体(Actor)(.actor),包含tpose和fi_bow_run动画。
在动画编辑器的资产浏览器(Asset Browser)中,选中fi_bow_run,右击选择将骨架资产转为动画序列资产(Convert Skeleton To AnimSeq),在弹出的窗口中输入转换的动画序列的名称,点击确定(OK)按钮后完成转换。
转换完成:
在组合体编辑器(Actor Editor) 中,点击资源详情(Resource Detail),将默认动作(Default Action)设置为动画序列fi_bow_run_sq。
编辑动画资产
创建动画曲线
双击动作列表(Action List)中的fi_bow_run_sq动画序列。
点击动画曲线(Animation Curve)中的 按钮,选择创建曲线(Create Curve),在弹出的窗口中输入名称后点击确定(OK) 按钮完成创建。
编辑动画曲线
在曲线编辑区域中增加关键帧,曲线如下图所示:
在动画编辑器(Animation Editor)中,依次点击菜单栏窗口(Window) -> 动画曲线查看器(Anim Curve Viewer)打开动画曲线查看器。
在动画曲线查看器(Anim Curve Viewer)中选中所创建的曲线,然后在详细面板(Details Panel)中绑定Bip01 L Foot和Bip01 R Foot骨骼。可参照关联骨骼部分来完成绑定骨骼。
编辑完成后,依次点击菜单栏文件(File) -> 保存(Save All)进行保存。
创建角色
在组件编辑器中,依次点击工具栏创建游戏对象(Create Game Object) -> 角色(Character)。
在观察器(Inspector)面板中选中CharacterMesh0(Inherited),然后将所创建的组合体(Actor)(.actor)从资源预览窗口中拖到骨架网格配置文件(Skeletal Mesh Config File)的插槽中。
拖入完成:
在观察器(Inspector)面板中,选中ColliderCylinder(Inherited)和CharacterMesh0(Inherited)分别调整该角色胶囊体和网格体的位置,使胶囊体尽可能在包裹角色的前提下,让角色蒙皮的脚部贴地,胶囊体也需在地面上方。
绑定脚本
在观察器(Inspector)中选中LCharacter(Instance),点击添加组件(Add Component)按钮,选择脚本组件(Script Component),为角色添加一个脚本组件。
从资源预览窗口中将写好的脚本文件拖到该脚本组件(Script Component)的脚本文件(Script File)插槽中。
绑定完成:
脚本
function on_begin_play(component)
local owner = component.GameObjectOwner
if not nx_is_valid(owner) then
return
end
local mesh_com = owner.MeshComponent
if not nx_is_valid(mesh_com) then
return
end
local vis = mesh_com.VisBase
if not nx_is_valid(mesh_com) then
return
end
nx_callback(component, "on_tick", "tick")
end
function tick(component, delta_time)
if not nx_is_valid(component) then
return
end
local owner = component.GameObjectOwner
if not nx_is_valid(owner) then
return
end
local mesh_com = owner.MeshComponent
if not nx_is_valid(mesh_com) then
return
end
local vis = mesh_com.VisBase
if not nx_is_valid(vis) then
return
end
local curve_count = vis:GetCurveCountInSkeleton()
if curve_count < 1 then
return
end
local curve_name = "curve_test"
local bone_count = vis:GetConnectedBoneCountFromSkeletonCurve(curve_name)
if bone_count ~= 2 then
return
end
vis.Speed = 0.5
local bone_name1 = vis:GetConnectedBoneNameFromSkeletonCurve(curve_name, 0)
local bone_name2 = vis:GetConnectedBoneNameFromSkeletonCurve(curve_name, 1)
if not nx_find_custom(vis, "curve_index") then
vis.curve_index = vis:GetCurveIDByNameInSkeleton(curve_name)
end
if vis.curve_index < 0 then
return
end
local value = vis:GetCurveValue(vis.curve_index)
if value > 1.0 then
local v = 1.0 + (value - 1.0) * 2.0
vis:SetBoneScale(bone_name1, 1.0, 1.0, 1.0)
vis:SetBoneScale(bone_name2, v, v, v)
elseif value < 1.0 then
local v = 1.0 + (1.0 - value) * 2.0
vis:SetBoneScale(bone_name1, v, v, v)
vis:SetBoneScale(bone_name2, 1.0, 1.0, 1.0)
else
vis:SetBoneScale(bone_name1, 1.0, 1.0, 1.0)
vis:SetBoneScale(bone_name2, 1.0, 1.0, 1.0)
end
end
运行
依次点击工具栏创建游戏对象(Create Game Object) -> 默认Pawn(Default Pawn)创建一个默认Pawn,并调整该对象的角度(Angle)和位置(Position)。
在观察器(Inspector)面板中,将默认Pawn(Default Pawn)的自动持有玩家(Auto Possess Player)属性设置为Player 0。
点击运行按钮后,可查看效果。