/// <summary> /// 現在の表情を適用 /// </summary> private void UpdateEmotion() { if (!blendShapeProxy) { return; } if (!randomEmotion) { return; // 現状、ランダムが解除されていたら何もしない(戻さない) } var blendShapes = new List <KeyValuePair <BlendShapeKey, float> >(); int index = 0; foreach (var shape in EmotionPresets) { float val = 0f; // 現在選ばれている表情のみ値を入れ、他はゼロとする if (index == emotionIndex) { val = emotionRate; } blendShapes.Add(new KeyValuePair <BlendShapeKey, float>(BlendShapeKey.CreateFromPreset(shape), val)); index++; } blendShapeProxy.SetValues(blendShapes); UpdateUI(); }
private void OnDisable() { BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 0); Debug.Log("teste"); StopCoroutine(m_coroutine); }
private void LateUpdate() { _currentAngle += _angluarVelocity * Time.deltaTime * Mathf.Deg2Rad; var x = Mathf.Cos(_currentAngle) * (_sphereOrbitalRadius + _orbitalRadius.value); var z = Mathf.Sin(_currentAngle) * (_sphereOrbitalRadius + _orbitalRadius.value); var y = (_sphereInitialHeight + _verticalPosition.value) + _sphereMovableRangeInVertical * Mathf.Cos(_currentAngle / 3); if (_lookStraightAheadToggle.isOn) { if (_vrmModel != null) { // Make eyes static if (_lookAtBone) { _vrmModel.GetComponent<VRMLookAtBoneApplyer>().LeftEye.Transform = null; _vrmModel.GetComponent<VRMLookAtBoneApplyer>().RightEye.Transform = null; } else { _vrmModel.GetComponent<VRMLookAtBlendShapeApplyer>().m_notSetValueApply = true; var blednShapeProxy = _vrmModel.GetComponent<VRMBlendShapeProxy>(); blednShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.LookUp), 0.0f); blednShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.LookDown), 0.0f); blednShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.LookLeft), 0.0f); blednShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.LookRight), 0.0f); } } } transform.localPosition = new Vector3(x, y, z); // Fly-through viewpoint (virtual camera) if (_bvhGameObject != null) { if (_vrmModel != null) { var tLookAt = _vrmModel.GetComponent<VRMLookAtHead>().Head.position; transform.LookAt(new Vector3(tLookAt.x, tLookAt.y, tLookAt.z)); } else { transform.LookAt(new Vector3(0.0f, 1.2f, 0.0f)); } } else { transform.LookAt(new Vector3(0.0f, 1.2f, 0.0f)); } } // update
void Update() { m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), Lip_A); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.I), Lip_I); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.U), Lip_U); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.E), Lip_E); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.O), Lip_O); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), Blink); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), Expression_Joy); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Angry), Expression_Angry); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Sorrow), Expression_Sorrow); m_proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Fun), Expression_Fun); }
protected IEnumerator BlinkRoutine() { while (true) { var waitTime = Time.time + Random.value * interlavo; while (waitTime > Time.time) { if (Request) { m_request = false; break; } yield return(null); } // close var value = 0.0f; var closeSpeed = 1.0f / m_closeSeconds; while (true) { value += Time.deltaTime * closeSpeed; if (value >= 1.0f) { break; } BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), value); yield return(null); } BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), 1.0f); // wait... yield return(new WaitForSeconds(closingTime)); // open value = 1.0f; var openSpeed = 1.0f / m_openingSeconds; while (true) { value -= Time.deltaTime * openSpeed; if (value < 0) { break; } BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), value); yield return(null); } BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), 0); } }
/// <summary> /// Sets the viseme to morph target. /// </summary> void SetVisemeToMorphTarget(OVRLipSync.Frame frame) { if (!proxy) { return; } for (int i = 0; i < visemeToBlendTargets.Length; i++) { if (visemeToBlendTargets[i] != -1) { proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset((BlendShapePreset)visemeToBlendTargets[i]), Mathf.Min(1.0f, frame.Visemes[i] * LipSyncSensitivity)); } } }
IEnumerator RoutineNest(BlendShapePreset preset, float velocity, float wait) { for (var value = 0.0f; value <= 1.0f; value += velocity) { BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(preset), value); yield return(null); } BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(preset), 1.0f); yield return(new WaitForSeconds(wait)); for (var value = 1.0f; value >= 0; value -= velocity) { BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(preset), value); yield return(null); } BlendShapes.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(preset), 0); yield return(new WaitForSeconds(wait * 2)); }
static void OnDefaultBlend(OVRLipSync.Frame frame, VRMBlendShapeProxy vrmBlendShapeProxy) { var visemes = new float[visemeToBlendTargets.Length]; Array.Copy(frame.Visemes, (int)OVRLipSync.Viseme.aa, visemes, 1, visemes.Length - 1); visemes[0] = frame.Visemes[(int)OVRLipSync.Viseme.sil]; var sum = visemes.Sum(); if (sum <= float.Epsilon) { visemes[0] = 1; } else { for (int i = 0; i < visemes.Length; ++i) { visemes[i] /= sum; } } for (int i = 0; i < visemes.Length; ++i) { vrmBlendShapeProxy.AccumulateValue(BlendShapeKey.CreateFromPreset(visemeToBlendTargets[i]), visemes[i]); } }
private static BlendShapeKey CreateKey(string name) => _presets.ContainsKey(name) ? BlendShapeKey.CreateFromPreset(_presets[name]) : BlendShapeKey.CreateUnknown(name);
public void MixPresets(string presetName, BlendShapePreset[] presets, float[] values) { MixPresets(presetName, presets.Select(d => BlendShapeKey.CreateFromPreset(d)).ToArray(), values); }
public void SetFace(BlendShapePreset preset, float strength, bool stopBlink) { SetFace(BlendShapeKey.CreateFromPreset(preset), strength, stopBlink); }
/// <summary> /// まばたき /// </summary> private void Blink() { if (!blendShapeProxy) { return; } float now = Time.timeSinceLevelLoad; float span; BlendShapeKey blinkShapeKey = BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink); // 表情が笑顔の時は目が閉じられるため、まばたきは無効とする if (EmotionPresets[emotionIndex] == BlendShapePreset.Joy) { blinkState = BlinkState.None; blendShapeProxy.ImmediatelySetValue(blinkShapeKey, 0f); } // まばたきの状態遷移 switch (blinkState) { case BlinkState.Closing: span = now - lastBlinkTime; if (span > BlinkTime) { blinkState = BlinkState.Opening; blendShapeProxy.ImmediatelySetValue(blinkShapeKey, 1f); } else { blendShapeProxy.ImmediatelySetValue(blinkShapeKey, (span / BlinkTime)); } break; case BlinkState.Opening: span = now - lastBlinkTime - BlinkTime; if (span > BlinkTime) { blinkState = BlinkState.None; blendShapeProxy.ImmediatelySetValue(blinkShapeKey, 0f); } else { blendShapeProxy.ImmediatelySetValue(blinkShapeKey, (1f - span) / BlinkTime); } break; default: if (now >= nextBlinkTime) { lastBlinkTime = now; if (Random.value < 0.2f) { nextBlinkTime = now; // 20%の確率で連続まばたき } else { nextBlinkTime = now + Random.Range(1f, 10f); } blinkState = BlinkState.Closing; } break; } }
void SetOpenEyes() { proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), 0f); }
void SetHalfCloseEyes() { proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink), 0.7f); }
void Update() { if (openSeeExpression == null || vrmBlendShapeProxy == null) { return; } float rightEyeOpen = 1f; float leftEyeOpen = 1f; if (openSee != null) { var openSeeData = openSee.trackingData; if (openSeeData == null || openSeeData.Length < 1) { return; } int idx = -1; int i = 0; foreach (var item in openSeeData) { if (item.id == openSeeExpression.faceId) { idx = i; } i++; } if (idx > -1) { rightEyeOpen = openSeeData[idx].rightEyeOpen; leftEyeOpen = openSeeData[idx].leftEyeOpen; } } vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Neutral), 0f); vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Fun), 0f); vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Sorrow), 0f); vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Angry), 0f); vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), 0f); vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 0f); vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 0f); if (openSeeExpression.expression == expressionFun) { vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Fun), 1f); return; } else if (openSeeExpression.expression == expressionSorrow) { vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Sorrow), 1f); return; } else if (openSeeExpression.expression == expressionAngry) { vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Angry), 1f); return; } else if (openSeeExpression.expression == expressionJoy) { vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), 1f); return; } else { /*if (rightEyeOpen < 0.05) { * vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_R), 1f); * } * if (leftEyeOpen < 0.05) { * vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_L), 1f); * }*/ } vrmBlendShapeProxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Neutral), 1f); }