EyeBlink

最終更新: 2020年1月30日

概述

EyeBlink是将开/关值应用于眨眼参数的当前值的功能。
参阅此处了解如何在模型上设置眨眼参数。

除了在模型本身中设置之外,用户还可以在Unity上任意指定眨眼参数。

Cubism SDK for Unity中的EyeBlink包含三种类型的元素。

  1. 参数指定用组件
  2. 将值应用于各参数的组件
  3. 操作2中应用的值

1. 参数指定用组件

使用CubismEyeBlinkParameter指定用于EyeBlink的参数。

CubismEyeBlinkParameter是一个继承MonoBehaviour的组件,
它通过附加到置入[Prefab根]/Parameters/下的GameObject来使用。
这会将与附加的GameObject具有相同ID的参数视为眨眼的参数。

如果模型本身设置有眨眼参数,则CubismEyeBlinkParameter将在载入时附加到该参数的GameObject上。

由于CubismEyeBlinkParameter用作获取参考目的地的标记,因此它内部不处理任何内容,也没有数据。

2. 将值应用于各参数的组件

使用CubismEyeBlinkController将打开/关闭值应用于各参数。
这是一个继承自MonoBehaviour的组件,使用时会附加到Cubism的Prefab的根。

在原始化期间获取附加到Prefab的所有CubismEyeBlinkParameters的参考。
如果在执行过程中追加/移除眨眼参数,调用CubismEyeBlinkController.Refresh()再次获取参考。

        /// <summary>
        /// Refreshes controller. Call this method after adding and/or removing <see cref="CubismEyeBlinkParameter"/>s.
        /// </summary>
        public void Refresh()
        {
            var model = this.FindCubismModel();
 
 
            // Fail silently...
            if (model == null)
            {
                return;
            }
 
 
            // Cache destinations.
            var tags = model
                .Parameters
                .GetComponentsMany<CubismEyeBlinkParameter>();
 
 
            Destinations = new CubismParameter[tags.Length]; for (var i = 0; i < tags.Length; ++i) { Destinations[i] = tags[i].GetComponent<CubismParameter>(); } // Get cubism update controller. HasUpdateController = (GetComponent<CubismUpdateController>() != null); } ... /// <summary> /// Called by Unity. Makes sure cache is initialized. /// </summary> private void Start() { // Initialize cache. Refresh(); }

CubismEyeBlinkController在每帧的LateUpdate()时机将CubismEyeBlinkController.EyeOpening的值应用于CubismEyeBlinkParameter标记的参数。

            // Apply value.
            Destinations.BlendToValue(BlendMode, EyeOpening);

EyeOpening的设置值在0.0f~1.0f的范围内。
CubismEyeBlinkController使用CubismEyeBlinkController.BlendMode中设置的计算方法将此值应用于对象参数。

通过从外部操纵此EyeOpening值,您可以使模型的眼睛睁开或闭上。

        /// <summary>
        /// Opening of the eyes.
        /// </summary>
        [SerializeField, Range(0f, 1f)]
        public float EyeOpening = 1f;

3. 操纵2中应用的值

如“2. 将值应用于各参数的组件”中所述,您可以通过操作CubismEyeBlinkController.EyeOpening的值,将值应用于眨眼的参数。
Cubism SDK for Unity可以通过两种方式操作此值:

  • 通过动态操纵值
  • 按组件操作值

此外,通过在用户端实装对该值的操作处理,可以独立自定义眨眼速度、时间等。

Tips

如果操作CubismEyeBlinkController.EyeOpening的组件在CubismEyeBlinkController之后执行,它可能不会按预期动作。
如果动作出现问题,可以通过在用户端显式控制组件的执行顺序来避免。
在Cubism SDK for Unity中,各组件的执行顺序由CubismUpdateController控制,因此您也可以使用它。

另外,由于上述两种设置方法在不同的时间操作相同的值,因此很难在不作任何努力的情况下将两者共存于一个模型中。

通过动态操纵值

当使用设置有眨眼参数的模型通过Cubism的Animator创建动态时,可以设置眨眼曲线。

如果将带有眨眼曲线的.motion3.json载入Unity项目,AnimationClip将以CubismEyeBlinkController.EyeOpening的值为对象生成该曲线。
因此,CubismEyeBlinkController.EyeOpening的值是通过以Animator组件等播放AnimationClip来操作的。

按组件操作值

在Cubism SDK for Unity中,CubismAutoEyeBlinkInput组件也可用于操作眨眼值。

CubismAutoEyeBlinkInput根据从Inspector设置的速度、间隔以及添加到间隔的随机摇动的宽度来计算和设置眨眼值。

       private void LateUpdate()
        {
            // Fail silently.
            if (Controller == null)
            {
                return;
            }
 
 
            // Wait for time until blink.
            if (CurrentPhase == Phase.Idling)
            {
                T -= Time.deltaTime;
 
 
                if (T < 0f)
                {
                    T = (Mathf.PI * -0.5f);
                    LastValue = 1f;
                    CurrentPhase = Phase.ClosingEyes;
                }
                else
                {
                    return;
                }
            }
 
 
            // Evaluate eye blinking.
            T += (Time.deltaTime * Timescale);
            var value = Mathf.Abs(Mathf.Sin(T));
 
 
            if (CurrentPhase == Phase.ClosingEyes && value > LastValue)
            {
                CurrentPhase = Phase.OpeningEyes;
            }
            else if (CurrentPhase == Phase.OpeningEyes && value < LastValue)
            {
                value = 1f;
                CurrentPhase = Phase.Idling;
                T = Mean + Random.Range(-MaximumDeviation, MaximumDeviation);
            }
 
 
            Controller.EyeOpening = value;
            LastValue = value;
        }

CubismAutoEyeBlinkInput具有三个设置项目。

  • Mean
  • MaximumDeviation
  • Timescale
        /// <summary>
        /// Mean time between eye blinks in seconds.
        /// </summary>
        [SerializeField, Range(1f, 10f)]
        public float Mean = 2.5f; /// <summary> /// Maximum deviation from <see cref="Mean"/> in seconds. /// </summary>
        [SerializeField, Range(0.5f, 5f)]
        public float MaximumDeviation = 2f; /// <summary> /// Timescale. /// </summary>
        [SerializeField, Range(1f, 20f)]
        public float Timescale = 10f;
  • Mean

设置至眨眼的时间。
单位是秒。
实际上,使用了这个值加上 Maximum Deviation所引起误差后的时间。

  • MaximumDeviation

设置要添加到Mean中所设置时间的随机波动宽度。
按照以下方式计算值:

 Mean + Random.Range(-MaximumDeviation, MaximumDeviation)
  • Timescale

这将是眨眼的速度。
它针对从前一帧经过的时间进行正片叠底。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。