UnityIK骨骼插值没有更新|AnimatorIK更新骨骼流程|骨骼信息重置
根据生命周期图以及分析工具我们可知道,进行Animator动画生命周期的流程大体是:【ProcessGraph(处理动画机)】...-》【ProcessAnimation(处理动画)】-》【IKAndTwistBone】->【WriteTransform】=》【OnAnimatorIK】=》【IKAndTwistBone】=》【WriteTransform】---Loop(0..n)--->【OnAnimatorIK】。
Unity Animator规定关于IK的操作在OnAnimatorIK中进行。按照要求我们使用如下代码对Left-Foot处作IK同时进行Mathf插值平滑处理:
public void OnAnimatorIK()
{
Vector3 currentFootPos = animator.GetIKPosition(avatarIKGoal);
var currentFootY = Mathf.Lerp(currentFootPos.y, targetFootPos.y , feetToIKTargetSpeed * Time.deltaTime);
currentFootPos.y = currentFootY;
animator.SetIKPosition(avatarIKGoal, currentFootPos);
}
但得到的结果并不符合我的预期,貌似插值只执行了一次,并没有持续插值。显然这按照Update的更新逻辑来看这是不合理不可能出现的。经过测试,发现在每次进入OnAnimatorIK时currentFootPos的值并没有按照逻辑设想的那样更新。可是为什么它却渲染在了屏幕上了呢?
经过分析我认为,我们写的逻辑肯定是有执行有进入的。那么出现这种问题,我想内部一定是在IK前的某阶段(可能是ProcessAnimation)对原骨骼的IKPOSITION信息作了保存(不进行IK处理的骨骼信息)。在动画生命周期的下一帧的某一阶段,IK处理过的IKPOSITION就会重置!如果在随后的OnAnimatorIK中没有修改IKPOSITION,那么在OnAnimatorIK结束后就会将原骨骼的IKPOSITION信息写入Transform,即恢复原骨骼信息。这样一来不就说通了吗?
下面用一个最直观最简单的结果验证我的猜想:
我们只是单纯的开关 IKToggle,只是不想下一帧执行IK处理的逻辑,但是画面中的骨骼进行了自动重置。如此一来很明显了,我的猜想是可靠的。而在【AnimationRigging】插件中,IK处理又是另外一种流程!
怎么办呢?
它保存原骨骼信息,那咱们就保存IK处理之后的骨骼信息呗。干它丫丫的!
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/unity/3243/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
原来是这样啊,感谢。