Created
September 17, 2020 15:57
-
-
Save Baluds/de48d03dfc1d0b6e9064ba84f75fcecb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@override | |
bool advance(FlutterActorArtboard artboard, double elapsed) { | |
super.advance(artboard, elapsed); | |
Vec2D targetTranslation; | |
if (_hasFocus) { | |
// Get caret in Flare world space. | |
Vec2D.transformMat2D(_caretWorld, _caretGlobal, _globalToFlareWorld); | |
// To make it more interesting, we'll also add a sinusoidal vertical offset. | |
_caretWorld[1] += | |
sin(new DateTime.now().millisecondsSinceEpoch / 300.0) * 70.0; | |
// Compute direction vector. | |
Vec2D toCaret = Vec2D.subtract(Vec2D(), _caretWorld, _faceOrigin); | |
Vec2D.normalize(toCaret, toCaret); | |
Vec2D.scale(toCaret, toCaret, | |
_projectGaze); //increase or decrease the projectgaze according to the extent of expressions you want | |
// Compute the transform that gets us in face "ctrl_face" space. | |
Mat2D toFaceTransform = Mat2D(); | |
if (Mat2D.invert(toFaceTransform, _faceControl.parent.worldTransform)) { | |
// Put toCaret in local space, note we're using a direction vector | |
// not a translation so transform without translation | |
Vec2D.transformMat2(toCaret, toCaret, toFaceTransform); | |
// Our final "ctrl_face" position is the original face translation plus this direction vector | |
targetTranslation = Vec2D.add(Vec2D(), toCaret, _faceOriginLocal); | |
} | |
} else { | |
targetTranslation = Vec2D.clone(_faceOriginLocal); | |
} | |
// We could just set _faceControl.translation to targetTranslation, but we want to animate it smoothly to this target | |
// so we interpolate towards it by a factor of elapsed time in order to maintain speed regardless of frame rate. | |
Vec2D diff = | |
Vec2D.subtract(Vec2D(), targetTranslation, _faceControl.translation); | |
Vec2D frameTranslation = Vec2D.add(Vec2D(), _faceControl.translation, | |
Vec2D.scale(diff, diff, min(1.0, elapsed * 5.0))); | |
_faceControl.translation = frameTranslation; | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment