From 1d68413b663475e633ab90a2b6d58877b3bcd5be Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 23 Oct 2014 11:43:13 -0700 Subject: [PATCH 1/2] Audio-only mouth uses multiple blend shapes --- interface/src/avatar/Head.cpp | 19 +++++++++++++++++++ interface/src/avatar/Head.h | 3 +++ interface/src/devices/Faceshift.cpp | 12 ++++++++++-- interface/src/devices/Faceshift.h | 10 ++++++++-- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index bc557bdb57..31f08d9eae 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -166,6 +166,7 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { } // use data to update fake Faceshift blendshape coefficients + const float JAW_OPEN_SCALE = 0.015f; const float JAW_OPEN_RATE = 0.9f; const float JAW_CLOSE_RATE = 0.90f; @@ -177,10 +178,28 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { } _audioJawOpen = glm::clamp(_audioJawOpen, 0.0f, 1.0f); + // _mouth2 = "mmmm" shape + // _mouth3 = "funnel" shape + // _mouth4 = "smile" shape + const float FUNNEL_PERIOD = 0.985f; + const float FUNNEL_RANDOM_PERIOD = 0.01f; + const float MMMM_POWER = 0.25f; + const float MMMM_PERIOD = 0.91f; + const float MMMM_RANDOM_PERIOD = 0.15f; + const float SMILE_PERIOD = 0.925f; + const float SMILE_RANDOM_PERIOD = 0.05f; + + _mouth3 = glm::mix(_audioJawOpen, _mouth3, FUNNEL_PERIOD + randFloat() * FUNNEL_RANDOM_PERIOD); + _mouth2 = glm::mix(_audioJawOpen * MMMM_POWER, _mouth2, MMMM_PERIOD + randFloat() * MMMM_RANDOM_PERIOD); + _mouth4 = glm::mix(_audioJawOpen, _mouth4, SMILE_PERIOD + randFloat() * SMILE_RANDOM_PERIOD); + Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink, _rightEyeBlink, _browAudioLift, _audioJawOpen, + _mouth2, + _mouth3, + _mouth4, _blendshapeCoefficients); } diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index bc4142eab0..57d74adaf0 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -129,6 +129,9 @@ private: float _longTermAverageLoudness; float _audioAttack; float _audioJawOpen; + float _mouth2; + float _mouth3; + float _mouth4; glm::vec3 _angularVelocity; bool _renderLookatVectors; glm::vec3 _saccade; diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 74e36a98d1..0f1f792157 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -125,8 +125,13 @@ void Faceshift::reset() { } void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, - float jawOpen, QVector& coefficients) const { - coefficients.resize(max((int)coefficients.size(), _jawOpenIndex + 1)); + float jawOpen, float mouth2, float mouth3, float mouth4, QVector& coefficients) const { + const int MMMM_BLENDSHAPE = 34; + const int FUNNEL_BLENDSHAPE = 40; + const int SMILE_LEFT_BLENDSHAPE = 28; + const int SMILE_RIGHT_BLENDSHAPE = 29; + coefficients.resize(max((int)coefficients.size(), FUNNEL_BLENDSHAPE + 1)); + coefficients.resize(max((int)coefficients.size(), 48)); qFill(coefficients.begin(), coefficients.end(), 0.0f); coefficients[_leftBlinkIndex] = leftBlink; coefficients[_rightBlinkIndex] = rightBlink; @@ -134,6 +139,9 @@ void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float coefficients[_browUpLeftIndex] = browUp; coefficients[_browUpRightIndex] = browUp; coefficients[_jawOpenIndex] = jawOpen; + coefficients[SMILE_LEFT_BLENDSHAPE] = coefficients[SMILE_RIGHT_BLENDSHAPE] = mouth4; + coefficients[MMMM_BLENDSHAPE] = mouth2; + coefficients[FUNNEL_BLENDSHAPE] = mouth3; } void Faceshift::setTCPEnabled(bool enabled) { diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index e7d87827eb..3b4092c099 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -61,8 +61,14 @@ public: void update(); void reset(); - void updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, - float jawOpen, QVector& coefficients) const; + void updateFakeCoefficients(float leftBlink, + float rightBlink, + float browUp, + float jawOpen, + float mouth2, + float mouth3, + float mouth4, + QVector& coefficients) const; signals: From 9394f72b18353e6c6ea887176af8dc286c22d483 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 23 Oct 2014 11:55:06 -0700 Subject: [PATCH 2/2] clarify fake blendshape array size --- interface/src/devices/Faceshift.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 0f1f792157..fb74f416a9 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -130,8 +130,9 @@ void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float const int FUNNEL_BLENDSHAPE = 40; const int SMILE_LEFT_BLENDSHAPE = 28; const int SMILE_RIGHT_BLENDSHAPE = 29; - coefficients.resize(max((int)coefficients.size(), FUNNEL_BLENDSHAPE + 1)); - coefficients.resize(max((int)coefficients.size(), 48)); + const int MAX_FAKE_BLENDSHAPE = 40; // Largest modified blendshape from above and below + + coefficients.resize(max((int)coefficients.size(), MAX_FAKE_BLENDSHAPE + 1)); qFill(coefficients.begin(), coefficients.end(), 0.0f); coefficients[_leftBlinkIndex] = leftBlink; coefficients[_rightBlinkIndex] = rightBlink;