untiy 反向动力学插件 Final IK

一般游戏中的人物的动画都是通过加载一个骨骼动画,来表现人物动作.   动作由游戏动画师,在3d软件中调整人物骨架在不同时间的姿势, 生成连续的动画. 或是由动作捕捉,记录人的动作,最终导入游戏引擎内.

这两种方式虽然制作过程方式不一样,但最终对于游戏引擎来说,没有什么太大的区别-----两者的动作都是固定,不能改变.    但是在游戏中,这种类型的骨骼动画常常不能满足需求,比如: 一个捡起地面上道具的动画,在游戏中道具不一定在地面上,而是在桌子上,或是放在墙上,.而我们不可能为每种情况都去做一个对应位置的捡道具的动画,在这个时候,我们就需要一种新的方法来,来驱动全身的骨骼,去完成"捡"的动作.   而这就要用到Final IK这个插件.此外对于没有骨骼的物体组合,比如机械臂,也可以实现非常自然的动作. 

为什么要用这个插件:

  • 相比较unity的自带IK系统,final ik 设置更加方便,用途更广.有很多情景化的应用,如针对和物体交互的动作系统.
  • 用好这个插件,就可以使用少量的固定动画,在此基础上融合IK 动作,做出千变万化的交互动作!  对于制作rpg,fps游戏非常有用.
  • VR游戏也是一个非常有趣的应用方向: 现在的第一人称的vr游戏基本没有身体,只有一双手,如果通过vr手柄和VR眼镜的定位信息,来驱动游戏中玩家人物的全身骨骼,近似得同步现实中玩家的动作,一旦实现,便会大大提高代入感.

Biped IK:比Unity自带IK多一个头部IK控制

Full Body Biped IK:上面的强化版,控制部位更多(手肘、肩部、腰部、膝部、胯部等)

Time step:等于0,每帧(LastUpdate)解析一次IK,大于0,则是固定时间,固定的频率解析IK

Fix Transforms:打钩后,即使在人物没有播放动作的情况下,也会解析骨骼IK,建议勾上

References:角色骨骼,添加此脚本后,自动识别骨骼

扫描二维码关注公众号,回复: 4276401 查看本文章

Weight:Animator动画和Ik动画融合的权重,0表示不收IK动画影响,

Iterations:IK动画的解析次数,数值为0,禁用Ik,数值越大IK动画越平滑,在角色离得比较远时,可以降低该数值,优化性能。

Body,:身体的IK的控制器,通过这些IK控制器的位置来影响全身骨骼。

Target:Ik控制器引用的物体,Ik控制器同步该物体的位置和旋转角度,

Postion Weight:同步引用物体的位置权重,数值为0,不受target的影响,数值1,完全被target控制

UseThighs:是否腿部下体

Spine Stiffness:脊椎僵硬值,数值1脊椎不会弯曲

PullbodyVertical:手部IK影响身体纵向的权重

PullBodyHorizontal:手部IK影响身体横向的权重

Spine Iterations:脊椎骨骼的解算次数

Spline Twist Weight:胸部朝向对扭转脊椎的影响权重,(比较耗性能,没什么脊椎扭转,设为0)

Maintain HeadRot:保持头部转向不受其他IK影响

LeftArm:左手左肩的IK的控制器,通过这些IK控制器的位置来影响全身骨骼。

Rotation Weight:Target的朝向对IK控制器的影响权重,为1时:手部的转向和Target一直,胳膊会受到影响而扭曲

Maintain Relative Pos:保持胳膊和胸的相对位置一直,如果是腿部则和臀部一致

pull:对身体的拉力,如果其他手脚的Ik控制器的Pull值为0,则全身上下都受此IK的拉力影响

Reach:收获叫IK控制器位置器顶部关节(关节和臀)的吸力,值越大,顶部关节越解决他

Push:手或脚IK控制器位置离其顶部关节比较近是,会对顶部关节产生一个排斥力,使两者保持距

Bend Goal:膝盖或肘部关节朝向的方向

Bend Goal Weight : Bend Goal影响朝向的权重

Mapping Weight:整个臂膀或腿部受IK影响值

Maintain Hand Rot:保持手或脚的旋转值不变

步骤:

a、给模型添加该组件脚本

b、填入根节点

c、要控制某个IK就增加权重,运行时就出现有一个立方形控制器,通过它可控制对应的IK

d、脚本控制:

public FullBodyBipedIK ik;

public FullBodyBipedEffector effector;//枚举变量,自己选择

ik.solver.leftHandEffector.position = leftHandTarget.position;

//给右手IK控制点赋位置,即让右手移动到指定点

ik.solver.GetEffector(effector).position = target.position;

//给指定部位赋目标

Grounder FBBIK:(使角色在上下楼梯的时候正确走上每一个台阶)

步骤:

a、给模型添加该组件

b、参数填写模型对象

c、模型要添加刚体及碰撞器

d、运行后,模型脚部的网格会贴合地形(脚掌会保持平面,但是会根据地形有不同的倾斜)

e、只需要行走动画,就可以呈现出在各种地形(楼梯、斜坡)上行走的动画效果

Grounder IK:效果同上,为未知足数的模型可用,足数可自定义

步骤:

a、给模型的每条腿添加limb IK,并从腿根到脚填入骨骼参数

b、给模型添加grounderIK组件,并填入所有腿、模型网格对象及角色控制器对象

c、自定义行走控制器,运行后可在任意地形上行走

Aim IK:目标(提供一个目标的位置)

Time step:为0,每帧解算一次IK动作,<0,便会以固定频率来解算IK

Fix Transforms:如果打钩,即使在没有播放动画的情况下也解算IK,建议勾上

Target:注释目标

PoleTarget:被约束注视的物体,它的y轴,(或有下方Pole Axis参数定义的轴向)所指向的目标

Aim Transfrom:被约束注视的物体

Aim Axis:注视的轴向

Pole Axis:垂直于注视方向的轴向

Weight:注视的权重,0表示不注视

Pole Weight:垂直注视轴向的权重

Tolerance:如果超过上一次动作偏差的角度,便会停止解算IK,如果为0,则将在该帧内解算max  lteration的数值次数

Max Iteration:每帧最多解算次数,如果Tolerance为0,该参数有效,如(如果要得到更平滑的IK动作,可以调高该数值)

ClampWeight:限制骨骼注视的影响范围,如果数值为0,即注视目标在身后180度位置,脊椎依然会转过去注视,但是会有识别错误,为0.5:注视有效范围在正前方180内,为1:没有注视效果

Clamp Smoothing:识别范围有过度效果,不会因为刚刚超过Clampweight值,便马上转向

Use Rotation Limits:如果clampweight不为0;这在每帧的结算时会限定骨骼的转向

Bone:此处填入的骨骼不能有分支,如同填入两只手臂的不被允许的,同时要按照层级关系从上到下填入列表,(如顺序:脊椎1,脊椎2,左肩,左手肘,左手),也可以将被约束注视目标(AimTransfrom)填入

weight:控制每个骨骼影响的权重,一般越靠近臀部的脊椎受影响越小。

a、在模型头节点处添加Aim空物体并reset

b、给模型添加Aim IK组件,并填上Aim Transform及根脊椎到头的4节关节(可以设置权重)

c、创建目标target(空物体)于脸的正前方,

d、在模型上添加空物体Pin,位置与target一致

e、给target添加Aim Boxing脚本,参数为模型对象及pin


f、运行后移动target,模型的脸带动上半身的身体并始终朝向target

Hinge Joint:锁链关节(几个物体相连接)

LookAtIK:让模型朝向某点,作为头部朝向时优于Aim IK,而且容易配合biped ik使用。

步骤:

a、给模型添加LookAtIK组件

b、添加头部

c、从根部到颈部添加spine

d、运行

Limb IK:(肢体)让身体上的肢体朝一个方向

3个点,连接3节骨骼,末端点带动2节骨骼,注意添加Bend Goal控制收缩时的方向

1.在Bone位置处添加骨骼(一段骨骼)

2.在Bend Goal添加一个目标作为骨骼的方向

Interaction Target:交互目标(肢体和物体进行交互)

1.把想要交互的肢体复制一遍;

2.把复制的肢体上添加以上组件;

3.在把想要交互的物体里创建空物体;

4.创建好的空物体里面放入复制的肢体交互部分;

5.在组件上的Effector Type里选择你要和物体交互的肢体;

6.在pivot里把现在的父物体拖进去;

7.在交互的物体上添加 Interaction Object组件;

Interaction Object:交互物体(通常放在交互的物体上)

Other Look At Target:    朝向的目标

Other Targets Root:要执行的人

Interaction Trigger:交互触发

7.运行

(要交互的人身上要有Interaction System组件才可以交互)

Interaction System:相互作用系统,可以获取指定的ik并控制,呈现出相向移动的效果(通常放在交互的人身上)

步骤:

a、创建空物体Box,添加Interaction object脚本
b、截取手掌骨骼,添加Inateraction Target脚本,设置参数后旋转手掌角度,此为触碰对象平面时的摆放角度
c、将手掌添加到Box下
d、模型添加Interaction System
e、添加控制脚本:
interactionSystem.StartInteraction(FullBodyBipedEffector.RightHand, box, bool);
//执行事件

CCDIK:Limb IK的增强版,可以连接多个骨骼,可以用来制作尾巴、绳索、机械手臂等

(游戏物体可以没有骨骼)

FABRIK:类似CCDIK,但是更显柔韧的效果,可以用来制作钢条、树干等

这个组件是放在父物体里面的,控制父物体的旋转

Axis:X(控制父物体的x旋转),Y(控制父物体的y旋转),Z(控制父物体的z旋转)

Rotation Limit Hinge:旋转限制枢纽(一般用在机械手臂上,主要放在两个骨架交互的地方,因为要控制旋转度数)

Axis :X(控制x的旋转),Y(控制y的旋转),Z(控制z的旋转)

Use Limite:取消组件所在物体的控制

min:最小度数

max:最大度数

各种例子的解析:

a、拳击:有专门的FBIK Boxing脚本控制,手部权重随曲线变化,收拳时为谷底,击中目标时为峰值

b、握手、推拉、拾取:用到相互作用系统

c、驾驶:有专门的FBIK Driving Rig脚本控制

d、机器脚:应用角度限制和关节限制

e、击飞效果:手持长棍,挥击目标,可以击飞目标;应用到Motion Absorb的2个脚本。

f、接吻:有专门的Kissing Rig脚本

g、推墙:专门的Touch Walls脚本

这个插件适合很多场合,之前有做过第三人称射击题材的游戏就有用到过IK插件,

有说的不对的地方可以私密我或者加QQ群:636926481 

互相交流!

猜你喜欢

转载自blog.csdn.net/qq_39954479/article/details/82085527