private void RefreshActionUnits() { // initialize action units if (ActionUnitCount == 0) { ActionUnitCount = VisageTrackerNative._getActionUnitCount(); ActionUnits = new ActionUnitData[ActionUnitCount]; for (int actionUnitIndex = 0; actionUnitIndex < ActionUnitCount; actionUnitIndex++) { string name = Marshal.PtrToStringAnsi(VisageTrackerNative._getActionUnitName(actionUnitIndex)); bool used = VisageTrackerNative._getActionUnitUsed(actionUnitIndex); ActionUnitData actionUnitData = new ActionUnitData(actionUnitIndex, name, used); ActionUnits[actionUnitIndex] = actionUnitData; } } // get action unit values if (ActionUnitCount > 0) { float[] values = new float[ActionUnitCount]; VisageTrackerNative._getActionUnitValues(values); for (int actionUnitIndex = 0; actionUnitIndex < ActionUnitCount; actionUnitIndex++) { ActionUnits[actionUnitIndex].Value = values[actionUnitIndex]; } } }
// a quick fix for some false movements detected during tracking private void FixFalseMovement() { // fix for: false rotation while smiling smile_left = Tracker.GetActionUnit("au_lip_stretcher_left"); smile_right = Tracker.GetActionUnit("au_lip_stretcher_right"); rotationFixScale = Mathf.Clamp01((Tracker.Rotation.x + 17f) / 34f); if (smile_left != null && smile_left.Value > 0) { Tracker.Rotation.x -= falseRotationValue * smile_left.Value * rotationFixScale; } if (smile_right != null && smile_right.Value > 0) { Tracker.Rotation.x -= falseRotationValue * smile_right.Value * rotationFixScale; } // fix for: false translation while raising eyebrows brow_left = Tracker.GetActionUnit("au_left_outer_brow_raiser"); brow_right = Tracker.GetActionUnit("au_right_outer_brow_raiser"); Tracker.Translation.z += falseTranslationValue * Mathf.Clamp01((brow_left.Value + brow_right.Value - 0.1f) / 0.3f); }
public void UpdateAction(Dictionary <string, byte> blendshapeWeights) { if (Tracker == null) { return; } if (!Initialized) { data = Tracker.GetActionUnit(ActionUnitName); } else { Value = data.Value; NormalizedValue = (data.Value - Limits.x) / (Limits.y - Limits.x); NormalizedValue = Mathf.Clamp01(NormalizedValue); if (Inverted) { NormalizedValue = 1f - NormalizedValue; } // push back normalized history for (int i = 1; i < FilterWindowSize; i++) { normalizedValueHistory[i - 1] = normalizedValueHistory[i]; } // add normalized value to history normalizedValueHistory[FilterWindowSize - 1] = NormalizedValue; // filter value FilteredValue = Filter(NormalizedValue); // apply to all targets foreach (ActionUnitBindingTarget target in Targets) { if (target.BlendshapeIndex >= 0 && target.Weight >= 0f) { float value = FilteredValue * Weight * target.Weight * 100f; target.Renderer.SetBlendShapeWeight(target.BlendshapeName, value); if (blendshapeWeights.ContainsKey(target.BlendshapeName)) { blendshapeWeights[target.BlendshapeName] = (byte)value; } } } } }