一、目标:
使用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
然后我把人物的左右小腿X方向旋转至 -180,就好了,真的有用,……!!
参考:
https://blog.csdn.net/sun124608666/article/details/111872151?spm=1001.2014.3001.5506