protected void UpdateBlinking() { if (leftEyeOpen_Close < -1f) { leftEyeOpen_Close = 0f; } if (rightEyeOpen_Close < -1f) { rightEyeOpen_Close = 0f; } blinkDelay -= Time.deltaTime; if (blinkDelay < blinkDuration) { if (blinkDelay < 0f) { switch (gazeMode) { case GazeMode.Speaking: case GazeMode.Listening: blinkDelay = UMAUtils.GaussianRandom(2.3f, 1.1f); break; case GazeMode.Following: blinkDelay = UMAUtils.GaussianRandom(15.4f, 8.2f); break; default: blinkDelay = UMAUtils.GaussianRandom(3.8f, 1.2f); break; } if (blinkDelay < blinkDuration) { blinkDelay = blinkDuration; } } else { leftEyeOpen_Close = -1.01f; rightEyeOpen_Close = -1.01f; } } }
protected void UpdateSaccades() { saccadeDelay -= Time.deltaTime; if (saccadeDelay < 0f) { saccadeTargetPrev = saccadeTarget; int saccadeDirection = Random.Range(0, 4); float saccadeOffset = UMAUtils.GaussianRandom(0f, 0.125f); switch (saccadeDirection) { case 0: saccadeTarget.Set(1f - Mathf.Abs(saccadeOffset), saccadeOffset); break; case 1: saccadeTarget.Set(-1f + Mathf.Abs(saccadeOffset), saccadeOffset); break; case 2: saccadeTarget.Set(saccadeOffset, 1f - Mathf.Abs(saccadeOffset)); break; default: saccadeTarget.Set(saccadeOffset, -1f + Mathf.Abs(saccadeOffset)); break; } float saccadeMagnitude = Random.Range(0.01f, 15f); float saccadeDistance = (-6.9f / eyeMovementRange) * Mathf.Log(saccadeMagnitude / 15.7f); saccadeDuration = 0.021f + 0.0022f * saccadeDistance * eyeMovementRange; saccadeProgress = 0f; switch (gazeMode) { case GazeMode.Listening: if (Mathf.Abs(saccadeDistance) < mutualGazeRange) { saccadeDelay = UMAUtils.GaussianRandom(237.5f / 30f, 47.1f / 30f); } else { saccadeDelay = UMAUtils.GaussianRandom(13f / 30f, 7.1f / 30f); } break; default: if (Mathf.Abs(saccadeDistance) < mutualGazeRange) { saccadeDelay = UMAUtils.GaussianRandom(93.9f / 30f, 94.9f / 30f); } else { saccadeDelay = UMAUtils.GaussianRandom(27.8f / 30f, 24f / 30f); } break; } if (saccadeDelay < MinSaccadeDelay) { saccadeDelay = MinSaccadeDelay; } saccadeTarget *= saccadeDistance; } if (saccadeProgress < 1f) { float timeProgress = Time.deltaTime / saccadeDuration; float progressRate = 1.5f - 3f * Mathf.Pow(saccadeProgress - 0.5f, 2); saccadeProgress += timeProgress * progressRate; leftEyeIn_Out = Mathf.Lerp(saccadeTargetPrev.x, saccadeTarget.x, saccadeProgress); leftEyeUp_Down = Mathf.Lerp(saccadeTargetPrev.y, saccadeTarget.y, saccadeProgress); rightEyeIn_Out = Mathf.Lerp(-saccadeTargetPrev.x, -saccadeTarget.x, saccadeProgress); rightEyeUp_Down = Mathf.Lerp(saccadeTargetPrev.y, saccadeTarget.y, saccadeProgress); } else { leftEyeIn_Out = saccadeTarget.x; leftEyeUp_Down = saccadeTarget.y; rightEyeIn_Out = -saccadeTarget.x; rightEyeUp_Down = saccadeTarget.y; } }