导图社区 TA面试问题概览
面试问题,内容有岩架攀爬、走跑混合、 ik的种类、 爬梯子、 alsv4优缺点等。
编辑于2024-05-15 00:35:00TA面试问题概览
运动系统类别
Alsv4是咋做的左右脚区分起跳
这个是没做左右脚起跳动画的判断,是直接从基础的运动状态直接加的过渡出来
岩架攀爬
1:按键检测,例如走到了要攀爬的点的位置,这个按键是空格,那么就给给空格做一个判断,连续按会怎样,按一下会怎样,这个是影响检测的,如果没有这个,检测线一直执行会很费
2:检测是否有墙体或者岩架,例如如果有,再判断是否有检测通道,就是这个物体上是否有标签,有标签则让攀爬,
3:例如可以攀爬,执行检测,检测到一个撞击点,这个撞击点的位置的-15cm,这个-15是给手留一个位置空间,方便攀爬用的。例如此为A点
4:接下来分两种情况,一种为翻墙,一种为岩架 如果是翻墙则再在A上增加胶囊体半高上下检测有无碰撞 岩架攀爬在有移动输入时检测移动方向上有无攀爬点
5:当执行这些攀爬的时候,需要计算出来需要位移的距离,例如分成爬10m和1m的不同距离,需要把跟运动的动画拆分,如果在在ue就是转换为单帧动画,比如我只有五米的攀爬动画,等我动画腾空的时候,把差距出来的位移匹配起来就可以,岩架左右攀爬也是同理
ik的种类
CCD
旋转启发法,就是通过旋转不断逼近目标点
Favri
多次位移逼近目标
TwoBone
构造三角函数,用余弦来计算的
爬梯子
玩家在开始爬一个梯子的时候,首先要把角色的Attach到梯子上面,同时播放响应的动画来配合。一旦玩家爬上了梯子,就应该进入了特殊的 爬梯子状态。这个状态仔细想想,其实和前面的爬墙基本上相似,不同的就是爬梯子的速度,而且玩家可以随时停止。 随时停止怎么做?两个思路: 参考Walking移动的计算,计算速度CalcVelocity的时候使用自定义的摩擦系数Friction以及刹车速度(这两个值都设置大一些) 当玩家输入结束后,也就是加速度=0的时候,直接设置速度为0,不执行计算Velocity 另外,要想让爬梯子表现的进一步好一些。看起来是一格一格的爬,就需要特殊的控制。玩家每次按下按钮的时候,角色必须完整的执行一定位移的移动(一定位移大小就是每个梯子格的长度)。这里可以考虑使用根骨骼位移RootMotion,毕竟动画驱动下比较容易控制位移,不过根骨骼位移在网络条件差的情况下表现很糟。 还有一个可以进一步优化的操作,就是使玩家的手一直贴着梯子。这个需要用IK去处理,UE商城里面有一个案例可以参考一下。
alsv4优缺点
因为应用了大量的融合和匹配,所以动画细节表现十分充分
不支持网络同步 ***尽量不说后边这块*****根动画往往有网络同步问题
动画风格单一,因为他应用了叠洋葱的蓝图模式并且,这套系统只能适用于这样的动画风格不一更改,例如走跑的那个胸腔,如果不翻转胸部就只能这样搭建
耦合度太高了,你中我有,我中有你,易读性不高
放眼现在的话,新的特性例如ControlRig也没有,并且没有大量的利用好多前程还是个蓝图项目所以性能差一点点
综合来讲,这是一个非常不错的学习类的项目,但是不是一个好的game ready 的3c解决方案
走跑混合
首先决定是跑还是走还是冲刺,是角色的状态给到我的,这个状态的判断条件可以是速度加速度,或者加速度方向和速度方向来决定或者按键决定
另外如果想实现比较具有细节的走跑的前提是需要计算三种不同的值
步态:指角色现在处于行走,小跑,冲刺三个状态中的哪一个。角色的步态应当只取决于玩家的按键控制,而非取决于角色当前的移动速度。
先计算walk/run的blend的值,根据玩家不同的状态分别对应出0/1的值来给到动画
步幅:指角色目前的迈步幅度。在相同时间内,角色的步幅越大,移动的速度越快(反过来说也就是速度越快,步幅越大)。因此步幅是一个为了使动画看起来足够自然而必须调整的数值,并且是和玩家的速度挂钩的。
步幅是根据速度来匹配一个随速度变换而变化的曲线数值,就是步幅随着速度的增长而线性增长,只是alsv4用的是曲线这样更好的动画效果,然后咱们根据是什么样动画给他匹配不同的步幅曲线
迈步频率:在相同时间内,步幅相同的情况下,迈步频率越高,玩家移动速度越快。因为走和跑完全可以在速度相同的情况下拥有不同的步幅。并且我们需要用播放速率来控制角色迈步频率,而非用行走和奔跑动画的混合(因为多数情况下行走的迈步频率比奔跑的慢)
然后就是步频,步频的计算方式很简单,就是用角色当前的速度除以当前所对应的步态下的最高速度。
传统一维混合弊端
直接用走的动画和跑的动画进行1D混合,是体现不出步幅差距的。行走的动画完全可能有跟跑步动画一样的步幅。即使在一维混合空间的轴上放三个动画——静息姿势,走路动画,跑步动画,那也只有在速度没有超过行走速度时才能实现步幅按速度控制。
同时可以控制步幅和迈步频率的走跑混合动画,我们需要将混合空间做成这样
ALS放在混合空间最左端的不是Idle姿势,而是一个设计过的静态的姿势,且走跑各不相同。这是因为直接从Idle混到走跑时会有些不协调,且ALS的作者是没有制作起步的动画资源的,因此ALS通过把最左端的动画做成了一个“预备”(就是你跑步前的预备姿势),将这个预备姿势与奔跑动画做步幅上的混合,来近似得到“起步”这一过程。
怎样计算这个三个值呢
先计算walk/run的blend的值,根据玩家不同的状态分别对应出0/1的值来给到动画
步幅是根据速度来匹配一个随速度变换而变化的曲线数值,就是步幅随着速度的增长而线性增长,只是alsv4用的是曲线这样更好的动画效果,然后咱们根据是什么样动画给他匹配不同的步幅曲线
然后就是步频,步频的计算方式很简单,就是用角色当前的速度除以当前所对应的步态下的最高速度。
另外值得一提的是,混合的中间,例如处在走跑之间这样状态,可以采用给walk/run各自动画打一个曲线,例如走是0 run是1,然后再用这个0~1的曲线值就可以决定行走步幅曲线和奔跑步幅曲线的混合度,也可以做步频的混合程度
八项移动***
八向移动,指的是角色拥有向前后左右,左前,左后,右前,右后移动的动画。当角色的控制器旋转与角色的速度向量之间产生了一定大小的夹角后,角色的动画需要发生相应的变化。
举两个例子,一个是速度方向不变,控制器方向旋转:比如当前角色在我们按住“W”时,沿着x轴(世界坐标系下的)直线向前跑,此时我们旋转鼠标,令控制器向右旋转至y轴(世界坐标系下的),那么角色做出一个向右前方跑动的动作才会显得自然(此时w还是一直按着)。
另一个例子是控制器方向不变,速度方向改变:还是当前角色在我们按住“W”时,沿着x轴(世界坐标系下的)直线向前跑,此时我们在按住“W”不放时,再同时按下“D”,且鼠标保持不动。那么角色同样要做出一个向右前方跑动的动作才会显得自然。
究其根本就是:控制器和速度方向的变化,引起了控制器和速度夹角的改变。因此我们要更改动画,以体现出这种改变。
所以说计算原理就是:在每帧都计算出角色速度和控制器旋转之间的夹角,并用它来更新动画。
传统方法的弊端:例如使用混合空间来混合,就是在一个坐标轴中设定为-180~180度,在其中分布八向移动的各个动画。
他的主要问题在于“跳变”,虽然说谨慎地选择混合时间可以勉强解决这个问题——混合时间短会使得跳变时的动作快速切换导致的变形更加明显,而混合时间长会使得角色左右切换时出现中间的两步向正前方“原地踏步”。
综合来讲可以用 状态机以及为角色定制移动意图来实现
为了克服跳变则不能采用角色速度与控制器夹角是多少,就采用与之相应的移动动画的方式,这个夹角只会用于表示“移动意图”,具体采用哪一种动画序列,需要结合移动意图和角色当前使用的动画序列综合决定吗,例如夹角在-70~70度为前,70度~110度为右,-70度~-110度为左,剩下为后。
咱们依此来搭建状态机,就是八项移动六项移动状态,分别为前后左右,左前左后,右前右后(他为啥可以是六项状态机八项移动,前后不用讲了吗,左右在状态机里面没设计,是因为他的左前右前就是他的正左正右的状态,分别为胸部朝左正着走,和朝右正着走,而左后为胸口潮右,倒着走,右后是胸口朝左倒着走,这样设计一是为了避免胸部反转,就算是180度变化也可以很好的融合,所以是8向移动6个状态)
移动意图解决的问题是在状态节点中的转换,而速度混合度解决的问题是在状态节点内的动画混合。
但是除了状态机和移动意图外还需要精细的控制动画如何混合,所以需要计算速度混合
速度混合度实际上是将角色的相对速度沿角色坐标系的XY轴正交分解,得到角色相对速度在X和Y轴上的分量。由于角色坐标系下的XY轴实际上就是指前后左右,因此这个分量就指出了角色当前向左(右)移动的程度和向前(后)移动的程度。
将相对速度的x分量和y分量除以(x^2+y^2)的根号,赋值为相对X和相对Y。
再个这个速度混合做一个阻尼效果或者插值效果,让他平稳变换
这样:在角色移动状态改变的瞬间,移动意图会立刻变化,状态机会从一个节点移动到另外一个节点,过渡条件会自动将两个节点中的输出姿势进行混合。而由于速度混合使用了插值,此时即使状态机已经发生了状态节点的跳动,速度混合自身却还在均匀的变化,这样一个不会跳变的八项状态就基本完成了,当人后续还有一点其他的细节
原地旋转
概述:摄像机的视角和角色朝向的夹角达到一定角度(假设以45度为限)后就播放一个旋转动画。由于每次旋转的角度可能是45~180度之间的任何一个值,而为此做许多旋转角度大小不同的动画显然是非常不经济的 因此我们可以将旋转动画分为“小旋转”和“大旋转”,“左转”和“右转”,这样一共只要4个动画资产就够了。 也就是说使用逻辑来控制,用SetWorldRotation,AddActorWorldRotation等函数来控制角色的旋转,动画呢就让角色的脚动两下,做出一幅“正在挪动脚来旋转”的样子就行了。
具体实现:首先我们肯定要先获取一下角色当前的朝向与控制器之间的夹角,如果这个夹角大于阈值,我们才能执行原地旋转 例如夹角大于多少度,或者延迟一定时间,或者玩家没有移动输入等判断条件通过才可以旋转 这里面其实唯一的问题在于动画例如就是90和180,可是玩家可能旋转任意角度例如45度我们应该怎么办? 首先给已经有的动画例如90度的那个创建一个他的曲线资产,动画转多少,曲线累计就是多少数值,然后可以将曲线旋转量/90 X 实际旋转量例如那个45度 进一步修正乘以 播放速率,
Control Rig概述
本来是DCC做出动画给ue用,但是有了control rig之后 可以改变这些,因为可以直接再引擎中操纵动画了,另外 本来动画蓝图中复杂逻辑,例如ik这些,都可以迁移到 control中去做逻辑判断,手部吸附啥的,另外,程序化动画,比如蜘蛛行走什么的比较方便 具体一点就分为三点 初始化:骨骼名称一样,可以直接复用绑定 前向解释器: 处理ik效果 后向解释器: 一般k动画用,但是其实还是不方便,没有dcc好使,所以一般不用
不同之处在于当你双击此结点调到对应的IK Rig资产时发现,其不像Control Rig可以写行为逻辑,而是通过创建解算器(Control Rig则是自己写逻辑),然后动画蓝图传参给它来进行动画调整。
IK Rig
IK Rig是UE5新推出的基于IK的绑定工具,为动画重定向和角色动画实时IK解算提供了全新的技术方案。:例如说可以用于骨骼网格体执行姿势编辑。然后,生成的IK Rig资产可以嵌入到任何动画系统中,例如动画蓝图,以便动态修改姿势的解算器参数。 此外,IK Rig 重定向 系统可以用于在不同比例的角色之间传输动画,无论是运行时还是离线创建新动画序列。
ik重定向和虚幻四位移重定向区别:ik重定向可以支持fk和ik但是 ue4位移重定向支支持fk IK重定向支持在骨架完全不同的角色间进行动画资产重定向或实时动画重定向。UE4的重定向在骨骼结构不同的动画资产之间重定向往往效果不如IK重定向理想。同时不支持骨骼结构不同的网格体之间的实时重定向
惯性化过渡
严格上来说,惯性化是一种动画后处理,它用来取代传统的淡入淡出,来实现更加流畅的混合效果。惯性化不在乎源动画的状态,而淡入淡出则无时无刻都要计算源动画和目标动画。惯性化可以在许多地方使用,比如说状态机直接的过渡。 惯性混合非常善于处理短混合,并且惯性混合可以被其他混合所中断。 惯性混合可以在不同局部空间执行,比如上半身和下半身分别执行不同的惯性混合。可以通过按骨骼分层混合来实现这个效果。 惯性混合节点尽量靠近函数的输出,这样性能好,同时消除其他混合带来的干扰
C++中指针和引用区别
本质上都是表示地址,没啥大的区别,
指针分类
智能指针
弱指针
飘带再游戏内怎么实现?两个动画的飘带差别较大,怎样混合
事件蓝图和动画蓝图的联系是怎样的
操作层-获得玩家的操作 逻辑层-对于玩家的操作和具体的逻辑进行判断给定一定的数值
动画逻辑根据逻辑层面给定的数值再进行计算,计算出动画所需要的值往往都是0~1 根据动画逻辑计算的结果,进行具体输出动画姿势
比如说我要释放一个技能这个流程应该是怎样的?
各种过渡的源代码底层逻辑
让你做一个走跑冲刺停步你的思路有哪些
两个动画差别巨大应该怎么办,才会不卡,应用什么功能?
主题
主题
浮动主题