Skip to main content

惯性过渡

概述

惯性过渡(Inertia Transition)是一种动画过渡方式,在过渡时保留原动画的惯性,在一些由运动到静止的过渡中更加自然,同时性能优于交叉淡入淡出(Cross Fade)

使用交叉淡入淡出(Cross Fade)

CrossFade

使用惯性过渡(Inertia Transition)

InertiaTransition

使用惯性过渡

插槽节点中的应用

在插槽节点的属性窗口(Property Window)中,可设置其过渡模式( Transition Mode)设置为惯性过渡(Inertia Transition)

image-20230423112924927

按整型混合姿势节点和按布尔型混合姿势节点中的应用

按整型混合姿势(Blend Pose By Int)节点和按布尔型混合姿势(Blend Pose By Boolen)节点的属性窗口(Property Window)中,可将其过渡模式(Transition Mode)设置为惯性过渡(Inertia Transition)

按整型混合姿势节点:

image-20230428130625703

按布尔型混合姿势节点:

image-20230423154938623

状态机中的应用

状态机的状态过渡模式。在两个状态之前的迁移属性窗口(Property Window)中,可将状态迁移的过渡模式(Transition Mode)设置为惯性过渡(Inertia Transition)

image-20230423164431742

若在以上三种应用中使用惯性混合(Inertia Transtion),均要在它们的后面链接惯性混合(Inertia Transition)节点,如下图所示:

image-20230424175902330

示例

以下为一个具体示例:

创建组合体

参照Actor组装创建一个组合体(Actor).actor),包含SK_Human_tpose、default_stand和default_Hello动画资产。

image-20230428134635030

编辑动画资产

在动画编辑器中,制作后续要插入到UpperBody插槽中的动画序列资产。

资产浏览器(Asset Browser)中,找到所需要的骨架资产default_Hello,右击选择将骨架资产转为动画序列资产(Convert Skeleton To AnimSeq),然后在弹出窗口中可修改动画序列的名称,点击确定(OK)按钮完成转换。

image-20230428141631331

转换完成:

image-20230428141858271

在hello动画序列的资产详情(Asset Details)面板中,设置动画的淡入时间(Blend In Time)淡出时间(Blend Out Time)

image-20230428141823031

通知(Notify)轨道上右击打开快捷菜单,依次点击添加通知(Add Notify)-> 新通知(New Notify),在弹出的新通知(New Notify)窗口中输入通知名称后点点击确定(OK)按钮完成创建。

image-20230428142026039

通知创建完成后,可通过调整通知的位置来调整动画淡出的时间点。

image-20230424095733920

编辑完成后,在动画编辑器中,依次点击菜单栏文件(File)-> 保存(Save All)进行保存。

image-20230428140301068

配置动画树

在动画编辑器中,依次点击菜单栏文件(File) -> 创建(Create),在弹出的窗口中,选择动画树(AnimTree),在动作名称(Action Name)中输入名称,在文件路径(File Path)中选择动画树保存的路径,最后点击是(Yes)完成创建并进入到动画树编辑器(Anim Tree Editor)中。

image-20230428144523386

在动画树中分别添加default_stand序列播放(Sequence Playback)节点、插槽(Slot)节点和惯性过渡(Inertia Transition)节点,并按下图将它们链接在一起。

image-20230423170726483

点击插槽(Slot)节点,在其属性窗口(Property Window)中将过渡模式(Transition Mode)设置为惯性过渡(Inertia Transition)

image-20230423171027562

点击保存(Save)按钮保存该动画树。

image-20230424145429181

输入设置

在组件编辑器中,依次点击菜单栏配置(Config) -> 项目设置(Project Settings),在弹出的项目设置(Project Settings)窗口中,选择输入设置(Input Settings),点击组合映射列表(Combination Mapping List)栏中的 image-20230424100732117 按钮来添加一个新的组合映射(Combination Mapping)

image-20230424101832425

在新的组合映射中,输入组合名称(Combination Name)为Hello,展开键(Key),在键名(Key Name)中为该动画指定一个触发按键,如Four。

image-20230424102403686

配置组合体

在组合体编辑器中,点击资源详情(Resource Detail),然后将默认动作(Default Action)设置为所创建的动画树,设置完成后点击保存(Save)按钮。

image-20230428144635469

创建角色

在组件编辑器中,依次点击工具栏创建游戏对象(Create Game Object) -> 角色(Character)

image-20230424152310403

大纲(Hierarchy)面板中选中所创建的角色,在观察器(Inspector)面板中选中CharacterMesh0(Inherited),将所创建的组合体(Actor)拖入到骨架网格体配置文件(Skeletal Mesh Config File)的插槽中。

image-20230424153845090

拖入完成:

image-20230424154418745

观察器(Inspector)面板中,选中ColliderCylinder(Inherited)和CharacterMesh0(Inherited)分别调整该角色胶囊体和网格体的位置,使胶囊体尽可能在包裹角色的前提下,让角色蒙皮的脚部贴地,胶囊体也需在地面上方。

image-20230428140907772

绑定脚本

选中该角色,然后在观察器(Inspector)面板中点击添加组件(Add Component)按钮,选择脚本组件(Script Component),为该角色绑定脚本。

image-20230424155526158

脚本

脚本初始化中绑定输入。

input_comp:AddCombinationBinding("Hello", IE_Pressed, true, false, true, "Hello_Pressed")
nx_callback(owner, "Hello_Pressed", "on_hello_pressed")

定义回调函数。通过BlendAction接口将挥手动画插入到动画树中的UpperBody插槽中:

function on_hello_pressed(owner)
local actor = character_get_actor(owner)
if not nx_is_valid(actor) then
return
end

actor:BlendAction("hello", false, false, true, 1.0, true, "UpperBody", true)
end

动画通知的回调处理函数。在触发unblend通知时,调用role:UnblendAction("hello")将动画淡出。

function on_action_event(callee, role, action_name, event_name, frame, info)
if event_name == "unblend" then
role:UnblendAction("hello")
end
end