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);
        }
Ejemplo n.º 3
0
        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;
                        }
                    }
                }
            }
        }