EyeBlink
最終更新: 2020年1月30日
概述
EyeBlink是将开/关值应用于眨眼参数的当前值的功能。
参阅此处了解如何在模型上设置眨眼参数。
除了在模型本身中设置之外,用户还可以在Unity上任意指定眨眼参数。
Cubism SDK for Unity中的EyeBlink包含三种类型的元素。
- 参数指定用组件
- 将值应用于各参数的组件
- 操作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
这将是眨眼的速度。
它针对从前一帧经过的时间进行正片叠底。