Final IK 头部控制 FBBIKHeadEffector

一、目标:
使用FinalIK,实现头部的控制,并且身体随之自然地转动

二、效果展示:

在这里插入图片描述

三、实现思路
头部运动以空物体(带有 FBBIKHeadEffector 组件)为参考,旋转了空物体,头部也跟着旋转。

四、FBBIKHeadEffector 组件讲解
IK:要控制的人物身上的 FullBodyBipedIK 组件

BendBones:希望头部运动,也让全身也跟着转,那就需要把脊柱、脖子骨骼置于其中。(只置于三根脊柱,也可以)

三、实现步骤
1、给人物添加基础组件 FullBodyBipedIK
在这里插入图片描述

2、在人物模型下新建空物体HeadContrl,坐标归零。在其下,再新建空物体HeadEffector,坐标归零,并添加 FBBIKHeadEffector 组件。
在这里插入图片描述

3、FBBIKHeadEffector 属性设置:

  a、IK 赋值 人物FullBodyBipedIK 。

  b、将 FBBIKHeadEffector 位置权重调为0,旋转调为1(因为我们只希望控制头部旋转,不控制头部位置)。

  c、为 BendBones 赋值脊柱(也可加上脖子等)。

4、调整HeadEffector的旋转值,使头部朝向正常为止。
5、现在运行,旋转空物体 HeadEffector,就能看到头部、身体跟着动了。
6、给人物添加自定义组件TurnHeadIk.cs

using System;
using System.Collections;
using System.Collections.Generic;
using RootMotion.FinalIK;
using UnityEngine;

public class TurnHeadIk : MonoBehaviour
{
    public Transform Target;
    public bool LookAtPlayer;
    public FBBIKHeadEffector HeadEffector;
    public float rotationWeight;
    public float TurnedSpeed = 1.3f;
    [NonSerialized]
    public Transform HeadContrl;    //实际控制选择的物体(HeadEffector的父物体)
    
    [SerializeField]
    private Transform headTransform;    //骨骼中head的Transform

    
    
    void Start()
    {
        if (this.HeadEffector != null)
        {
            HeadContrl = this.HeadEffector.gameObject.transform.parent;
        }
    }

    private void Update()
    {
 
        if (this.Target == null || this.headTransform == null || HeadEffector == null)
        {
            return;
        }
        
        if (LookAtPlayer)
        {
            if (this.rotationWeight < 1)
            {
                //扭头的过渡
                this.rotationWeight += Time.deltaTime * TurnedSpeed;
                HeadEffector.rotationWeight = Mathf.Clamp(this.rotationWeight, 0, 1);
                HeadEffector.bendWeight = Mathf.Clamp(this.rotationWeight, 0, 1);
            }

            //同步人物头根节点位置与HeadEffector
            this.HeadContrl.gameObject.transform.position = this.headTransform.position;
            this.HeadEffector.gameObject.transform.localPosition = Vector3.zero;
        
            //更新旋转(旋转的是HeadEffector的父物体,HeadEffector旋转角要和初始head的同步)
            this.HeadContrl.gameObject.transform.LookAt(this.Target);
        }
        else
        {
            if (this.rotationWeight > 0)
            {
                //扭头的过渡
                this.rotationWeight -= Time.deltaTime * TurnedSpeed;
                HeadEffector.rotationWeight = Mathf.Clamp(this.rotationWeight, 0, 1);
                HeadEffector.bendWeight = Mathf.Clamp(this.rotationWeight, 0, 1);
            }
        }
        
    }

    public void StartLook()
    {
        this.LookAtPlayer = true;
    }

    public void StopLook()
    {
        this.LookAtPlayer = false;
    }

    public void SetLookAtTarget(Transform target)
    {
        this.Target = target;
    }

}


【问题记录】当时遇到的问题:再怎么调,人物腿部表现异常
当时看了很多文章,发现了这个,
https://blog.csdn.net/YongshuangZhao/article/details/102877869
https://blog.csdn.net/YongshuangZhao/article/details/102877869
然后我把人物的左右小腿X方向旋转至 -180,就好了,真的有用,……!!
在这里插入图片描述


参考:
https://blog.csdn.net/sun124608666/article/details/111872151?spm=1001.2014.3001.5506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值