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
这将是眨眼的速度。
它针对从前一帧经过的时间进行正片叠底。