UnityVR--组件8--Avatar骨骼映射&遮罩

目录

什么是Avatar

应用1:使用Avatar更换人物模型

应用2:Avatar遮罩

应用3:设置IK,实现头的看向和手的朝向


什么是Avatar

  模型中的人物都具有结构相似的骨架,如果建立一个模型骨架结构的映射,就能将同一个动画应用于不同的模型中,这就是Avatar,实现了一种动画重定向的功能。一般使用3DMax、Maya制作并导出为.fbx的人物模型,在导入Unity时会自动产生这个Avatar。

  并且一旦建立动画的控制机Animator时,也会让你选择相对应的Avatar:

应用1:使用Avatar更换人物模型

  1. 下载一个成熟完整的场景,比如AssetStore中的第三人控制器Third Person Character Controller,它包含了完整的动画及场景,可以以此为模板:

   2. 准备一个自己想要的主角模型,也放在Assets中,用它来替换1.中Third Person的主角,比如下面这个:

  3. 找到Third Person场景中的主角节点,将它与预制体分离开,以便于后面的编辑:

  分离以后,它的图标就不再是预制体的图标了:

   4. 把新的主角模型,那个高中生小姑娘拖入主角的节点下面,当然也要让它解除与预制体的关联:

   5. 这里我们只要新主角的模型mesh即可,其他的节点都可以删除(需要观察一下,不同的模型内部的节点不同)。顺便把原来主角的Mesh也删除,只保留根节点。删完以后主角节点变成图2:

  

 6. 把新主角的Avatar替换到人物的根节点——PlayerArmature (1)节点上

   7. 这样,新主角就替代成功了:

应用2:Avatar遮罩

  在动画中,有时人物会手拿一件东西走路,这时候拿东西的手是不应该摆动的,因此需要使用遮罩,让人物在走动的时候,其他部分使用走路的动画,而手用站立时的动画遮盖一下。以上面的高中生为例,步骤如下:

  1. 创建一个动画遮罩AvatarMask,它的图标与Avatar图标有些相似。将它的Humanoid打开,点击不需要遮罩的部分,让它变成红色,绿色就是被遮罩的部分,也就是这个手臂播放站立动画,其他部分照常:

  2. 新建一个动画状态机Animator,让它作为高中生的控制器,之前的控制器是第三人称的StarterAssetsThirdPerson

    

  3. 双击这个Animator——HighSchoolStudent,打开控制面板,按照前篇(动画事件&BlendTree)的方式建立BlendTree,并加入站立Idle和行走Walk动画。

  4. 点Animator->Layers的“+”号创建一个新的动画层,点它的设置按钮,可以看到该动画层的相应参数设置(右图):

 

   其中: Weight——该层的权重,即这一层影响人物的比例;

  Mask——动画遮罩,即AvatarMask。把上面建立的AvatarMask拖入。

  Blending——混合类型,有两种:Override(指当前层会覆盖其他层动画,即只播放当前层动画)、Additive(当前层和其他层的动画叠加)

  Sync——是否复制其他层

  IK Pass——是否启动逆向运动学

  这里需要勾选IK,因为要用提着的东西去控制手部的骨骼运动

  5. 这个遮罩层,也需要设置动画,也就是被遮罩的部分(手)要播放的动画,我们这里使用站立时的动画:

   6. 测试运行,她拿着东西的手播放的是Idle动画,而其他部分播放正常的行走Walk动画

   

  跑步时更加明显:

应用3:设置IK,实现头的看向和手的朝向

  IK是逆向运动解算,知道目标终点解算出运动形态,在动画的应用是让高中生在行动时始终看着一个地方(目标终点),她的手始终指向一个位置。IK常用的API有:

SetIKPositionWeight(AvatarIKGoal goal, float value)
SetIKRotationWeight(AvatarIKGoal goal, float value)
SetLookAtPosition(Vector3 lookAtPosition)

  分别用于设置IK目标的权重及旋转权重,其中AvatarIKGoal是个枚举,包含了LeftFoot,RightFoot,LeftHand, RightHand四个值,用于调用人物的身体部位。

  控制高中生头部和手IK的代码如下:

public class AnimeIK : MonoBehaviour
{
    public GameObject headTarget;  //头朝向的一个目标
    public GameObject handTarget; //手跟随的物体
    public Animator anime;  //挂载Animator的节点

    private void OnAnimatorIK(int layerIndex)
    {
        //头部看向headTarget
        anime.SetLookAtPosition(headTarget.transform.position);
        anime.SetLookAtWeight(1); //头部看向动画的权重设置

        //手跟随以及权重
        anime.SetIKPosition(AvatarIKGoal.RightHand, handTarget.transform.position);
        anime.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
    }
}

  最终效果如下,高中生的手始终伸向汉堡,头始终看着奶酪,IK会根据终点目标计算每一个骨骼节点的移动:

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值