From 13c228e79695fe9bc25bf89414595b8992e48b3b Mon Sep 17 00:00:00 2001 From: RyanDowne Date: Tue, 10 Sep 2013 17:33:22 -0700 Subject: [PATCH] Added Smile --- interface/src/avatar/PerlinFace.cpp | 58 ++++++++++++++++++++--------- interface/src/avatar/PerlinFace.h | 2 + interface/src/devices/Faceshift.cpp | 17 +++++++++ interface/src/devices/Faceshift.h | 8 ++++ 4 files changed, 67 insertions(+), 18 deletions(-) diff --git a/interface/src/avatar/PerlinFace.cpp b/interface/src/avatar/PerlinFace.cpp index 15d90f5403..80107bea8d 100644 --- a/interface/src/avatar/PerlinFace.cpp +++ b/interface/src/avatar/PerlinFace.cpp @@ -89,6 +89,8 @@ PerlinFace::PerlinFace(Head *owningHead) _browsU_L(0), _browsU_R(0), _mouthSize(0), + _mouthSmileLeft(0), + _mouthSmileRight(0), _leftBlink(0), _rightBlink(0) { } @@ -258,6 +260,8 @@ void PerlinFace::updatePositions() { _browsU_L = faceshift->getBrowUpLeft(); _browsU_R = faceshift->getBrowUpRight(); _mouthSize = faceshift->getMouthSize(); + _mouthSmileLeft = faceshift->getMouthSmileLeft(); + _mouthSmileRight = faceshift->getMouthSmileRight(); _leftBlink = faceshift->getLeftBlink(); _rightBlink = faceshift->getRightBlink(); } @@ -294,33 +298,51 @@ void PerlinFace::updatePositions() { + _browsU_C * BROWS_UP_CENTER_MAX; + // Mouth _vertices[MOUTH_BOTTOM_IN].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_BOTTOM_IN + 1] - + (1.0 - _mouthSize) * 6.2; + + (1.0 - _mouthSize) * 6.5; _vertices[MOUTH_BOTTOM_OUT].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_BOTTOM_OUT + 1] - + (1.0 - _mouthSize) * 6; + + (1.0 - _mouthSize) * 6.5; _vertices[MOUTH_MID_IN].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_MID_IN + 1] - + (1.0 - _mouthSize) * 3; + + (1.0 - _mouthSize) * 4 + _mouthSmileLeft * 2; _vertices[MOUTH_MID_OUT].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_MID_OUT + 1] - + (1.0 - _mouthSize) * 3; + + (1.0 - _mouthSize) * 4 + _mouthSmileLeft * 2; _vertices[NUM_VERTICES + MOUTH_BOTTOM_IN].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_BOTTOM_IN) + 1] - + (1.0 - _mouthSize) * 6.2; + + (1.0 - _mouthSize) * 6.5; _vertices[NUM_VERTICES + MOUTH_BOTTOM_OUT].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_BOTTOM_OUT) + 1] - + (1.0 - _mouthSize) * 6; + + (1.0 - _mouthSize) * 6.5; _vertices[NUM_VERTICES + MOUTH_MID_IN].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_MID_IN) + 1] - + (1.0 - _mouthSize) * 3; + + (1.0 - _mouthSize) * 4 + _mouthSmileRight * 2; _vertices[NUM_VERTICES + MOUTH_MID_OUT].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_MID_OUT) + 1] - + (1.0 - _mouthSize) * 3; - - // Eyelid - _vertices[EYE_MID_TOP] = (1.0f - _leftBlink) * _vertices[EYE_MID_TOP] + _leftBlink * (_vertices[EYE_MID_TOP] + _vertices[EYE_MID_BOTTOM]) / 2.0f; - _vertices[EYE_MID_BOTTOM] = (1.0f - _leftBlink) * _vertices[EYE_MID_BOTTOM] + _leftBlink * (_vertices[EYE_MID_TOP] + _vertices[EYE_MID_BOTTOM]) / 2.0f; - - _vertices[NUM_VERTICES + EYE_MID_TOP] = (1.0f - _leftBlink) * _vertices[NUM_VERTICES + EYE_MID_TOP] - + _leftBlink * (_vertices[NUM_VERTICES + EYE_MID_TOP] + _vertices[NUM_VERTICES + EYE_MID_BOTTOM]) / 2.0f; - _vertices[NUM_VERTICES + EYE_MID_BOTTOM] = (1.0f - _leftBlink) * _vertices[NUM_VERTICES + EYE_MID_BOTTOM] - + _leftBlink * (_vertices[NUM_VERTICES + EYE_MID_TOP] + _vertices[NUM_VERTICES + EYE_MID_BOTTOM]) / 2.0f; - + + (1.0 - _mouthSize) * 4 + _mouthSmileRight * 2; + + qDebug("[DEBUG] %f : %f\n", _mouthSmileLeft, _mouthSmileRight); + + + // Eyelids + glm::vec3 topLeftEyelid = glm::vec3(VERTICES[FLOAT_PER_VERTEX * EYE_MID_TOP], + VERTICES[FLOAT_PER_VERTEX * EYE_MID_TOP + 1], + -VERTICES[FLOAT_PER_VERTEX * EYE_MID_TOP + 2]); + glm::vec3 bottomLeftEyelid = glm::vec3(VERTICES[FLOAT_PER_VERTEX * EYE_MID_BOTTOM], + VERTICES[FLOAT_PER_VERTEX * EYE_MID_BOTTOM + 1], + -VERTICES[FLOAT_PER_VERTEX * EYE_MID_BOTTOM + 2]); + glm::vec3 topRightEyelid = glm::vec3(VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + EYE_MID_TOP)], + VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + EYE_MID_TOP) + 1], + -VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + EYE_MID_TOP) + 2]); + glm::vec3 bottomRightEyelid = glm::vec3(VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + EYE_MID_BOTTOM)], + VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + EYE_MID_BOTTOM) + 1], + -VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + EYE_MID_BOTTOM) + 2]); + + _vertices[EYE_MID_TOP] = (1.0f - _leftBlink) * topLeftEyelid + + _leftBlink * (topLeftEyelid + bottomLeftEyelid) / 2.0f; + _vertices[EYE_MID_BOTTOM] = (1.0f - _leftBlink) * bottomLeftEyelid + + _leftBlink * (topLeftEyelid + bottomLeftEyelid) / 2.0f; + + _vertices[NUM_VERTICES + EYE_MID_TOP] = (1.0f - _leftBlink) * topRightEyelid + + _leftBlink * (topRightEyelid + bottomRightEyelid) / 2.0f; + _vertices[NUM_VERTICES + EYE_MID_BOTTOM] = (1.0f - _leftBlink) * bottomRightEyelid + + _leftBlink * (topRightEyelid + bottomRightEyelid) / 2.0f; } void PerlinFace::updateVertices() { diff --git a/interface/src/avatar/PerlinFace.h b/interface/src/avatar/PerlinFace.h index a31766e59e..575c02351b 100644 --- a/interface/src/avatar/PerlinFace.h +++ b/interface/src/avatar/PerlinFace.h @@ -63,6 +63,8 @@ private: float _browsU_R; float _mouthSize; + float _mouthSmileLeft; + float _mouthSmileRight; float _leftBlink; float _rightBlink; diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 196e204782..7ab14039fe 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -34,6 +34,10 @@ Faceshift::Faceshift() : _browUpLeftIndex(-1), _browUpRightIndex(-1), _mouthSize(0.0f), + _mouthSmileLeft(0), + _mouthSmileRight(0), + _mouthSmileLeftIndex(-1), + _mouthSmileRightIndex(0), _jawOpenIndex(-1), _longTermAverageEyePitch(0.0f), _longTermAverageEyeYaw(0.0f), @@ -146,6 +150,12 @@ void Faceshift::readFromSocket() { if (_jawOpenIndex != -1) { _mouthSize = data.m_coeffs[_jawOpenIndex]; } + if (_mouthSmileLeftIndex != -1) { + _mouthSmileLeft = data.m_coeffs[_mouthSmileLeftIndex]; + } + if (_mouthSmileRightIndex != -1) { + _mouthSmileRight = data.m_coeffs[_mouthSmileRightIndex]; + } } break; } @@ -175,6 +185,13 @@ void Faceshift::readFromSocket() { } else if (names[i] == "JawOpen") { _jawOpenIndex = i; + + } else if (names[i] == "MouthSmile_L") { + _mouthSmileLeftIndex = i; + + } else if (names[i] == "MouthSmile_R") { + _mouthSmileRightIndex = i; + } } break; diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 84306ca10c..ddd352b46d 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -48,6 +48,8 @@ public: float getBrowUpRight() const { return _browUpRight; } float getMouthSize() const { return _mouthSize; } + float getMouthSmileLeft() const { return _mouthSmileLeft; } + float getMouthSmileRight() const { return _mouthSmileRight; } void update(); void reset(); @@ -103,6 +105,12 @@ private: float _mouthSize; + float _mouthSmileLeft; + float _mouthSmileRight; + + int _mouthSmileLeftIndex; + int _mouthSmileRightIndex; + int _jawOpenIndex; float _longTermAverageEyePitch;