尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

IK到底在什么时候被用上:聊聊反向动力学的实战场景

IK到底在什么时候被用上:聊聊反向动力学的实战场景 拆流水线的时候,第四关是IK求解。我当时说它因为反着算所以贵,还举了脚踩斜坡、手握枪把两个例子。评论里有人问,IK具体都用在哪些地方?是不是只有脚和手?什么时候该上,什么时候没必要?这问题挺实在的。IK这东西,你不用它角色照样能动,但用好了能让画面质感上一个台阶;用不好或者滥用,性能白白搭进去还看不出效果。这篇就把IK都在哪些场景派上用场捋一遍,顺便说说每个场景值不值得开。先花一分钟说清楚IK是啥怕有人没看前面的,这里快速补一下。普通动画是正向的:你给定每个关节转多少度,骨头自然就摆到某个位置。这叫正向动力学(FK),很直接。IK是反过来:你先定好末端要到哪儿,再反推中间的关节该怎么转。比如我要让手到达门把手这个点,那肩膀、大臂、小臂各转多少,是引擎反推出来的。为啥要反着来?因为有些情况下,末端的位置是运行时才知道的,你没法提前把动画做死。门把手的高度、地面的坡度、敌人的头在哪儿——这些都是动态的,只能实时算。这就是IK存在的意义。反推是个求解过程,往往要迭代好几轮才能得出合理姿势,所以贵。记住这个前提,下面看它都用在哪。场景一:脚步贴地(最常见,也最值)这是IK用得最多的地方,没有之一。问题是这样的:美术做走路动画的时候,是假设地面是平的。可游戏里地面哪能都是平的——上楼梯、走斜坡、踩石头。如果不处理,你就会看到角色的脚要么悬在半空,要么陷进地里,特别出戏。脚步IK干的事,就是运行时往地面打射线,看看脚下面到底是什么高度,然后把脚钉到实际的地面上,同时反推膝盖怎么弯、盆骨要不要抬高一点。不开脚步IK: 角色走斜坡,脚还是水平的,一只脚陷进坡里 开了脚步IK: 两只脚各自贴合坡面,膝盖自然弯曲,盆骨微调这个场景我强烈建议做,尤其是玩家能近距离看到的角色。人眼对脚不贴地特别敏感,一眼就能看出假。投入产出比很高。但记住前面几篇的调子:按距离开关。近处的角色开,远处的直接关。远处角色的脚穿一点地面,谁也看不见,没必要为它付那个射线检测加迭代求解的钱。代码前面给过,这里不重复了。场景二:手部对齐(FPS和交互的刚需)手的IK场景比脚更杂,我分几种说。双手握武器。FPS里角色端着枪,右手握扳机,左手扶枪身。问题是换枪的时候,不同武器的握把位置不一样。你不可能给每把枪都单独做一套手部动画,太费了。常见做法是:主手的动画做死,副手用IK贴到武器上预设的握持点。换武器时,副手自动跟着新武器的握持点走,省下大量重复动画。开门、按按钮、爬梯子这类交互。角色去开门,手得准确落在门把手上。可门把手的高度、角色站的位置每次都可能不同,做死的动画对不齐。用IK让手实时对准交互点,就自然多了。爬梯子同理,手要一档一档抓在横杆上。搭在掩体、墙面上。角色贴着掩体,手扶在掩体边缘;或者靠墙,手撑在墙上。墙和掩体的高度是场景决定的,只能用IK实时贴。手部IK的共同特点是:位置动态、又要求精确对齐。这种必须对齐一个运行时才知道的点的需求,正是IK的主场。做死动画永远对不准,IK才是正解。场景三:头部与眼睛朝向(便宜又出彩)这个场景很多人忽略,但其实性价比不错。角色的头(有时候加上眼睛)转过去看向某个目标——看向玩家、看向声音来源、看向正在交谈的人。这能让角色显得有意识,不是个只会走直线的木头。严格说头部朝向不完全是传统意义上那种要迭代求解的IK,它更接近让某根骨头朝向一个目标的约束(LookAt),计算比脚手那种链式IK便宜不少。Unity的Animator直接提供了SetLookAtPosition和SetLookAtWeight,用起来很简单。voidOnAnimatorIK(intlayerIndex){if(lookTarget!null){// 让头看向目标,weight控制看的程度animator.SetLookAtWeight(1f);animator.SetLookAtPosition(lookTarget.position);}}这个便宜,近处的NPC都可以开,效果立竿见影——一群NPC里,有的转头看你,有的看别处,场景一下子就活了。远处的照样可以关。场景四:程序化的身体调整这类偏进阶,但值得知道有这么回事。受击反应。角色被打中肩膀,肩膀往后一缩;被打中肚子,身体前倾一下。这种反应如果每个部位、每个方向都做动画,量太大。用IK或者约束做程序化的骨骼偏移,能用少量代码覆盖各种受击情况。手持重物的姿态。角色扛着个重箱子,身体应该往后仰一点来平衡;拎着重物的那只手,肩膀应该被坠下去一点。这些细微的平衡调整,用程序化的方式加上去,比做一堆动画灵活。盆骨/脊柱的自适应。配合脚步IK,当两只脚踩在高度差很大的地方(比如一只脚在台阶上一只脚在台阶下),盆骨得相应地调整高度和倾斜,不然身体会僵。这类调整通常用Unity的Animation Rigging包来做,它提供了一套现成的约束组件,而且底层走Job System,性能比自己在OnAnimatorIK里手写要好。角色多的时候值得考虑。场景五:武器/工具的辅助瞄准FPS里还有个常见需求:让武器的枪口精确指向准心命中的那个点。玩家瞄准的时候,准心可能落在屏幕任意位置,而角色手里的枪,枪口方向得跟着微调,让子弹看起来真的是朝准心飞的。这种上半身跟随瞄准点的微调,也可以用IK或者约束来实现,让枪口和瞄准方向对上。敌人也一样。敌人要瞄准玩家开枪,它的上半身、武器得转向玩家的位置。这个位置是实时变的,做死动画不可能覆盖所有角度,用IK/约束让它动态对准是标准做法。什么时候别用IK讲了这么多能用的场景,反过来说说什么时候忍住别用。远处的角色。反复强调了,离玩家远的、看不清细节的,IK能关就关。它的效果全在细节上,看不清的时候等于白花钱。根本不会被近距离观察的角色。有些角色设计上玩家就不会凑近看,比如某些背景群众,这些没必要上IK。能用做死的动画搞定的情况。IK是为了应付运行时才知道的动态位置。如果某个动作的目标位置其实是固定的,那做一个动画clip就行,别为了用IK而用IK,又贵又没必要。数量巨大的同类角色。一大群一模一样的杂兵,给每个都开全套IK,累积开销吓人。这种情况要么整体不开,要么只给离玩家最近的几个开。判断的核心就一句话:这个IK带来的视觉提升,玩家看得到吗?看不到就别开。性能上再啰嗦两句IK贵在两个地方:一个是脚步IK那种要打射线找地面,射线检测本身有成本;另一个是链式IK的迭代求解,一次要算好几轮。所以优化IK,除了前面说的按距离开关,还有几个点:射线检测能省则省。脚步IK的射线,可以不用每帧都打,隔几帧打一次、中间用上次的结果,一般也看不出来。优先用Animation Rigging这类走Job System的方案,而不是全堆在OnAnimatorIK主线程里手写。角色一多,能不能上多线程差别很大。IK Pass记得只在需要的层开。Animator里每一层都有IK Pass的开关,别在用不着IK的层上误开了,那是白白的固定开销。收个尾IK说到底,是为了解决一类特定问题:动作的目标位置是运行时才确定的动态值,做死的动画对不齐。脚要贴运行时的地面,手要对运行时的握把、门把手、掩体,头要看运行时的目标,枪要指运行时的准心——凡是实时对齐一个动态目标的需求,IK就是答案。但它贵,贵在反推求解和射线检测。所以用IK的原则很清楚:该出彩的地方(近处、玩家看得清的细节)大胆用,看不见的地方(远处、背景角色)坚决关。把钱花在玩家能感知到的地方,这才是优化的本质。
返回列表