From d678f81bdad80aaa4480254033aaa521cbd75b7f Mon Sep 17 00:00:00 2001 From: Emiliana <38952746+emilianavt@users.noreply.github.com> Date: Sat, 7 Mar 2020 20:07:08 +0100 Subject: [PATCH] run.bat can be used to run the face tracker visualization in a slightly user friendly way. --- Examples/OpenSeeVRMDriver.cs | 27 +++++++++++++++++++++------ Unity/OpenSeeExpression.cs | 4 ++-- run.bat | 13 +++++++++++++ 3 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 run.bat diff --git a/Examples/OpenSeeVRMDriver.cs b/Examples/OpenSeeVRMDriver.cs index 6a8d369..d300b59 100644 --- a/Examples/OpenSeeVRMDriver.cs +++ b/Examples/OpenSeeVRMDriver.cs @@ -26,8 +26,12 @@ public class OpenSeeVRMDriver : MonoBehaviour { //public bool fixedUpdate = true; [Tooltip("When enabled, the avatar will blink automatically. Otherwise, blinks will be applied according to the face tracking's blink detection, allowing it to wink. Even for tracked eye blinks, the eye blink setting of the current expression is used.")] public bool autoBlink = true; - [Tooltip("When automatic eye blinks are disabled, this sets the threshold for how closed the eyes have to be to be registered as closed. At 0 the eyes will never close.")] - public float eyeClosedThreshold = 0.3f; + [Tooltip("When automatic eye blinks are disabled, this sets the threshold for how closed the eyes have to be to be registered as fully closed. At 0 the eyes will never fully close.")] + [Range(0, 1)] + public float eyeClosedThreshold = 0.2f; + [Tooltip("When automatic eye blinks are disabled, this sets the threshold for how open the eyes have to be to be registered as fully open. At 1 the eyes will never fully open.")] + [Range(0, 1)] + public float eyeOpenedThreshold = 0.65f; [Tooltip("When enabled, the avatar's eye will move according to the face tracker's gaze tracking.")] public bool gazeTracking = true; [Tooltip("This is the right eye bone. When either eye bone is not set, the VRM look direction blendshapes are used instead.")] @@ -42,6 +46,9 @@ public class OpenSeeVRMDriver : MonoBehaviour { public float gazeStabilizer = 0.1f; [Tooltip("For bone based gaze tracking, the conversion factor from [-1, 1] to degrees should be entered here. For blendshapes, sometimes gaze tracking does not follow the gaze strongly enough. With these factors, its effect can be strengthened, but usually it should be set to 1.")] public Vector2 gazeFactor = new Vector2(5f, 10f); + [Tooltip("This factor is applied on top of the gazeFactor field.")] + [Range(0, 5)] + public float gazeStrength = 1f; [Tooltip("This component lets you customize the automatic eye blinking.")] public OpenSeeEyeBlink eyeBlinker = new OpenSeeEyeBlink(); [Tooltip("This component lets configure your VRM expressions.")] @@ -365,7 +372,7 @@ public class OpenSeeVRMDriver : MonoBehaviour { rightEye.localRotation = Quaternion.identity; leftEye.localRotation = Quaternion.identity; if (gazeTracking) { - Quaternion rotation = Quaternion.AngleAxis(-gazeFactor.x * lookUpDown, Vector3.right) * Quaternion.AngleAxis(-gazeFactor.y * lookLeftRight, Vector3.up); + Quaternion rotation = Quaternion.AngleAxis(-gazeFactor.x * gazeStrength * lookUpDown, Vector3.right) * Quaternion.AngleAxis(-gazeFactor.y * gazeStrength * lookLeftRight, Vector3.up); rightEye.localRotation = rotation; leftEye.localRotation = rotation; } @@ -384,17 +391,25 @@ public class OpenSeeVRMDriver : MonoBehaviour { vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_L), 0f); } } else if (openSeeExpression != null && openSeeExpression.openSee != null) { - if (openSeeData == null || !currentExpression.enableBlinking) { + if (openSeeData == null || currentExpression == null || !currentExpression.enableBlinking) { vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_R), 0f); vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_L), 0f); return; } float right = 1f; - if (openSeeData.rightEyeOpen > eyeClosedThreshold) + if (openSeeData.rightEyeOpen > eyeOpenedThreshold) right = 0f; + else if (openSeeData.rightEyeOpen < eyeClosedThreshold) + right = 1f; + else + right = 1f - (openSeeData.rightEyeOpen - eyeClosedThreshold) / (eyeOpenedThreshold - eyeClosedThreshold); float left = 1f; - if (openSeeData.leftEyeOpen > eyeClosedThreshold) + if (openSeeData.leftEyeOpen > eyeOpenedThreshold) left = 0f; + else if (openSeeData.leftEyeOpen < eyeClosedThreshold) + left = 1f; + else + left = 1f - (openSeeData.leftEyeOpen - eyeClosedThreshold) / (eyeOpenedThreshold - eyeClosedThreshold); vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_R), right); vrmBlendShapeProxy.ImmediatelySetValue(new BlendShapeKey(BlendShapePreset.Blink_L), left); } diff --git a/Unity/OpenSeeExpression.cs b/Unity/OpenSeeExpression.cs index 9b13028..d4919eb 100644 --- a/Unity/OpenSeeExpression.cs +++ b/Unity/OpenSeeExpression.cs @@ -102,7 +102,7 @@ public class OpenSeeExpression : MonoBehaviour private string[] classLabels = null; private int[] indices = null; private PointSelection pointSelection; - private bool newModel = false; + //private bool newModel = false; static public void LoadSerialized(byte[] modelBytes, out Dictionary> expressions, out SVMModel model, out string[] classLabels, out int[] indices, ref PointSelection pointSelection) { IFormatter formatter = new BinaryFormatter(); @@ -135,7 +135,7 @@ public class OpenSeeExpression : MonoBehaviour oser.classLabels = classLabels; oser.indices = indices; oser.pointSelection = pointSelection; - oser.newModel = true; + //oser.newModel = true; IFormatter formatter = new BinaryFormatter(); MemoryStream memoryStream = new MemoryStream(); diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..2d3aeab --- /dev/null +++ b/run.bat @@ -0,0 +1,13 @@ +%ECHO OFF + +facetracker -l 1 + + +set /p cameraNum=Select your camera from the list above and enter the corresponding number: +set /p width=Select the width: +set /p height=Select the height: +set /p fps=Select the FPS: + +facetracker -c %cameraNum% -W %width% -H %height% -F %fps% -v 1 -P 1 + +pause \ No newline at end of file