Initialize BP
首先,创建一个Character类型的BP来作为对象的整体操控集合(Character是一种特殊类型的Pawn,默认带有Arrow、Movement和Mesh Component),将目标Skeletal Mesh指任到Mesh component上的Mesh上;
通过绑定好的SkeletalMesh创建Animation Blueprint,将ABP指认到上面Character类型的BP中的MeshComponent上的Animation上;
再通过绑定好的SkeletalMesh创建Control Rig,用Control Rig来驱动Animation Blueprint:
Control Rig
基础_Transform
接下来在Control Rig中进行逻辑制作。基础用法,通过选中的某跟骨骼进行相应Get/Set 位置调整:
创建骨骼名字数组集合
为什么要创建Array,是因为会遇到有重复同类型的多个Rig,比如:蝎子就会有多个脚,这样的话就可以把同类型的脚的名统一放在一个Array里面,以方便进行修改
Control Rig 的界面跟Blueprint比较相似,现创建一个Array类型的变量,在变量Default Value里面将目标名称填写上:
WorldSpace vs RigSpace
From World:WorldSpace > RigSpace
To World:RigSpace > WorldSpace
这两个是不同的空间位置信息,要将骨骼本身的RigSpace本地信息转换到WorldSpace中的实际位置才有意义,则需要在运行一开始的时候将RigSpace的信息存储到一个自建的Array类型的Transform变量中,并且进行To World 节点转化:
可视化Transform信息
需要注意的是目前使用的是For Each节点,会造成不必要的性能消耗,后续要改进:
Full Body IK
Full-Body IK官方文档 可以动态调证姿态。
The overall solver method is built on a Position Based IK framework, which enables faster rig performance, per-bone settings, preferred angles, squash and stretch, and more. FBIK is designed to act as a procedural adjustment tool within Control Rig, such as for ground alignment, or arm reaching behavior.
就可以根据上面存储的蝎子的Rig信息进行动态调整设置:
函数封装
通过上面的节点不难看出,整个界面小显得有些杂乱,所以,可以将功能节点集成到一个函数中。选中要集成到函数的节点,右键>Collapse to Function
World Transform > Rig Transform in solver
当我们编译保存后进入场景后会发现,蝎子的位置发生了偏移。这是因为World Transform和Rig Transform没有做相应匹配的原因。
首先,在ContrRig蓝图的construction event里面对蝎子脚进行了rig space到world spcae的转换,但是,在
Forwards Solve里面设置了FullBodyIK函数的逻辑,其中也涉及到Transfrom信息的读取,但是在这部分Transform的源头应设置为RigSpace,所以要在函数SetFullBodyIK中添加From World节点进行转换:
编译保存后,再回到场景中,点击Simulation就会看到,这是蝎子的位置没有了偏移问题。但是,当我们移动时也无法进行移动,是因为目前Transform信息都存在了WorldSpace中。
Calculate Velocity Function
公式:Distance / time
首先,创建一个函数:CalculateVelocity,关于速度的计算都在这个函数中,方便管理和调用。
因为首先要获得距离distance的值,那么要获得世界空间中的当前位置的上一帧的位置;获得世界空间下的世界时间间隔倍率;通过上述结果计算Velocity。
所以创建三个相应的变量:
功能实现:
并且需要手动输入以下cvar命令开启Debug模式:
a.AnimNode.ControlRig.Debug 1
ControlRig.EnableDrawInterfaceInGame 1
编译保存后,启用Simulation模式后,手动移动BP就会看到Debuge的速度信息显示。
Smooth the Calculate Velocity
经过上面的步骤会发现,速度信息显示会不连贯,需要对速度进行平滑处理,使用Spring Interpolate节点:
节点注释
Cycle and Cycle Function
目的是创建一个随着时间推移不断增加的计时器,并使用它来生成一个在0-1之间循环的周期。