Tuning of audio-driven mouths and brows to look better and not stay open

This commit is contained in:
Philip Rosedale 2014-09-24 16:37:55 -07:00
parent 8e60323177
commit fcc5eb9d0a
3 changed files with 15 additions and 3 deletions

View file

@ -34,6 +34,7 @@ Head::Head(Avatar* owningAvatar) :
_lastLoudness(0.0f), _lastLoudness(0.0f),
_longTermAverageLoudness(-1.0f), _longTermAverageLoudness(-1.0f),
_audioAttack(0.0f), _audioAttack(0.0f),
_audioJawOpen(0.0f),
_angularVelocity(0,0,0), _angularVelocity(0,0,0),
_renderLookatVectors(false), _renderLookatVectors(false),
_saccade(0.0f, 0.0f, 0.0f), _saccade(0.0f, 0.0f, 0.0f),
@ -157,11 +158,21 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) {
} }
// use data to update fake Faceshift blendshape coefficients // use data to update fake Faceshift blendshape coefficients
const float JAW_OPEN_SCALE = 10.f; const float JAW_OPEN_SCALE = 0.015f;
const float JAW_OPEN_RATE = 0.9f;
const float JAW_CLOSE_RATE = 0.90f;
float audioDelta = sqrtf(glm::max(_averageLoudness - _longTermAverageLoudness, 0.0f)) * JAW_OPEN_SCALE;
if (audioDelta > _audioJawOpen) {
_audioJawOpen += (audioDelta - _audioJawOpen) * JAW_OPEN_RATE;
} else {
_audioJawOpen *= JAW_CLOSE_RATE;
}
_audioJawOpen = glm::clamp(_audioJawOpen, 0.0f, 1.0f);
Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink, Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink,
_rightEyeBlink, _rightEyeBlink,
_browAudioLift, _browAudioLift,
glm::clamp(log(_averageLoudness) / JAW_OPEN_SCALE, 0.0f, 1.0f), _audioJawOpen,
_blendshapeCoefficients); _blendshapeCoefficients);
} }

View file

@ -130,6 +130,7 @@ private:
float _lastLoudness; float _lastLoudness;
float _longTermAverageLoudness; float _longTermAverageLoudness;
float _audioAttack; float _audioAttack;
float _audioJawOpen;
glm::vec3 _angularVelocity; glm::vec3 _angularVelocity;
bool _renderLookatVectors; bool _renderLookatVectors;
glm::vec3 _saccade; glm::vec3 _saccade;

View file

@ -978,7 +978,7 @@ void MyAvatar::updateLookAtTargetAvatar() {
howManyLookingAtMe++; howManyLookingAtMe++;
// Have that avatar look directly at my camera // Have that avatar look directly at my camera
// Philip TODO: correct to look at left/right eye // Philip TODO: correct to look at left/right eye
avatar->getHead()->setCorrectedLookAtPosition(Application::getInstance()->getCamera()->getPosition()); avatar->getHead()->setCorrectedLookAtPosition(Application::getInstance()->getViewFrustum()->getPosition());
} else { } else {
avatar->getHead()->clearCorrectedLookAtPosition(); avatar->getHead()->clearCorrectedLookAtPosition();
} }