From 0b7e0ef43d32309a1abe86c2bd11f71cd35984c8 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 21 May 2013 16:13:41 -0700 Subject: [PATCH 01/13] test --- interface/src/Head.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index f4aa5c9785..4e224bad03 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -167,12 +167,10 @@ void Head::render(bool lookingInMirror) { renderMouth(); renderEyeBrows(); - /* if (_lookingAtSomething) { // Render lines originating from the eyes and converging on the lookatPosition - debugRenderLookatVectors(_leftEyePosition, _rightEyePosition, _lookatPosition); + debugRenderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); } - */ } void Head::renderHeadSphere() { @@ -355,7 +353,7 @@ void Head::renderEyeBalls() { glPushMatrix(); -//if (_lookingAtSomething) { + if (_lookingAtSomething) { //rotate the eyeball to aim towards the lookat position glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - _leftEyePosition); // the lookat direction @@ -363,7 +361,6 @@ void Head::renderEyeBalls() { float angle = 180.0f - angleBetween(targetLookatAxis, IDENTITY_UP); glRotatef(angle, rotationAxis.x, rotationAxis.y, rotationAxis.z); glRotatef(180.0, 0.0f, 1.0f, 0.0f); //adjust roll to correct after previous rotations -/* } else { //rotate the eyeball to aim straight ahead @@ -377,7 +374,6 @@ void Head::renderEyeBalls() { if ( dot < 0.0f ) { rollRotation = -rollRotation; } glRotatef(rollRotation, 0.0f, 1.0f, 0.0f); //roll the iris or correct roll about the lookat vector } -*/ glTranslatef( 0.0f, -IRIS_PROTRUSION, 0.0f);//push the iris out a bit (otherwise - inside of eyeball!) glScalef( 1.0f, 0.5f, 1.0f); // flatten the iris @@ -401,7 +397,7 @@ void Head::renderEyeBalls() { glPushMatrix(); -//if (_lookingAtSomething) { + if (_lookingAtSomething) { //rotate the eyeball to aim towards the lookat position glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - _rightEyePosition); @@ -409,7 +405,6 @@ void Head::renderEyeBalls() { float angle = 180.0f - angleBetween(targetLookatAxis, IDENTITY_UP); glRotatef(angle, rotationAxis.x, rotationAxis.y, rotationAxis.z); glRotatef(180.0f, 0.0f, 1.0f, 0.0f); //adjust roll to correct after previous rotations -/* } else { //rotate the eyeball to aim straight ahead @@ -423,7 +418,6 @@ void Head::renderEyeBalls() { if ( dot < 0.0f ) { rollRotation = -rollRotation; } glRotatef(rollRotation, 0.0f, 1.0f, 0.0f); //roll the iris or correct roll about the lookat vector } -*/ glTranslatef( 0.0f, -IRIS_PROTRUSION, 0.0f);//push the iris out a bit (otherwise - inside of eyeball!) glScalef( 1.0f, 0.5f, 1.0f); // flatten the iris @@ -441,7 +435,7 @@ void Head::renderEyeBalls() { void Head::debugRenderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) { glColor3f(0.0f, 0.0f, 0.0f); - glLineWidth(3.0); + glLineWidth(2.0); glBegin(GL_LINE_STRIP); glVertex3f(leftEyePosition.x, leftEyePosition.y, leftEyePosition.z); glVertex3f(lookatPosition.x, lookatPosition.y, lookatPosition.z); From c32d621d5fec4ffc2201600720b1b0b5b28e5794 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 21 May 2013 17:38:17 -0700 Subject: [PATCH 02/13] improving lookat behavior --- interface/src/Avatar.cpp | 45 +++++++++++++++++++++--------- interface/src/Head.cpp | 40 ++++++++++++++++++++++++++ interface/src/Head.h | 4 ++- libraries/avatars/src/HeadData.cpp | 1 + 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 9ca648a44a..a83d8f44c2 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -20,6 +20,10 @@ #include #include +//test +static glm::vec3 headLean(0.0f, 0.0f, 0.0f); + + using namespace std; const bool BALLS_ON = false; @@ -51,6 +55,11 @@ const float PERIPERSONAL_RADIUS = 1.0f; const float AVATAR_BRAKING_STRENGTH = 40.0f; const float JOINT_TOUCH_RANGE = 0.0005f; +const float LEAN_SENSITIVITY = 0.15; +const float LEAN_MAX = 0.45; +const float LEAN_AVERAGING = 10.0; +const float HEAD_RATE_MAX = 50.f; + float skinColor [] = {1.0, 0.84, 0.66}; float darkSkinColor[] = {0.9, 0.78, 0.63}; float lightBlue [] = {0.7, 0.8, 1.0 }; @@ -134,16 +143,12 @@ void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterfa _head.addRoll (measuredRollRate * deltaTime); // Update head lean distance based on accelerometer data - const float LEAN_SENSITIVITY = 0.15; - const float LEAN_MAX = 0.45; - const float LEAN_AVERAGING = 10.0; glm::vec3 headRotationRates(_head.getPitch(), _head.getYaw(), _head.getRoll()); - float headRateMax = 50.f; glm::vec3 leaning = (serialInterface->getLastAcceleration() - serialInterface->getGravity()) * LEAN_SENSITIVITY - * (1.f - fminf(glm::length(headRotationRates), headRateMax) / headRateMax); + * (1.f - fminf(glm::length(headRotationRates), HEAD_RATE_MAX) / HEAD_RATE_MAX); leaning.y = 0.f; if (glm::length(leaning) < LEAN_MAX) { _head.setLeanForward(_head.getLeanForward() * (1.f - LEAN_AVERAGING * deltaTime) + @@ -364,11 +369,27 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { //apply the head lean values to the springy position... if (fabs(_head.getLeanSideways() + _head.getLeanForward()) > 0.0f) { + glm::vec3 headLean = _orientation.getRight() * _head.getLeanSideways() + _orientation.getFront() * _head.getLeanForward(); + + /* + glm::vec3 leanForce = + _orientation.getRight() * _head.getLeanSideways() + + _orientation.getFront() * _head.getLeanForward() * 10.0f; + + float magnitude = 1.0f * deltaTime; + if (magnitude > 1.0f ) { + headLean = leanForce; + } else { + headLean += (leanForce - headLean ) * magnitude; + } + */ + // this is not a long-term solution, but it works ok for initial purposes of making the avatar lean + _joint[ AVATAR_JOINT_TORSO ].springyPosition += headLean * 0.1f; _joint[ AVATAR_JOINT_CHEST ].springyPosition += headLean * 0.4f; _joint[ AVATAR_JOINT_NECK_BASE ].springyPosition += headLean * 0.7f; @@ -385,17 +406,15 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { _joint[ AVATAR_JOINT_RIGHT_ELBOW ].springyPosition += headLean * 0.2f; _joint[ AVATAR_JOINT_RIGHT_WRIST ].springyPosition += headLean * 0.1f; _joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].springyPosition += headLean * 0.0f; - } + } // set head lookat position - if (_interactingOther) { - _head.setLooking(true); - - if (_isMine) { - _head.setLookAtPosition(_interactingOther->getSpringyHeadPosition()); - } + if ((_interactingOther) + && (_isMine)) { + _head.setLookAtPosition(_interactingOther->getSpringyHeadPosition()); } else { - _head.setLooking(false); + _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); + //_head.setLooking(false); } _head.setBodyRotation (glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll)); diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 4e224bad03..989299a474 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -46,6 +46,7 @@ Head::Head() : _returnSpringScale(1.0f), _bodyRotation(0.0f, 0.0f, 0.0f), _headRotation(0.0f, 0.0f, 0.0f) { + _lookingAtSomething = false; } void Head::reset() { @@ -99,6 +100,7 @@ void Head::simulate(float deltaTime, bool isMine) { } +/* void Head::setLooking(bool looking) { _lookingAtSomething = looking; @@ -111,8 +113,45 @@ void Head::setLooking(bool looking) { _lookingAtSomething = false; } } + */ +void Head::setLookAtPosition(const glm::vec3& lookAtPosition) { + + _lookAtPosition = lookAtPosition; + + if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking + _lookingAtSomething = false; + } else { + _lookingAtSomething = true; + } + + glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - averageEyePosition); + float dot = glm::dot(targetLookatAxis, _orientation.getFront()); + if (dot < MINIMUM_EYE_ROTATION) { + _lookingAtSomething = false; + } + + +/* + if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking + _lookingAtSomething = false; + } else { + glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - averageEyePosition); + float dot = glm::dot(targetLookatAxis, _orientation.getFront()); + if (dot < MINIMUM_EYE_ROTATION) { + _lookingAtSomething = false; + } else { + _lookAtPosition = lookAtPosition; + _lookingAtSomething = true; + } + } + */ + +} + void Head::calculateGeometry(bool lookingInMirror) { @@ -405,6 +444,7 @@ void Head::renderEyeBalls() { float angle = 180.0f - angleBetween(targetLookatAxis, IDENTITY_UP); glRotatef(angle, rotationAxis.x, rotationAxis.y, rotationAxis.z); glRotatef(180.0f, 0.0f, 1.0f, 0.0f); //adjust roll to correct after previous rotations + } else { //rotate the eyeball to aim straight ahead diff --git a/interface/src/Head.h b/interface/src/Head.h index 35f8c8e083..11843f0b15 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -31,7 +31,7 @@ public: void simulate(float deltaTime, bool isMine); void render(bool lookingInMirror); - void setLooking(bool looking); + //void setLooking(bool looking); void setScale (float scale ) { _scale = scale; } void setPosition (glm::vec3 position ) { _position = position; } @@ -43,6 +43,8 @@ public: void setAverageLoudness(float averageLoudness ) { _averageLoudness = averageLoudness; } void setAudioLoudness (float audioLoudness ) { _audioLoudness = audioLoudness; } void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; } + + void setLookAtPosition (const glm::vec3& lookAtPosition); // overrides method in HeadData const bool getReturnToCenter() const { return _returnHeadToCenter; } // Do you want head to try to return to center (depends on interface detected) float getAverageLoudness() {return _averageLoudness;}; diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index e7d6cee46a..9c01346152 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -31,6 +31,7 @@ void HeadData::addRoll(float roll) { setRoll(_roll + roll); } + void HeadData::addLean(float sideways, float forwards) { // Add lean as impulse _leanSideways += sideways; From 6e5f036eeb68fd67c8f251b1d3137a30547a4254 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 21 May 2013 17:41:50 -0700 Subject: [PATCH 03/13] test --- interface/src/Head.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 989299a474..df8c59bd12 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -134,6 +134,8 @@ void Head::setLookAtPosition(const glm::vec3& lookAtPosition) { } +_lookingAtSomething = true; + /* if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; From 006fc3268e78dbdda7f479e6accdeffcac6c43fd Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 21 May 2013 17:44:24 -0700 Subject: [PATCH 04/13] thingy --- interface/src/Head.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index df8c59bd12..2c59fb7770 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -120,6 +120,7 @@ void Head::setLookAtPosition(const glm::vec3& lookAtPosition) { _lookAtPosition = lookAtPosition; +/* if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; } else { @@ -132,6 +133,8 @@ void Head::setLookAtPosition(const glm::vec3& lookAtPosition) { if (dot < MINIMUM_EYE_ROTATION) { _lookingAtSomething = false; } + */ + _lookingAtSomething = true; From 9f82b9fb43a6fa14c34b0be49f65e3cfd5737cb1 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Tue, 21 May 2013 17:51:41 -0700 Subject: [PATCH 05/13] test --- interface/src/Avatar.cpp | 3 +-- interface/src/Head.cpp | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index a83d8f44c2..cb4e431b04 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -410,11 +410,10 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { // set head lookat position if ((_interactingOther) - && (_isMine)) { + && (_isMine)) { _head.setLookAtPosition(_interactingOther->getSpringyHeadPosition()); } else { _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); - //_head.setLooking(false); } _head.setBodyRotation (glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll)); diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 2c59fb7770..1d74b80995 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -120,6 +120,8 @@ void Head::setLookAtPosition(const glm::vec3& lookAtPosition) { _lookAtPosition = lookAtPosition; + _lookingAtSomething = true; + /* if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; From 493aff31334f68b39a1a811df21e6f10067fb011 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 11:42:35 -0700 Subject: [PATCH 06/13] more prototyping of head feature geometry --- interface/src/Avatar.cpp | 14 ---- interface/src/Head.cpp | 134 ++++++++++++++++++--------------------- interface/src/Head.h | 3 +- 3 files changed, 62 insertions(+), 89 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index cb4e431b04..1528753975 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -374,20 +374,6 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { _orientation.getRight() * _head.getLeanSideways() + _orientation.getFront() * _head.getLeanForward(); - /* - glm::vec3 leanForce = - _orientation.getRight() * _head.getLeanSideways() + - _orientation.getFront() * _head.getLeanForward() * 10.0f; - - float magnitude = 1.0f * deltaTime; - if (magnitude > 1.0f ) { - headLean = leanForce; - } else { - headLean += (leanForce - headLean ) * magnitude; - } - */ - - // this is not a long-term solution, but it works ok for initial purposes of making the avatar lean _joint[ AVATAR_JOINT_TORSO ].springyPosition += headLean * 0.1f; diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 1d74b80995..520fda0151 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -13,32 +13,41 @@ using namespace std; const float EYE_RIGHT_OFFSET = 0.27f; -const float EYE_UP_OFFSET = 0.38f; +const float EYE_UP_OFFSET = 0.36f; const float EYE_FRONT_OFFSET = 0.8f; const float EAR_RIGHT_OFFSET = 1.0; const float MOUTH_FRONT_OFFSET = 1.0f; const float MOUTH_UP_OFFSET = -0.3f; -const float HEAD_MOTION_DECAY = 0.1; -const float MINIMUM_EYE_ROTATION = 0.7f; // based on a dot product: 1.0 is straight ahead, 0.0 is 90 degrees off -const float EYEBALL_RADIUS = 0.02; -const float EYEBALL_COLOR[3] = { 0.9f, 0.9f, 0.8f }; -const float IRIS_RADIUS = 0.007; -const float IRIS_PROTRUSION = 0.018f; -const char IRIS_TEXTURE_FILENAME[] = "resources/images/iris.png"; +const float HEAD_MOTION_DECAY = 0.1; +const float MINIMUM_EYE_ROTATION = 0.7f; // based on a dot product: 1.0 is straight ahead, 0.0 is 90 degrees off +const float EYEBALL_RADIUS = 0.017; +const float EYEBALL_COLOR[3] = { 0.9f, 0.9f, 0.8f }; +const float IRIS_RADIUS = 0.007; +const float IRIS_PROTRUSION = 0.0145f; +const char IRIS_TEXTURE_FILENAME[] = "resources/images/iris.png"; unsigned int IRIS_TEXTURE_WIDTH = 768; unsigned int IRIS_TEXTURE_HEIGHT = 498; vector irisTexture; Head::Head() : + yawRate(0.0f), + _returnHeadToCenter(false), _audioLoudness(0.0f), _skinColor(0.0f, 0.0f, 0.0f), _position(0.0f, 0.0f, 0.0f), _rotation(0.0f, 0.0f, 0.0f), + _leftEyePosition(0.0f, 0.0f, 0.0f), + _rightEyePosition(0.0f, 0.0f, 0.0f), + _leftEyeBrowPosition(0.0f, 0.0f, 0.0f), + _rightEyeBrowPosition(0.0f, 0.0f, 0.0f), + _leftEarPosition(0.0f, 0.0f, 0.0f), + _rightEarPosition(0.0f, 0.0f, 0.0f), _mouthPosition(0.0f, 0.0f, 0.0f), _scale(1.0f), _browAudioLift(0.0f), + _lookingAtSomething(false), _gravity(0.0f, -1.0f, 0.0f), _lastLoudness(0.0f), _averageLoudness(0.0f), @@ -46,7 +55,6 @@ Head::Head() : _returnSpringScale(1.0f), _bodyRotation(0.0f, 0.0f, 0.0f), _headRotation(0.0f, 0.0f, 0.0f) { - _lookingAtSomething = false; } void Head::reset() { @@ -190,6 +198,10 @@ void Head::calculateGeometry(bool lookingInMirror) { + _orientation.getUp () * _scale * EYE_UP_OFFSET + _orientation.getFront() * _scale * EYE_FRONT_OFFSET; + //calculate the eyebrow positions + _leftEyeBrowPosition = _leftEyePosition; + _rightEyeBrowPosition = _rightEyePosition; + //calculate the ear positions _leftEarPosition = _position - _orientation.getRight() * _scale * EAR_RIGHT_OFFSET; _rightEarPosition = _position + _orientation.getRight() * _scale * EAR_RIGHT_OFFSET; @@ -248,53 +260,33 @@ void Head::renderEars() { void Head::renderMouth() { float s = sqrt(_averageLoudness); - float height = _scale * (0.05f + s * 0.0040f ); - float width = _scale * (0.30f + s * 0.0014f ); - glm::vec3 leftCorner = _mouthPosition; - glm::vec3 rightCorner = _mouthPosition; - glm::vec3 leftTop = _mouthPosition; - glm::vec3 rightTop = _mouthPosition; - glm::vec3 leftBottom = _mouthPosition; - glm::vec3 rightBottom = _mouthPosition; - - leftCorner -= _orientation.getRight() * width; - rightCorner += _orientation.getRight() * width; - leftTop -= _orientation.getRight() * width * 0.4f; - rightTop += _orientation.getRight() * width * 0.4f; - leftBottom -= _orientation.getRight() * width * 0.4f; - rightBottom += _orientation.getRight() * width * 0.4f; - - leftTop += _orientation.getUp() * height * 0.7f; - rightTop += _orientation.getUp() * height * 0.7f; - leftBottom -= _orientation.getUp() * height; - rightBottom -= _orientation.getUp() * height; - - leftTop += _orientation.getFront() * _scale * 0.1f; - rightTop += _orientation.getFront() * _scale * 0.1f; - leftBottom += _orientation.getFront() * _scale * 0.1f; - rightBottom += _orientation.getFront() * _scale * 0.1f; + glm::vec3 r = _orientation.getRight() * _scale * (0.30f + s * 0.0014f ); + glm::vec3 u = _orientation.getUp () * _scale * (0.05f + s * 0.0040f ); + glm::vec3 f = _orientation.getFront() * _scale * 0.1f; + glm::vec3 leftCorner = _mouthPosition - r * 1.0f; + glm::vec3 rightCorner = _mouthPosition + r * 1.0f; + glm::vec3 leftTop = _mouthPosition - r * 0.4f + u * 0.7f + f; + glm::vec3 rightTop = _mouthPosition + r * 0.4f + u * 0.7f + f; + glm::vec3 leftBottom = _mouthPosition - r * 0.4f - u * 1.0f + f; + glm::vec3 rightBottom = _mouthPosition + r * 0.4f - u * 1.0f + f; + glColor3f(0.2f, 0.0f, 0.0f); glBegin(GL_TRIANGLES); - - glVertex3f(leftCorner.x, leftCorner.y, leftCorner.z); - glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z); - glVertex3f(leftTop.x, leftTop.y, leftTop.z ); - - glVertex3f(leftTop.x, leftTop.y, leftTop.z ); - glVertex3f(rightTop.x, rightTop.y, rightTop.z ); - glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z); - + glVertex3f(leftCorner.x, leftCorner.y, leftCorner.z ); + glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z ); + glVertex3f(leftTop.x, leftTop.y, leftTop.z ); + glVertex3f(leftTop.x, leftTop.y, leftTop.z ); + glVertex3f(rightTop.x, rightTop.y, rightTop.z ); + glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z ); glVertex3f(rightTop.x, rightTop.y, rightTop.z ); glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z ); glVertex3f(rightBottom.x, rightBottom.y, rightBottom.z); - glVertex3f(rightTop.x, rightTop.y, rightTop.z ); glVertex3f(rightBottom.x, rightBottom.y, rightBottom.z); glVertex3f(rightCorner.x, rightCorner.y, rightCorner.z); - glEnd(); } @@ -315,48 +307,42 @@ void Head::renderEyeBrows() { glm::vec3 leftBottom = _leftEyePosition; glm::vec3 rightBottom = _leftEyePosition; + glm::vec3 r = _orientation.getRight() * length; + glm::vec3 u = _orientation.getUp() * height; + glm::vec3 t = _orientation.getUp() * (height + width); + glm::vec3 f = _orientation.getFront() * _scale * -0.1f; + for (int i = 0; i < 2; i++) { if ( i == 1 ) { leftCorner = rightCorner = leftTop = rightTop = leftBottom = rightBottom = _rightEyePosition; } - leftCorner -= _orientation.getRight() * length; - rightCorner += _orientation.getRight() * length; - leftTop -= _orientation.getRight() * length * 0.4f; - rightTop += _orientation.getRight() * length * 0.4f; - leftBottom -= _orientation.getRight() * length * 0.4f; - rightBottom += _orientation.getRight() * length * 0.4f; + leftCorner -= r * 1.0f; + rightCorner += r * 1.0f; + leftTop -= r * 0.4f; + rightTop += r * 0.4f; + leftBottom -= r * 0.4f; + rightBottom += r * 0.4f; - leftCorner += _orientation.getUp() * height; - rightCorner += _orientation.getUp() * height; - leftTop += _orientation.getUp() * (height + width); - rightTop += _orientation.getUp() * (height + width); - leftBottom += _orientation.getUp() * height; - rightBottom += _orientation.getUp() * height; - - leftCorner += _orientation.getFront() * _scale * -0.1f; - rightCorner += _orientation.getFront() * _scale * -0.1f; - leftTop += _orientation.getFront() * _scale * -0.1f; - rightTop += _orientation.getFront() * _scale * -0.1f; - leftBottom += _orientation.getFront() * _scale * -0.1f; - rightBottom += _orientation.getFront() * _scale * -0.1f; - + leftCorner += u + f; + rightCorner += u + f; + leftTop += t + f; + rightTop += t + f; + leftBottom += u + f; + rightBottom += u + f; glBegin(GL_TRIANGLES); - glVertex3f(leftCorner.x, leftCorner.y, leftCorner.z); - glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z); - glVertex3f(leftTop.x, leftTop.y, leftTop.z ); - - glVertex3f(leftTop.x, leftTop.y, leftTop.z ); - glVertex3f(rightTop.x, rightTop.y, rightTop.z ); - glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z); - + glVertex3f(leftCorner.x, leftCorner.y, leftCorner.z ); + glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z ); + glVertex3f(leftTop.x, leftTop.y, leftTop.z ); + glVertex3f(leftTop.x, leftTop.y, leftTop.z ); + glVertex3f(rightTop.x, rightTop.y, rightTop.z ); + glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z ); glVertex3f(rightTop.x, rightTop.y, rightTop.z ); glVertex3f(leftBottom.x, leftBottom.y, leftBottom.z ); glVertex3f(rightBottom.x, rightBottom.y, rightBottom.z); - glVertex3f(rightTop.x, rightTop.y, rightTop.z ); glVertex3f(rightBottom.x, rightBottom.y, rightBottom.z); glVertex3f(rightCorner.x, rightCorner.y, rightCorner.z); diff --git a/interface/src/Head.h b/interface/src/Head.h index 11843f0b15..5254e71610 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -61,6 +61,8 @@ private: glm::vec3 _rotation; glm::vec3 _leftEyePosition; glm::vec3 _rightEyePosition; + glm::vec3 _leftEyeBrowPosition; + glm::vec3 _rightEyeBrowPosition; glm::vec3 _leftEarPosition; glm::vec3 _rightEarPosition; glm::vec3 _mouthPosition; @@ -83,7 +85,6 @@ private: void renderEars(); void renderMouth(); void debugRenderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); - void updateEyePositions(); void calculateGeometry( bool lookingInMirror); }; From 3c3a3fc82e65b90d1e444ad61f0683fd961a7e9f Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 13:12:11 -0700 Subject: [PATCH 07/13] cleaning up look at code - Stephen helped find a transmission bug - fixed. --- interface/src/Avatar.cpp | 24 ++++++++-------- interface/src/Camera.cpp | 17 ++++++++---- interface/src/Camera.h | 13 +++++++++ interface/src/Head.cpp | 41 ++++++++-------------------- interface/src/Head.h | 4 ++- libraries/avatars/src/AvatarData.cpp | 4 +-- 6 files changed, 54 insertions(+), 49 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 1528753975..eed61a622a 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -20,10 +20,6 @@ #include #include -//test -static glm::vec3 headLean(0.0f, 0.0f, 0.0f); - - using namespace std; const bool BALLS_ON = false; @@ -395,13 +391,14 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { } // set head lookat position - if ((_interactingOther) - && (_isMine)) { - _head.setLookAtPosition(_interactingOther->getSpringyHeadPosition()); - } else { - _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); + if (_isMine) { + if (_interactingOther) { + _head.setLookAtPosition(_interactingOther->getApproximateEyePosition()); + } else { + _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); + } } - + _head.setBodyRotation (glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll)); _head.setPosition(_joint[ AVATAR_JOINT_HEAD_BASE ].springyPosition); _head.setScale (_joint[ AVATAR_JOINT_HEAD_BASE ].radius); @@ -417,6 +414,11 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { } } +glm::vec3 Avatar::getApproximateEyePosition() { + + return _head.getApproximateEyePosition(); +} + void Avatar::checkForMouseRayTouching() { for (int b = 0; b < NUM_AVATAR_JOINTS; b++) { @@ -722,7 +724,7 @@ void Avatar::render(bool lookingInMirror, glm::vec3 cameraPosition) { //render body renderBody(lookingInMirror); - + // if this is my avatar, then render my interactions with the other avatar if (_isMine) { _avatarTouch.render(_cameraPosition); diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 4cba3cc66e..b408135c40 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -37,18 +37,25 @@ Camera::Camera() { _idealPosition = glm::vec3(0.0, 0.0, 0.0); _orientation.setToIdentity(); - for (int m = 0; m < NUM_CAMERA_MODES; m ++) { - _attributes[m].upShift = 0.0f; - _attributes[m].distance = 0.0f; - _attributes[m].tightness = 0.0f; + _attributes[CAMERA_MODE_FIRST_PERSON].upShift = CAMERA_DEFAULT_FIRST_PERSON_MODE_UP_SHIFT; + _attributes[CAMERA_MODE_FIRST_PERSON].distance = CAMERA_DEFAULT_FIRST_PERSON_MODE_DISTANCE; + _attributes[CAMERA_MODE_FIRST_PERSON].tightness = CAMERA_DEFAULT_FIRST_PERSON_MODE_TIGHTNESS; + + _attributes[CAMERA_MODE_THIRD_PERSON].upShift = CAMERA_DEFAULT_THIRD_PERSON_MODE_UP_SHIFT; + _attributes[CAMERA_MODE_THIRD_PERSON].distance = CAMERA_DEFAULT_THIRD_PERSON_MODE_DISTANCE; + _attributes[CAMERA_MODE_THIRD_PERSON].tightness = CAMERA_DEFAULT_THIRD_PERSON_MODE_TIGHTNESS; + + _attributes[CAMERA_MODE_MIRROR ].upShift = CAMERA_DEFAULT_MIRROR_MODE_UP_SHIFT; + _attributes[CAMERA_MODE_MIRROR ].distance = CAMERA_DEFAULT_MIRROR_MODE_DISTANCE; + _attributes[CAMERA_MODE_MIRROR ].tightness = CAMERA_DEFAULT_MIRROR_MODE_TIGHTNESS; + for (int m = 0; m < NUM_CAMERA_MODES; m ++) { _previousAttributes[m].upShift = 0.0f; _previousAttributes[m].distance = 0.0f; _previousAttributes[m].tightness = 0.0f; } } - void Camera::update(float deltaTime) { if (_mode != CAMERA_MODE_NULL) { diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 8b70a06504..b01839d97a 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -21,6 +21,19 @@ enum CameraMode NUM_CAMERA_MODES }; + +const float CAMERA_DEFAULT_FIRST_PERSON_MODE_UP_SHIFT = 0.0f; +const float CAMERA_DEFAULT_FIRST_PERSON_MODE_DISTANCE = 0.0f; +const float CAMERA_DEFAULT_FIRST_PERSON_MODE_TIGHTNESS = 100.0f; + +const float CAMERA_DEFAULT_THIRD_PERSON_MODE_UP_SHIFT = -0.2f; +const float CAMERA_DEFAULT_THIRD_PERSON_MODE_DISTANCE = 1.5f; +const float CAMERA_DEFAULT_THIRD_PERSON_MODE_TIGHTNESS = 8.0f; + +const float CAMERA_DEFAULT_MIRROR_MODE_UP_SHIFT = 0.0f; +const float CAMERA_DEFAULT_MIRROR_MODE_DISTANCE = 0.2f; +const float CAMERA_DEFAULT_MIRROR_MODE_TIGHTNESS = 100.0f; + class Camera { public: diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 520fda0151..a8be6cc35a 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -104,7 +104,11 @@ void Head::simulate(float deltaTime, bool isMine) { float clamp = 0.01; if (_browAudioLift > clamp) { _browAudioLift = clamp; } - _browAudioLift *= 0.7f; + _browAudioLift *= 0.7f; + +//add comment when done... +processLookat(); + } @@ -124,33 +128,9 @@ void Head::setLooking(bool looking) { */ -void Head::setLookAtPosition(const glm::vec3& lookAtPosition) { +void Head::processLookat() { - _lookAtPosition = lookAtPosition; - - _lookingAtSomething = true; - -/* - if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking - _lookingAtSomething = false; - } else { - _lookingAtSomething = true; - } - - glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; - glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - averageEyePosition); - float dot = glm::dot(targetLookatAxis, _orientation.getFront()); - if (dot < MINIMUM_EYE_ROTATION) { - _lookingAtSomething = false; - } - */ - - - -_lookingAtSomething = true; - -/* - if ( fabs(lookAtPosition.x + lookAtPosition.y + lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking + if ( fabs(_lookAtPosition.x + _lookAtPosition.y + _lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; } else { glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; @@ -159,12 +139,13 @@ _lookingAtSomething = true; if (dot < MINIMUM_EYE_ROTATION) { _lookingAtSomething = false; } else { - _lookAtPosition = lookAtPosition; _lookingAtSomething = true; } } - */ - +} + +glm::vec3 Head::getApproximateEyePosition() { + return _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; } diff --git a/interface/src/Head.h b/interface/src/Head.h index 5254e71610..28230701f3 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -44,10 +44,11 @@ public: void setAudioLoudness (float audioLoudness ) { _audioLoudness = audioLoudness; } void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; } - void setLookAtPosition (const glm::vec3& lookAtPosition); // overrides method in HeadData + //void setLookAtPosition (const glm::vec3& lookAtPosition); // overrides method in HeadData const bool getReturnToCenter() const { return _returnHeadToCenter; } // Do you want head to try to return to center (depends on interface detected) float getAverageLoudness() {return _averageLoudness;}; + glm::vec3 getApproximateEyePosition(); float yawRate; float noise; @@ -86,6 +87,7 @@ private: void renderMouth(); void debugRenderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); void calculateGeometry( bool lookingInMirror); + void processLookat(); }; #endif diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 498e43cc28..ab69c28dd0 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -97,7 +97,7 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { // Lookat Position memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); destinationBuffer += sizeof(_headData->_lookAtPosition); - + // Hand State (0 = not grabbing, 1 = grabbing) memcpy(destinationBuffer, &_handState, sizeof(char)); destinationBuffer += sizeof(char); @@ -191,7 +191,7 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { // Lookat Position memcpy(&_headData->_lookAtPosition, sourceBuffer, sizeof(_headData->_lookAtPosition)); sourceBuffer += sizeof(_headData->_lookAtPosition); - + // Hand State memcpy(&_handState, sourceBuffer, sizeof(char)); sourceBuffer += sizeof(char); From 4d95d0a426268c3fb33a57fc3202b059156b86ce Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 13:24:19 -0700 Subject: [PATCH 08/13] more cleanup on lookat --- interface/src/Avatar.cpp | 6 +++--- interface/src/Avatar.h | 2 +- interface/src/Head.cpp | 5 ++--- interface/src/Head.h | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 1ff183e245..49378c43d6 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -404,7 +404,7 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { // set head lookat position if (_isMine) { if (_interactingOther) { - _head.setLookAtPosition(_interactingOther->getApproximateEyePosition()); + _head.setLookAtPosition(_interactingOther->getAverageEyePosition()); } else { _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); } @@ -425,9 +425,9 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { } } -glm::vec3 Avatar::getApproximateEyePosition() { +glm::vec3 Avatar::getAverageEyePosition() { - return _head.getApproximateEyePosition(); + return _head.getAverageEyePosition(); } void Avatar::checkForMouseRayTouching() { diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index cc2192ad52..5bb4638cdf 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -94,7 +94,7 @@ public: float getAbsoluteHeadYaw() const; float getAbsoluteHeadPitch() const; - glm::vec3 getApproximateEyePosition(); + glm::vec3 getAverageEyePosition(); // get the position smack-dab between the eyes (for lookat) const glm::vec3& getHeadPosition() const ; // get the position of the avatar's rigid body head const glm::vec3& getSpringyHeadPosition() const ; // get the springy position of the avatar's head const glm::vec3& getJointPosition(AvatarJointID j) const { return _joint[j].springyPosition; }; diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index b7101e8539..961b06c734 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -135,8 +135,7 @@ void Head::processLookat() { if ( fabs(_lookAtPosition.x + _lookAtPosition.y + _lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; } else { - glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; - glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - averageEyePosition); + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - getAverageEyePosition()); float dot = glm::dot(targetLookatAxis, _orientation.getFront()); if (dot < MINIMUM_EYE_ROTATION) { _lookingAtSomething = false; @@ -146,7 +145,7 @@ void Head::processLookat() { } } -glm::vec3 Head::getApproximateEyePosition() { +glm::vec3 Head::getAverageEyePosition() { return _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; } diff --git a/interface/src/Head.h b/interface/src/Head.h index 28230701f3..7f602877c1 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -48,7 +48,7 @@ public: const bool getReturnToCenter() const { return _returnHeadToCenter; } // Do you want head to try to return to center (depends on interface detected) float getAverageLoudness() {return _averageLoudness;}; - glm::vec3 getApproximateEyePosition(); + glm::vec3 getAverageEyePosition(); float yawRate; float noise; From 86a2d2316f629d7244f4b937da051ddc3366ade4 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 13:44:38 -0700 Subject: [PATCH 09/13] added method to set look at vector on/off --- interface/src/Avatar.cpp | 13 +-------- interface/src/Head.cpp | 59 ++++++++++++++-------------------------- interface/src/Head.h | 8 ++---- 3 files changed, 25 insertions(+), 55 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 49378c43d6..e43092edb4 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -373,7 +373,6 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { _head.setPitch(_head.getPitch() * (1.f - acceleration * ACCELERATION_PITCH_DECAY * deltaTime)); } - //apply the head lean values to the springy position... if (fabs(_head.getLeanSideways() + _head.getLeanForward()) > 0.0f) { @@ -406,7 +405,7 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { if (_interactingOther) { _head.setLookAtPosition(_interactingOther->getAverageEyePosition()); } else { - _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); + _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); // 0,0,0 represents NOT looking at anything } } @@ -1159,16 +1158,6 @@ void Avatar::renderBody(bool lookingInMirror) { _joint[_joint[j].parent ].radius * 0.8, _joint[j ].radius * 0.8 ); - - /* - // Render lines connecting the joint positions - glColor3f(0.4f, 0.5f, 0.6f); - glLineWidth(3.0); - glBegin(GL_LINE_STRIP); - glVertex3fv(&_joint[ _joint[ b ].parent ].springyPosition.x); - glVertex3fv(&_joint[ b ].springyPosition.x); - glEnd(); - */ } } } diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 961b06c734..512a1e4307 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -12,19 +12,19 @@ using namespace std; -const float EYE_RIGHT_OFFSET = 0.27f; -const float EYE_UP_OFFSET = 0.36f; -const float EYE_FRONT_OFFSET = 0.8f; -const float EAR_RIGHT_OFFSET = 1.0; -const float MOUTH_FRONT_OFFSET = 1.0f; -const float MOUTH_UP_OFFSET = -0.3f; -const float HEAD_MOTION_DECAY = 0.1; -const float MINIMUM_EYE_ROTATION = 0.7f; // based on a dot product: 1.0 is straight ahead, 0.0 is 90 degrees off -const float EYEBALL_RADIUS = 0.017; -const float EYEBALL_COLOR[3] = { 0.9f, 0.9f, 0.8f }; -const float IRIS_RADIUS = 0.007; -const float IRIS_PROTRUSION = 0.0145f; -const char IRIS_TEXTURE_FILENAME[] = "resources/images/iris.png"; +const float EYE_RIGHT_OFFSET = 0.27f; +const float EYE_UP_OFFSET = 0.36f; +const float EYE_FRONT_OFFSET = 0.8f; +const float EAR_RIGHT_OFFSET = 1.0; +const float MOUTH_FRONT_OFFSET = 1.0f; +const float MOUTH_UP_OFFSET = -0.3f; +const float HEAD_MOTION_DECAY = 0.1; +const float MINIMUM_EYE_ROTATION_DOT = 0.5f; // based on a dot product: 1.0 is straight ahead, 0.0 is 90 degrees off +const float EYEBALL_RADIUS = 0.017; +const float EYEBALL_COLOR[3] = { 0.9f, 0.9f, 0.8f }; +const float IRIS_RADIUS = 0.007; +const float IRIS_PROTRUSION = 0.0145f; +const char IRIS_TEXTURE_FILENAME[] = "resources/images/iris.png"; unsigned int IRIS_TEXTURE_WIDTH = 768; unsigned int IRIS_TEXTURE_HEIGHT = 498; @@ -54,7 +54,8 @@ Head::Head() : _audioAttack(0.0f), _returnSpringScale(1.0f), _bodyRotation(0.0f, 0.0f, 0.0f), - _headRotation(0.0f, 0.0f, 0.0f) { + _headRotation(0.0f, 0.0f, 0.0f), + _renderLookatVectors(false) { } void Head::reset() { @@ -113,23 +114,6 @@ processLookat(); } - -/* -void Head::setLooking(bool looking) { - - _lookingAtSomething = looking; - - glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; - glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - averageEyePosition); - - float dot = glm::dot(targetLookatAxis, _orientation.getFront()); - if (dot < MINIMUM_EYE_ROTATION) { - _lookingAtSomething = false; - } -} - */ - - void Head::processLookat() { if ( fabs(_lookAtPosition.x + _lookAtPosition.y + _lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking @@ -137,7 +121,7 @@ void Head::processLookat() { } else { glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - getAverageEyePosition()); float dot = glm::dot(targetLookatAxis, _orientation.getFront()); - if (dot < MINIMUM_EYE_ROTATION) { + if (dot < MINIMUM_EYE_ROTATION_DOT) { _lookingAtSomething = false; } else { _lookingAtSomething = true; @@ -149,8 +133,6 @@ glm::vec3 Head::getAverageEyePosition() { return _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; } - - void Head::calculateGeometry(bool lookingInMirror) { //generate orientation directions based on Euler angles... @@ -207,9 +189,10 @@ void Head::render(bool lookingInMirror) { renderMouth(); renderEyeBrows(); - if (_lookingAtSomething) { - // Render lines originating from the eyes and converging on the lookatPosition - debugRenderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); + if (_renderLookatVectors) { + if (_lookingAtSomething) { + renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); + } } } @@ -447,7 +430,7 @@ void Head::renderEyeBalls() { glPopMatrix(); } -void Head::debugRenderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) { +void Head::renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition) { glColor3f(0.0f, 0.0f, 0.0f); glLineWidth(2.0); diff --git a/interface/src/Head.h b/interface/src/Head.h index 7f602877c1..fa4775590d 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -31,8 +31,6 @@ public: void simulate(float deltaTime, bool isMine); void render(bool lookingInMirror); - //void setLooking(bool looking); - void setScale (float scale ) { _scale = scale; } void setPosition (glm::vec3 position ) { _position = position; } void setBodyRotation (glm::vec3 bodyRotation ) { _bodyRotation = bodyRotation; } @@ -43,8 +41,7 @@ public: void setAverageLoudness(float averageLoudness ) { _averageLoudness = averageLoudness; } void setAudioLoudness (float audioLoudness ) { _audioLoudness = audioLoudness; } void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; } - - //void setLookAtPosition (const glm::vec3& lookAtPosition); // overrides method in HeadData + void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; } const bool getReturnToCenter() const { return _returnHeadToCenter; } // Do you want head to try to return to center (depends on interface detected) float getAverageLoudness() {return _averageLoudness;}; @@ -78,6 +75,7 @@ private: Orientation _orientation; glm::vec3 _bodyRotation; glm::vec3 _headRotation; + bool _renderLookatVectors; // private methods void renderHeadSphere(); @@ -85,7 +83,7 @@ private: void renderEyeBrows(); void renderEars(); void renderMouth(); - void debugRenderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); + void renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); void calculateGeometry( bool lookingInMirror); void processLookat(); }; From d786fd155f6c4c3a1c38abe356bfe5003422fab8 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 13:52:29 -0700 Subject: [PATCH 10/13] clean up --- interface/src/Head.cpp | 9 ++++----- interface/src/Head.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 512a1e4307..d187e0d23b 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -109,19 +109,18 @@ void Head::simulate(float deltaTime, bool isMine) { _browAudioLift *= 0.7f; -//add comment when done... -processLookat(); - + // based on the nature of the lookat position, determine if the eyes can look / are looking at it. + determineIfLookingAtSomething(); } -void Head::processLookat() { +void Head::determineIfLookingAtSomething() { if ( fabs(_lookAtPosition.x + _lookAtPosition.y + _lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; } else { glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - getAverageEyePosition()); float dot = glm::dot(targetLookatAxis, _orientation.getFront()); - if (dot < MINIMUM_EYE_ROTATION_DOT) { + if (dot < MINIMUM_EYE_ROTATION_DOT) { // too far off from center for the eyes to rotate _lookingAtSomething = false; } else { _lookingAtSomething = true; diff --git a/interface/src/Head.h b/interface/src/Head.h index fa4775590d..de92aeb2e4 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -85,7 +85,7 @@ private: void renderMouth(); void renderLookatVectors(glm::vec3 leftEyePosition, glm::vec3 rightEyePosition, glm::vec3 lookatPosition); void calculateGeometry( bool lookingInMirror); - void processLookat(); + void determineIfLookingAtSomething(); }; #endif From 83e2bf253490b6e8d5bae1d5eebaea4e621f9b3d Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 14:42:03 -0700 Subject: [PATCH 11/13] added menu option for setting display of lookat vectors --- interface/src/Application.cpp | 14 +++++++++++++- interface/src/Application.h | 2 ++ interface/src/Avatar.cpp | 4 ++++ interface/src/Avatar.h | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d56163e170..2fc6ae3c3e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1225,12 +1225,17 @@ void Application::initMenu() { _renderAvatarsOn->setChecked(true); (_renderFrameTimerOn = renderMenu->addAction("Show Timer"))->setCheckable(true); _renderFrameTimerOn->setChecked(false); - + (_renderLookatOn = renderMenu->addAction("Lookat Vectors"))->setCheckable(true); + _renderLookatOn->setChecked(false); + renderMenu->addAction("First Person", this, SLOT(setRenderFirstPerson(bool)), Qt::Key_P)->setCheckable(true); + (_oculusOn = renderMenu->addAction("Oculus", this, SLOT(setOculus(bool)), Qt::Key_O))->setCheckable(true); QMenu* toolsMenu = menuBar->addMenu("Tools"); + (_renderStatsOn = toolsMenu->addAction("Stats"))->setCheckable(true); + _renderStatsOn->setShortcut(Qt::Key_Slash); (_logOn = toolsMenu->addAction("Log"))->setCheckable(true); _logOn->setChecked(true); @@ -1336,6 +1341,7 @@ void Application::init() { a.tightness = 8.0f; _myCamera.setMode(CAMERA_MODE_THIRD_PERSON, a); _myAvatar.setDisplayingHead(true); + _myAvatar.setDisplayingLookatVectors(false); QCursor::setPos(_headMouseX, _headMouseY); @@ -1713,6 +1719,12 @@ void Application::displaySide(Camera& whichCamera) { // Render my own Avatar _myAvatar.render(_lookingInMirror->isChecked(), _myCamera.getPosition()); + + if (_renderLookatOn->isChecked()) { + _myAvatar.setDisplayingLookatVectors(true); + } else { + _myAvatar.setDisplayingLookatVectors(false); + } } // Render the world box diff --git a/interface/src/Application.h b/interface/src/Application.h index e420426c63..35fb8366c0 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -77,6 +77,7 @@ private slots: void setFullscreen(bool fullscreen); void setRenderFirstPerson(bool firstPerson); + //void setRenderLookatVectors(bool lookatVectors); void setOculus(bool oculus); void setFrustumOffset(bool frustumOffset); @@ -146,6 +147,7 @@ private: QAction* _oculusOn; // Whether to configure the display for the Oculus Rift QAction* _renderStatsOn; // Whether to show onscreen text overlay with stats QAction* _renderFrameTimerOn; // Whether to show onscreen text overlay with stats + QAction* _renderLookatOn; // Whether to show lookat vectors from avatar eyes if looking at something QAction* _logOn; // Whether to show on-screen log QActionGroup* _voxelModeActions; // The group of voxel edit mode actions QAction* _addVoxelMode; // Whether add voxel mode is enabled diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index e43092edb4..c6ebb61f42 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -705,6 +705,10 @@ void Avatar::setDisplayingHead(bool displayingHead) { _displayingHead = displayingHead; } +void Avatar::setDisplayingLookatVectors(bool displayingLookatVectors) { + _head.setRenderLookatVectors(displayingLookatVectors); +} + static TextRenderer* textRenderer() { static TextRenderer* renderer = new TextRenderer(SANS_FONT_FAMILY, 24, -1, false, TextRenderer::SHADOW_EFFECT); return renderer; diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 5bb4638cdf..d386e2afd7 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -114,6 +114,7 @@ public: void setMovedHandOffset(glm::vec3 movedHandOffset) { _movedHandOffset = movedHandOffset; } void updateArmIKAndConstraints( float deltaTime ); void setDisplayingHead( bool displayingHead ); + void setDisplayingLookatVectors(bool displayingLookatVectors); // Set what driving keys are being pressed to control thrust levels void setDriveKeys(int key, bool val) { _driveKeys[key] = val; }; From 0b014c563521271dd9616bd4691c8c7ae6495a8a Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 15:50:36 -0700 Subject: [PATCH 12/13] cleaned up some stuff --- interface/src/Application.cpp | 6 +----- interface/src/Avatar.cpp | 23 +---------------------- interface/src/Avatar.h | 8 ++++---- interface/src/Head.cpp | 13 +++---------- interface/src/Head.h | 3 ++- 5 files changed, 11 insertions(+), 42 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e33a49be6e..577edc229d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1702,11 +1702,7 @@ void Application::displaySide(Camera& whichCamera) { // Render my own Avatar _myAvatar.render(_lookingInMirror->isChecked(), _myCamera.getPosition()); - if (_renderLookatOn->isChecked()) { - _myAvatar.setDisplayingLookatVectors(true); - } else { - _myAvatar.setDisplayingLookatVectors(false); - } + _myAvatar.setDisplayingLookatVectors(_renderLookatOn->isChecked()); } // Render the world box diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 9655076ffd..3b2c9bf686 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -400,7 +400,7 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { // set head lookat position if (_isMine) { if (_interactingOther) { - _head.setLookAtPosition(_interactingOther->getAverageEyePosition()); + _head.setLookAtPosition(_interactingOther->caclulateAverageEyePosition()); } else { _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); // 0,0,0 represents NOT looking at anything } @@ -421,11 +421,6 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { } } -glm::vec3 Avatar::getAverageEyePosition() { - - return _head.getAverageEyePosition(); -} - void Avatar::checkForMouseRayTouching() { for (int b = 0; b < NUM_AVATAR_JOINTS; b++) { @@ -587,15 +582,6 @@ void Avatar::updateCollisionWithSphere(glm::vec3 position, float radius, float d } } } - - /* - if (jointCollision) { - if (!_usingBodySprings) { - _usingBodySprings = true; - initializeBodySprings(); - } - } - */ } } @@ -716,13 +702,6 @@ void Avatar::applyCollisionWithOtherAvatar(Avatar * otherAvatar, float deltaTime otherAvatar->_velocity *= bodyMomentum; } -void Avatar::setDisplayingHead(bool displayingHead) { - _displayingHead = displayingHead; -} - -void Avatar::setDisplayingLookatVectors(bool displayingLookatVectors) { - _head.setRenderLookatVectors(displayingLookatVectors); -} static TextRenderer* textRenderer() { static TextRenderer* renderer = new TextRenderer(SANS_FONT_FAMILY, 24, -1, false, TextRenderer::SHADOW_EFFECT); diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index a2f2b83383..9afe9d4b05 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -94,7 +94,7 @@ public: float getAbsoluteHeadYaw() const; float getAbsoluteHeadPitch() const; - glm::vec3 getAverageEyePosition(); // get the position smack-dab between the eyes (for lookat) + glm::vec3 caclulateAverageEyePosition() { return _head.caclulateAverageEyePosition(); } // get the position smack-dab between the eyes (for lookat) const glm::vec3& getHeadPosition() const ; // get the position of the avatar's rigid body head const glm::vec3& getSpringyHeadPosition() const ; // get the springy position of the avatar's head const glm::vec3& getJointPosition(AvatarJointID j) const { return _joint[j].springyPosition; }; @@ -113,9 +113,9 @@ public: void simulate(float deltaTime, Transmitter* transmitter); void setMovedHandOffset(glm::vec3 movedHandOffset) { _movedHandOffset = movedHandOffset; } void updateArmIKAndConstraints( float deltaTime ); - void setDisplayingHead( bool displayingHead ); - void setDisplayingLookatVectors(bool displayingLookatVectors); - + void setDisplayingHead( bool displayingHead ) { _displayingHead = displayingHead; } + void setDisplayingLookatVectors(bool displayingLookatVectors) { _head.setRenderLookatVectors(displayingLookatVectors); } + // Set what driving keys are being pressed to control thrust levels void setDriveKeys(int key, bool val) { _driveKeys[key] = val; }; bool getDriveKeys(int key) { return _driveKeys[key]; }; diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index d187e0d23b..9561cee19e 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -7,7 +7,6 @@ #include "Head.h" #include "Util.h" #include -#include #include using namespace std; @@ -118,7 +117,7 @@ void Head::determineIfLookingAtSomething() { if ( fabs(_lookAtPosition.x + _lookAtPosition.y + _lookAtPosition.z) == 0.0 ) { // a lookatPosition of 0,0,0 signifies NOT looking _lookingAtSomething = false; } else { - glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - getAverageEyePosition()); + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - caclulateAverageEyePosition()); float dot = glm::dot(targetLookatAxis, _orientation.getFront()); if (dot < MINIMUM_EYE_ROTATION_DOT) { // too far off from center for the eyes to rotate _lookingAtSomething = false; @@ -128,10 +127,6 @@ void Head::determineIfLookingAtSomething() { } } -glm::vec3 Head::getAverageEyePosition() { - return _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; -} - void Head::calculateGeometry(bool lookingInMirror) { //generate orientation directions based on Euler angles... @@ -188,10 +183,8 @@ void Head::render(bool lookingInMirror) { renderMouth(); renderEyeBrows(); - if (_renderLookatVectors) { - if (_lookingAtSomething) { - renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); - } + if (_renderLookatVectors && _lookingAtSomething) { + renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); } } diff --git a/interface/src/Head.h b/interface/src/Head.h index de92aeb2e4..5b45c6421c 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -15,6 +15,7 @@ #include "InterfaceConfig.h" #include "SerialInterface.h" #include "Orientation.h" +#include enum eyeContactTargets { @@ -45,7 +46,7 @@ public: const bool getReturnToCenter() const { return _returnHeadToCenter; } // Do you want head to try to return to center (depends on interface detected) float getAverageLoudness() {return _averageLoudness;}; - glm::vec3 getAverageEyePosition(); + glm::vec3 caclulateAverageEyePosition() { return _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; } float yawRate; float noise; From f866f39ac42a36f1b2edab1f5511c4a0a420169f Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 22 May 2013 15:51:25 -0700 Subject: [PATCH 13/13] cleanups --- libraries/avatars/src/Orientation.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 libraries/avatars/src/Orientation.h diff --git a/libraries/avatars/src/Orientation.h b/libraries/avatars/src/Orientation.h old mode 100755 new mode 100644