// By gravity we mean the force that will pull the mask back to its neutral state.
 private void InitializeGravity()
 {
     _isInitialized    = false;
     _gravityStartTime = Time.time;
     _startGravityAu   = _animUnits;
     _startGravityPos  = _position;
     _startGravityRot  = _rotation;
 }
Exemple #2
0
    public static AnimationUnits operator +(AnimationUnits first, AnimationUnits second)
    {
        var animUnits = new AnimationUnits();

        animUnits.Au012 = first.Au012 + second.Au012;
        animUnits.Au345 = first.Au345 + second.Au345;
        return(animUnits);
    }
    // AU3
    private float MapBrowLowererValue(AnimationUnits animUnits)
    {
        if (animUnits.OuterBrowRaiser > 0f)
        {
            return(Mathf.Clamp(animUnits.BrowLowerer - animUnits.OuterBrowRaiser, -1f, 1.7f));
        }

        return(Mathf.Clamp(animUnits.BrowLowerer - 3 * animUnits.OuterBrowRaiser, -1f, 1.7f));
    }
    void ProcessFaceTrackingData(float au0, float au1, float au2, float au3, float au4, float au5, float posX, float posY, float posZ, float rotX, float rotY, float rotZ)
    {
        _hasNewData = true;
        var animUnits = new AnimationUnits(au0, au1, au2, au3, au4, au5);

        _position = new Vector3(posX, posY, posZ);
        _rotation = new Vector3(rotX, rotY, rotZ);

        // We amplify the position to exagerate the head movements.
        _position *= 10;
        SetCurrentAUs(animUnits);
    }
    private void ApplyGravityToParams()
    {
        float time = Mathf.Clamp01((Time.time - _gravityStartTime) / TimeToReturnToDefault);

        _position = Vector3.Lerp(_startGravityPos, _userInitialPosition, time);
        _rotation = Vector3.Lerp(_startGravityRot, new Vector3(0, 0, 0), time);

        var animUnits = new AnimationUnits();

        animUnits.Au012 = Vector3.Lerp(_startGravityAu.Au012, Vector3.zero, time);
        animUnits.Au345 = Vector3.Lerp(_startGravityAu.Au345, Vector3.zero, time);
        SetCurrentAUs(animUnits);
    }
    // Perform random faces automatically to fill the gaps whenever we do not have any input data from kinect.
    private void ManipulateMaskAutomatically()
    {
        CurrentMode = TrackingMode.ComputerControlled;
        _waitTimer -= Time.deltaTime;
        if (_waitTimer > 0)
        {
            return;
        }

        _waitTimer = 3f;

        _rotation        = new Vector3(Random.Range(-10f, 10f), Random.Range(-10f, 10f), Random.Range(-10f, 10f));
        _targetAnimUnits = new AnimationUnits(Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f),
                                              Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f));
    }
    private void SetCurrentAUs(AnimationUnits animUnits)
    {
        const float weight = 0.8f;

        for (int i = 0; i < 6; i++)
        {
            _accAu[i] = animUnits[i] * weight + _accAu[i] * (1 - weight);
        }

        animUnits = _accAu;

        _targetAnimUnits.LipRaiser          = MapLipRaiserValue(animUnits.LipRaiser);
        _targetAnimUnits.JawLowerer         = MapJawLowererValue(animUnits.JawLowerer);
        _targetAnimUnits.LipStretcher       = MapLipStretcherValue(animUnits.LipStretcher);
        _targetAnimUnits.BrowLowerer        = MapBrowLowererValue(animUnits);
        _targetAnimUnits.LipCornerDepressor = MapLipCornerDepressorValue(animUnits.LipCornerDepressor);
        _targetAnimUnits.OuterBrowRaiser    = MapOuterBrowRaiserValue(animUnits.OuterBrowRaiser);
    }