From 0306b63af4a19dfa57080e38d686844c26fc6f28 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 15:32:16 -0700 Subject: [PATCH 1/7] added more cleanup and preparation for switching over to quaternions --- interface/src/Head.cpp | 56 ++++++++++++++++------------ interface/src/Head.h | 5 +-- libraries/avatars/src/AvatarData.cpp | 2 + 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index ace31629ca..b4d075e592 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -18,6 +18,9 @@ #include #include #include +//#include +//#include +//#include //looks like we might not need this using namespace std; @@ -529,8 +532,6 @@ void Head::simulate(float deltaTime) { - - void Head::render(int faceToFace, int isMine) { //--------------------------------------------------- @@ -822,17 +823,17 @@ void Head::initializeSkeleton() { for (int b=0; b #include -#include - +#include //looks like we might not need this enum eyeContactTargets {LEFT_EYE, RIGHT_EYE, MOUTH}; @@ -85,7 +84,7 @@ struct AvatarBone glm::vec3 springyPosition; // used for special effects (a 'flexible' variant of position) glm::dvec3 springyVelocity; // used for special effects ( the velocity of the springy position) float springBodyTightness; // how tightly the springy position tries to stay on the position - glm::quat rotation; // this will eventually replace yaw, pitch and roll (and maybe orienttion) + glm::quat rotation; // this will eventually replace yaw, pitch and roll (and maybe orientation) float yaw; // the yaw Euler angle of the bone rotation off the parent float pitch; // the pitch Euler angle of the bone rotation off the parent float roll; // the roll Euler angle of the bone rotation off the parent diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 0bf9ddff74..5e113e3454 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -58,6 +58,8 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyPitch); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyRoll); + //printf( "_bodyYaw = %f\n", _bodyYaw ); + return destinationBuffer - bufferStart; } From 5aeb307be26b4fc885b5ef6ed4472199ffe13bae Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 15:36:40 -0700 Subject: [PATCH 2/7] including Philips hand position transmission code --- interface/src/Head.cpp | 5 +++-- libraries/avatars/src/AvatarData.cpp | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 127f4afe66..3bb78aa5bb 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -132,7 +132,6 @@ Head::Head(bool isMine) { DEBUG_otherAvatarListPosition[ 4 ] = glm::vec3( -2.0, 0.3, -2.0 ); } - Head::Head(const Head &otherHead) { initializeAvatar(); @@ -531,7 +530,9 @@ void Head::simulate(float deltaTime) { -void Head::render(int faceToFace, int isMine) { + + +void Head::render(int faceToFace) { //--------------------------------------------------- // show avatar position diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 0f080fceeb..02c97e3446 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -57,7 +57,10 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyPitch); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyRoll); - //printf( "_bodyYaw = %f\n", _bodyYaw ); + memcpy(destinationBuffer, &_handPosition, sizeof(float) * 3); + destinationBuffer += sizeof(float) * 3; + + //std::cout << _handPosition.x << ", " << _handPosition.y << ", " << _handPosition.z << "\n"; return destinationBuffer - bufferStart; } From ecb5047e7cbeacc3c805a15d42d33901f841db45 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 16:58:04 -0700 Subject: [PATCH 3/7] removed initializeAvatar() method in Head class (deprecated). and also un-negated the pos in the rendering of other avatars (same fix as Philip just made) --- interface/src/Head.cpp | 118 +++++++++++---------------- interface/src/Head.h | 1 - interface/src/main.cpp | 5 +- libraries/avatars/src/AvatarData.cpp | 4 + 4 files changed, 55 insertions(+), 73 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 3bb78aa5bb..d691bc2e1b 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -49,7 +49,6 @@ unsigned int iris_texture_width = 512; unsigned int iris_texture_height = 256; Head::Head(bool isMine) { - initializeAvatar(); _avatar.orientation.setToIdentity(); _avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); @@ -133,7 +132,6 @@ Head::Head(bool isMine) { } Head::Head(const Head &otherHead) { - initializeAvatar(); _avatar.orientation.set( otherHead._avatar.orientation ); _avatar.velocity = otherHead._avatar.velocity; @@ -352,42 +350,44 @@ void Head::simulate(float deltaTime) { _previousHandBeingMoved = _handBeingMoved; _handBeingMoved = false; - //------------------------------------------------- - // this handles the avatar being driven around... - //------------------------------------------------- - _avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); - - if (driveKeys[FWD]) { - glm::vec3 front( _avatar.orientation.getFront().x, _avatar.orientation.getFront().y, _avatar.orientation.getFront().z ); - _avatar.thrust += front * THRUST_MAG; - } - if (driveKeys[BACK]) { - glm::vec3 front( _avatar.orientation.getFront().x, _avatar.orientation.getFront().y, _avatar.orientation.getFront().z ); - _avatar.thrust -= front * THRUST_MAG; - } - if (driveKeys[RIGHT]) { - glm::vec3 right( _avatar.orientation.getRight().x, _avatar.orientation.getRight().y, _avatar.orientation.getRight().z ); - _avatar.thrust -= right * THRUST_MAG; - } - if (driveKeys[LEFT]) { - glm::vec3 right( _avatar.orientation.getRight().x, _avatar.orientation.getRight().y, _avatar.orientation.getRight().z ); - _avatar.thrust += right * THRUST_MAG; - } - if (driveKeys[UP]) { - glm::vec3 up( _avatar.orientation.getUp().x, _avatar.orientation.getUp().y, _avatar.orientation.getUp().z ); - _avatar.thrust += up * THRUST_MAG; - } - if (driveKeys[DOWN]) { - glm::vec3 up( _avatar.orientation.getUp().x, _avatar.orientation.getUp().y, _avatar.orientation.getUp().z ); - _avatar.thrust -= up * THRUST_MAG; - } - if (driveKeys[ROT_RIGHT]) { - _bodyYawDelta -= YAW_MAG * deltaTime; - } - if (driveKeys[ROT_LEFT]) { - _bodyYawDelta += YAW_MAG * deltaTime; - } - + if ( _isMine ) { // driving the avatar around should only apply is this is my avatar (as opposed to an avatar being driven remotely) + //------------------------------------------------- + // this handles the avatar being driven around... + //------------------------------------------------- + _avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); + + if (driveKeys[FWD]) { + glm::vec3 front( _avatar.orientation.getFront().x, _avatar.orientation.getFront().y, _avatar.orientation.getFront().z ); + _avatar.thrust += front * THRUST_MAG; + } + if (driveKeys[BACK]) { + glm::vec3 front( _avatar.orientation.getFront().x, _avatar.orientation.getFront().y, _avatar.orientation.getFront().z ); + _avatar.thrust -= front * THRUST_MAG; + } + if (driveKeys[RIGHT]) { + glm::vec3 right( _avatar.orientation.getRight().x, _avatar.orientation.getRight().y, _avatar.orientation.getRight().z ); + _avatar.thrust -= right * THRUST_MAG; + } + if (driveKeys[LEFT]) { + glm::vec3 right( _avatar.orientation.getRight().x, _avatar.orientation.getRight().y, _avatar.orientation.getRight().z ); + _avatar.thrust += right * THRUST_MAG; + } + if (driveKeys[UP]) { + glm::vec3 up( _avatar.orientation.getUp().x, _avatar.orientation.getUp().y, _avatar.orientation.getUp().z ); + _avatar.thrust += up * THRUST_MAG; + } + if (driveKeys[DOWN]) { + glm::vec3 up( _avatar.orientation.getUp().x, _avatar.orientation.getUp().y, _avatar.orientation.getUp().z ); + _avatar.thrust -= up * THRUST_MAG; + } + if (driveKeys[ROT_RIGHT]) { + _bodyYawDelta -= YAW_MAG * deltaTime; + } + if (driveKeys[ROT_LEFT]) { + _bodyYawDelta += YAW_MAG * deltaTime; + } + } + //---------------------------------------------------------- float translationalSpeed = glm::length( _avatar.velocity ); float rotationalSpeed = fabs( _bodyYawDelta ); @@ -403,7 +403,7 @@ void Head::simulate(float deltaTime) { //---------------------------------------------------------- // update body yaw by body yaw delta //---------------------------------------------------------- - _bodyYaw += _bodyYawDelta * deltaTime; + _bodyYaw += _bodyYawDelta * deltaTime; //---------------------------------------------------------- // (for now) set head yaw to body yaw @@ -650,7 +650,7 @@ void Head::renderHead( int faceToFace) { // Don't render a head if it is really close to your location, because that is your own head! //if (!isMine || faceToFace) - { + //{ glRotatef(Pitch, 1, 0, 0); glRotatef(Roll, 0, 0, 1); @@ -780,7 +780,7 @@ void Head::renderHead( int faceToFace) { glPopMatrix(); - } + //} glPopMatrix(); } @@ -797,29 +797,6 @@ AvatarMode Head::getMode() { } -void Head::initializeAvatar() { -/* - avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); - avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); - avatar.orientation.setToIdentity(); - - closestOtherAvatar = 0; - - _bodyYaw = -90.0; - _bodyPitch = 0.0; - _bodyRoll = 0.0; - - bodyYawDelta = 0.0; - - triggeringAction = false; - - mode = AVATAR_MODE_STANDING; - - initializeSkeleton(); - */ -} - - void Head::initializeSkeleton() { for (int b=0; bgetLinkedData(); glPushMatrix(); glm::vec3 pos = agentHead->getBodyPosition(); - glTranslatef(-pos.x, -pos.y, -pos.z); + glTranslatef(pos.x, pos.y, pos.z); agentHead->render(0); glPopMatrix(); } @@ -839,7 +839,6 @@ void display(void) // brad's frustum for debugging if (::frustumOn) render_view_frustum(); - //Render my own avatar myAvatar.render(true); } @@ -1361,7 +1360,7 @@ void idle(void) { } // - // Sample hardware, update view frustum if needed, send avatar data to mixer/agents + // Sample hardware, update view frustum if needed, Lsend avatar data to mixer/agents // updateAvatar( 1.f/FPS ); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 02c97e3446..fe36b44817 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -57,6 +57,8 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyPitch); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyRoll); + //printf( "_bodyYaw = %f\n", _bodyYaw ); + memcpy(destinationBuffer, &_handPosition, sizeof(float) * 3); destinationBuffer += sizeof(float) * 3; @@ -78,6 +80,8 @@ void AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyPitch); sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyRoll); + printf( "_bodyYaw = %f\n", _bodyYaw ); + memcpy(&_handPosition, sourceBuffer, sizeof(float) * 3); sourceBuffer += sizeof(float) * 3; From aba20c6afd3ec191f3ec812edc14ae2cad9e631a Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 17:48:08 -0700 Subject: [PATCH 4/7] a few debugging changes --- interface/src/Head.cpp | 6 +++--- libraries/avatars/src/AvatarData.cpp | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index d691bc2e1b..0ee70d11cf 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -922,7 +922,7 @@ void Head::updateSkeleton() { _avatar.orientation.yaw( _bodyYaw ); //test! - make sure this does what expected: st rotation to be identity PLUS _bodyYaw - _rotation = glm::angleAxis( _bodyYaw, _avatar.orientation.up ); + //_rotation = glm::angleAxis( _bodyYaw, _avatar.orientation.up ); //glm::quat yaw_rotation = glm::angleAxis( _bodyYaw, _avatar.orientation.up ); @@ -940,7 +940,7 @@ void Head::updateSkeleton() { _bone[b].position = _bone[ _bone[b].parent ].position; } - ///TEST! - get this working and then add a comment JJV + ///TEST! - get this working and then add a comment; JJV if ( ! _isMine ) { _bone[ AVATAR_BONE_RIGHT_HAND ].position = _handPosition; } @@ -1051,7 +1051,7 @@ void Head::updateHandMovement() { + _avatar.orientation.getFront() * -_movedHandOffset.y; _bone[ AVATAR_BONE_RIGHT_HAND ].position += transformedHandMovement; - + //if holding hands, add a pull to the hand... if ( _usingSprings ) { if ( _closestOtherAvatar != -1 ) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5e1fbf7828..0f3d5db777 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -63,7 +63,7 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { memcpy(destinationBuffer, &_handPosition, sizeof(float) * 3); destinationBuffer += sizeof(float) * 3; - //std::cout << _handPosition.x << ", " << _handPosition.y << ", " << _handPosition.z << "\n"; + std::cout << _handPosition.x << ", " << _handPosition.y << ", " << _handPosition.z << "\n"; return destinationBuffer - bufferStart; } @@ -80,8 +80,6 @@ void AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyPitch); sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyRoll); - printf( "_bodyYaw = %f\n", _bodyYaw ); - memcpy(&_handPosition, sourceBuffer, sizeof(float) * 3); sourceBuffer += sizeof(float) * 3; From 4e12f26467648e2b0e9a24db061629d790c5a6a9 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 18:10:32 -0700 Subject: [PATCH 5/7] added _isMine check for my _bodyYaw update --- interface/src/Head.cpp | 13 ++++++------- interface/src/main.cpp | 9 ++++----- libraries/avatars/src/AvatarData.cpp | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 0ee70d11cf..084d7a618d 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -388,6 +388,7 @@ void Head::simulate(float deltaTime) { } } + //---------------------------------------------------------- float translationalSpeed = glm::length( _avatar.velocity ); float rotationalSpeed = fabs( _bodyYawDelta ); @@ -403,8 +404,10 @@ void Head::simulate(float deltaTime) { //---------------------------------------------------------- // update body yaw by body yaw delta //---------------------------------------------------------- + if (_isMine) { _bodyYaw += _bodyYawDelta * deltaTime; - + } + //---------------------------------------------------------- // (for now) set head yaw to body yaw //---------------------------------------------------------- @@ -414,12 +417,12 @@ void Head::simulate(float deltaTime) { // decay body yaw delta //---------------------------------------------------------- const float TEST_YAW_DECAY = 5.0; - _bodyYawDelta *= ( 1.0 - TEST_YAW_DECAY * deltaTime ); + _bodyYawDelta *= (1.0 - TEST_YAW_DECAY * deltaTime); //---------------------------------------------------------- // add thrust to velocity //---------------------------------------------------------- - _avatar.velocity += glm::dvec3( _avatar.thrust * deltaTime ); + _avatar.velocity += glm::dvec3(_avatar.thrust * deltaTime); //---------------------------------------------------------- // update position by velocity @@ -432,8 +435,6 @@ void Head::simulate(float deltaTime) { const float LIN_VEL_DECAY = 5.0; _avatar.velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime ); - - if (!noise) { // Decay back toward center Pitch *= (1.f - DECAY*2*deltaTime); @@ -450,8 +451,6 @@ void Head::simulate(float deltaTime) { leanForward *= (1.f - DECAY*30.f*deltaTime); leanSideways *= (1.f - DECAY*30.f*deltaTime); - - // Update where the avatar's eyes are // // First, decide if we are making eye contact or not diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 62fa6c77a3..a0e4903bcd 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1365,10 +1365,9 @@ void idle(void) { // updateAvatar( 1.f/FPS ); - - //test - /* - for(std::vector::iterator agent = agentList.getAgents().begin(); agent != agentList.getAgents().end(); agent++) + //loop through all the other avatars and simulate them. + AgentList * agentList = AgentList::getInstance(); + for(std::vector::iterator agent = agentList->getAgents().begin(); agent != agentList->getAgents().end(); agent++) { if (agent->getLinkedData() != NULL) { @@ -1376,7 +1375,7 @@ void idle(void) { agentHead->simulate(1.f/FPS); } } - */ + updateAvatarHand(1.f/FPS); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index f3a29179d0..4c9164de0b 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -58,7 +58,7 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyPitch); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyRoll); - //printf( "_bodyYaw = %f\n", _bodyYaw ); + //printf( "_bodyYaw = %f", _bodyYaw ); memcpy(destinationBuffer, &_handPosition, sizeof(float) * 3); destinationBuffer += sizeof(float) * 3; From 46c95ea4af904eb091e578b921a8fe2bd970f555 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 18:28:26 -0700 Subject: [PATCH 6/7] did some code cleanup in Head class and added some _isMine checks to differentiate between my av and others --- interface/src/Head.cpp | 382 ++++++++++++++++++++--------------------- 1 file changed, 189 insertions(+), 193 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 084d7a618d..333fb356fb 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -275,50 +275,49 @@ void Head::setTriggeringAction( bool d ) { void Head::simulate(float deltaTime) { - - //------------------------------------- - // DEBUG - other avatars... - //------------------------------------- - //closeEnoughToInteract = 0.3f; - _closestOtherAvatar = -1; - float closestDistance = 10000.0f; - - - /* - AgentList * agentList = AgentList::getInstance(); + + //------------------------------------------------------------- + // if the avatar being simulated is mone, then loop through + // all the other avatars to get information about them... + //------------------------------------------------------------- + if ( _isMine ) + { + //------------------------------------- + // DEBUG - other avatars... + //------------------------------------- + _closestOtherAvatar = -1; + float closestDistance = 10000.0f; + + AgentList * agentList = AgentList::getInstance(); for(std::vector::iterator agent = agentList->getAgents().begin(); agent != agentList->getAgents().end(); agent++) { if (( agent->getLinkedData() != NULL && ( agent->getType() == AGENT_TYPE_INTERFACE ) )) { - Head *agentHead = (Head *)agent->getLinkedData(); + Head *otherAvatar = (Head *)agent->getLinkedData(); - // when this is working, I will grab the position here... - //glm::vec3 pos = agentHead->getPos(); - + // when this is working, I will grab the position here... + glm::vec3 otherAvatarPosition = otherAvatar->getBodyPosition(); } } - */ - - for (int o=0; osimulate(deltaTime); } @@ -557,31 +553,37 @@ void Head::render(int faceToFace) { //--------------------------------------------------- renderHead(faceToFace); - //--------------------------------------------------- - // render other avatars (DEBUG TEST) - //--------------------------------------------------- - for (int o=0; o BROW_LIFT_THRESHOLD) - browAudioLift += sqrt(audioAttack)/1000.0; - - browAudioLift *= .90; - - glPushMatrix(); - glTranslatef(-interBrowDistance/2.0,0.4,0.45); - for(side = 0; side < 2; side++) { - glColor3fv(browColor); - glPushMatrix(); - glTranslatef(0, 0.35 + browAudioLift, 0); - glRotatef(EyebrowPitch[side]/2.0, 1, 0, 0); - glRotatef(EyebrowRoll[side]/2.0, 0, 0, 1); - glScalef(browWidth, browThickness, 1); - glutSolidCube(0.5); - glPopMatrix(); - glTranslatef(interBrowDistance, 0, 0); - } - glPopMatrix(); - - - // Mouth - - glPushMatrix(); - glTranslatef(0,-0.35,0.75); - glColor3f(0,0,0); - glRotatef(MouthPitch, 1, 0, 0); - glRotatef(MouthYaw, 0, 0, 1); - glScalef(MouthWidth*(.7 + sqrt(averageLoudness)/60.0), MouthHeight*(1.0 + sqrt(averageLoudness)/30.0), 1); - glutSolidCube(0.5); - glPopMatrix(); - - glTranslatef(0, 1.0, 0); - - glTranslatef(-interPupilDistance/2.0,-0.68,0.7); - // Right Eye - glRotatef(-10, 1, 0, 0); - glColor3fv(eyeColor); - glPushMatrix(); - { - glTranslatef(interPupilDistance/10.0, 0, 0.05); - glRotatef(20, 0, 0, 1); - glScalef(EyeballScaleX, EyeballScaleY, EyeballScaleZ); - glutSolidSphere(0.25, 30, 30); - } - glPopMatrix(); - - // Right Pupil - if (sphere == NULL) { - sphere = gluNewQuadric(); - gluQuadricTexture(sphere, GL_TRUE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - gluQuadricOrientation(sphere, GLU_OUTSIDE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, iris_texture_width, iris_texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &iris_texture[0]); - } - - glPushMatrix(); - { - glRotatef(EyeballPitch[1], 1, 0, 0); - glRotatef(EyeballYaw[1] + PupilConverge, 0, 1, 0); - glTranslatef(0,0,.35); - glRotatef(-75,1,0,0); - glScalef(1.0, 0.4, 1.0); + glRotatef(_bodyYaw, 0, 1, 0);// should this use Yaw? - glEnable(GL_TEXTURE_2D); - gluSphere(sphere, PupilSize, 15, 15); - glDisable(GL_TEXTURE_2D); - } + glRotatef(Pitch, 1, 0, 0); + glRotatef(Roll, 0, 0, 1); + + // Overall scale of head + if (faceToFace) glScalef(2.0, 2.0, 2.0); + else glScalef(0.75, 1.0, 1.0); + + glColor3fv(skinColor); - glPopMatrix(); - // Left Eye - glColor3fv(eyeColor); - glTranslatef(interPupilDistance, 0, 0); - glPushMatrix(); - { - glTranslatef(-interPupilDistance/10.0, 0, .05); - glRotatef(-20, 0, 0, 1); - glScalef(EyeballScaleX, EyeballScaleY, EyeballScaleZ); - glutSolidSphere(0.25, 30, 30); + // Head + if (!_isMine) glColor3f(0,0,1); // Temp: Other people are BLUE + glutSolidSphere(1, 30, 30); + + // Ears + glPushMatrix(); + glTranslatef(1.0, 0, 0); + for(side = 0; side < 2; side++) { + glPushMatrix(); + glScalef(0.3, 0.65, .65); + glutSolidSphere(0.5, 30, 30); + glPopMatrix(); + glTranslatef(-2.0, 0, 0); } - glPopMatrix(); - // Left Pupil - glPushMatrix(); - { - glRotatef(EyeballPitch[0], 1, 0, 0); - glRotatef(EyeballYaw[0] - PupilConverge, 0, 1, 0); - glTranslatef(0, 0, .35); - glRotatef(-75, 1, 0, 0); - glScalef(1.0, 0.4, 1.0); + glPopMatrix(); - glEnable(GL_TEXTURE_2D); - gluSphere(sphere, PupilSize, 15, 15); - glDisable(GL_TEXTURE_2D); + // Eyebrows + audioAttack = 0.9*audioAttack + 0.1*fabs(loudness - lastLoudness); + lastLoudness = loudness; + + const float BROW_LIFT_THRESHOLD = 100; + if (audioAttack > BROW_LIFT_THRESHOLD) + browAudioLift += sqrt(audioAttack)/1000.0; + + browAudioLift *= .90; + + glPushMatrix(); + glTranslatef(-interBrowDistance/2.0,0.4,0.45); + for(side = 0; side < 2; side++) { + glColor3fv(browColor); + glPushMatrix(); + glTranslatef(0, 0.35 + browAudioLift, 0); + glRotatef(EyebrowPitch[side]/2.0, 1, 0, 0); + glRotatef(EyebrowRoll[side]/2.0, 0, 0, 1); + glScalef(browWidth, browThickness, 1); + glutSolidCube(0.5); + glPopMatrix(); + glTranslatef(interBrowDistance, 0, 0); } + glPopMatrix(); + + + // Mouth + + glPushMatrix(); + glTranslatef(0,-0.35,0.75); + glColor3f(0,0,0); + glRotatef(MouthPitch, 1, 0, 0); + glRotatef(MouthYaw, 0, 0, 1); + glScalef(MouthWidth*(.7 + sqrt(averageLoudness)/60.0), MouthHeight*(1.0 + sqrt(averageLoudness)/30.0), 1); + glutSolidCube(0.5); + glPopMatrix(); + + glTranslatef(0, 1.0, 0); + + glTranslatef(-interPupilDistance/2.0,-0.68,0.7); + // Right Eye + glRotatef(-10, 1, 0, 0); + glColor3fv(eyeColor); + glPushMatrix(); + { + glTranslatef(interPupilDistance/10.0, 0, 0.05); + glRotatef(20, 0, 0, 1); + glScalef(EyeballScaleX, EyeballScaleY, EyeballScaleZ); + glutSolidSphere(0.25, 30, 30); + } + glPopMatrix(); + + // Right Pupil + if (sphere == NULL) { + sphere = gluNewQuadric(); + gluQuadricTexture(sphere, GL_TRUE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + gluQuadricOrientation(sphere, GLU_OUTSIDE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, iris_texture_width, iris_texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &iris_texture[0]); + } + + glPushMatrix(); + { + glRotatef(EyeballPitch[1], 1, 0, 0); + glRotatef(EyeballYaw[1] + PupilConverge, 0, 1, 0); + glTranslatef(0,0,.35); + glRotatef(-75,1,0,0); + glScalef(1.0, 0.4, 1.0); - glPopMatrix(); + glEnable(GL_TEXTURE_2D); + gluSphere(sphere, PupilSize, 15, 15); + glDisable(GL_TEXTURE_2D); + } + + glPopMatrix(); + // Left Eye + glColor3fv(eyeColor); + glTranslatef(interPupilDistance, 0, 0); + glPushMatrix(); + { + glTranslatef(-interPupilDistance/10.0, 0, .05); + glRotatef(-20, 0, 0, 1); + glScalef(EyeballScaleX, EyeballScaleY, EyeballScaleZ); + glutSolidSphere(0.25, 30, 30); + } + glPopMatrix(); + // Left Pupil + glPushMatrix(); + { + glRotatef(EyeballPitch[0], 1, 0, 0); + glRotatef(EyeballYaw[0] - PupilConverge, 0, 1, 0); + glTranslatef(0, 0, .35); + glRotatef(-75, 1, 0, 0); + glScalef(1.0, 0.4, 1.0); + + glEnable(GL_TEXTURE_2D); + gluSphere(sphere, PupilSize, 15, 15); + glDisable(GL_TEXTURE_2D); + } + + glPopMatrix(); + - //} glPopMatrix(); } From bd0eb9f69c9d6267d9e1b064d53901e6acf26a46 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 23:18:36 -0700 Subject: [PATCH 7/7] renamed Yaw Pitch Roll to _headYaw, _headPitch, _headRoll, in Head class. And also added a "bigSphere avatar collision test", also added a bone radius (for collision detection) --- interface/src/Head.cpp | 177 +++++++++++++++++++++++--------- interface/src/Head.h | 38 ++++--- interface/src/SerialInterface.h | 6 +- interface/src/main.cpp | 15 ++- 4 files changed, 162 insertions(+), 74 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 333fb356fb..059851ee0a 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -38,6 +38,8 @@ float MouthWidthChoices[3] = {0.5, 0.77, 0.3}; float browWidth = 0.8; float browThickness = 0.16; +bool usingBigSphereCollisionTest = false; + const float DECAY = 0.1; const float THRUST_MAG = 10.0; const float YAW_MAG = 300.0; @@ -65,13 +67,16 @@ Head::Head(bool isMine) { initializeSkeleton(); + _TEST_bigSphereRadius = 0.3f; + _TEST_bigSpherePosition = glm::vec3( 0.0f, _TEST_bigSphereRadius, 2.0f ); + for (int i = 0; i < MAX_DRIVE_KEYS; i++) driveKeys[i] = false; PupilSize = 0.10; interPupilDistance = 0.6; interBrowDistance = 0.75; NominalPupilSize = 0.10; - Yaw = 0.0; + _headYaw = 0.0; EyebrowPitch[0] = EyebrowPitch[1] = -30; EyebrowRoll[0] = 20; EyebrowRoll[1] = -20; @@ -153,7 +158,7 @@ Head::Head(const Head &otherHead) { interPupilDistance = otherHead.interPupilDistance; interBrowDistance = otherHead.interBrowDistance; NominalPupilSize = otherHead.NominalPupilSize; - Yaw = otherHead.Yaw; + _headYaw = otherHead._headYaw; EyebrowPitch[0] = otherHead.EyebrowPitch[0]; EyebrowPitch[1] = otherHead.EyebrowPitch[1]; EyebrowRoll[0] = otherHead.EyebrowRoll[0]; @@ -202,7 +207,7 @@ Head* Head::clone() const { } void Head::reset() { - Pitch = Yaw = Roll = 0; + _headPitch = _headYaw = _headRoll = 0; leanForward = leanSideways = 0; } @@ -214,13 +219,13 @@ void Head::UpdateGyros(float frametime, SerialInterface * serialInterface, int h { const float PITCH_ACCEL_COUPLING = 0.5; const float ROLL_ACCEL_COUPLING = -1.0; - float measured_pitch_rate = serialInterface->getRelativeValue(PITCH_RATE); - YawRate = serialInterface->getRelativeValue(YAW_RATE); + float measured_pitch_rate = serialInterface->getRelativeValue(HEAD_PITCH_RATE); + _headYawRate = serialInterface->getRelativeValue(HEAD_YAW_RATE); float measured_lateral_accel = serialInterface->getRelativeValue(ACCEL_X) - - ROLL_ACCEL_COUPLING*serialInterface->getRelativeValue(ROLL_RATE); + ROLL_ACCEL_COUPLING*serialInterface->getRelativeValue(HEAD_ROLL_RATE); float measured_fwd_accel = serialInterface->getRelativeValue(ACCEL_Z) - - PITCH_ACCEL_COUPLING*serialInterface->getRelativeValue(PITCH_RATE); - float measured_roll_rate = serialInterface->getRelativeValue(ROLL_RATE); + PITCH_ACCEL_COUPLING*serialInterface->getRelativeValue(HEAD_PITCH_RATE); + float measured_roll_rate = serialInterface->getRelativeValue(HEAD_ROLL_RATE); //std::cout << "Pitch Rate: " << serialInterface->getRelativeValue(PITCH_RATE) << // " fwd_accel: " << serialInterface->getRelativeValue(ACCEL_Z) << "\n"; @@ -237,18 +242,18 @@ void Head::UpdateGyros(float frametime, SerialInterface * serialInterface, int h const float MAX_YAW = 85; const float MIN_YAW = -85; - if ((Pitch < MAX_PITCH) && (Pitch > MIN_PITCH)) + if ((_headPitch < MAX_PITCH) && (_headPitch > MIN_PITCH)) addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime); addRoll(-measured_roll_rate * HEAD_ROLL_SCALE * frametime); if (head_mirror) { - if ((Yaw < MAX_YAW) && (Yaw > MIN_YAW)) - addYaw(-YawRate * HEAD_ROTATION_SCALE * frametime); + if ((_headYaw < MAX_YAW) && (_headYaw > MIN_YAW)) + addYaw(-_headYawRate * HEAD_ROTATION_SCALE * frametime); addLean(-measured_lateral_accel * frametime * HEAD_LEAN_SCALE, -measured_fwd_accel*frametime * HEAD_LEAN_SCALE); } else { - if ((Yaw < MAX_YAW) && (Yaw > MIN_YAW)) - addYaw(YawRate * -HEAD_ROTATION_SCALE * frametime); + if ((_headYaw < MAX_YAW) && (_headYaw > MIN_YAW)) + addYaw(_headYawRate * -HEAD_ROTATION_SCALE * frametime); addLean(measured_lateral_accel * frametime * -HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE); } } @@ -256,7 +261,7 @@ void Head::UpdateGyros(float frametime, SerialInterface * serialInterface, int h void Head::addLean(float x, float z) { // Add Body lean as impulse leanSideways += x; - leanForward += z; + leanForward += z; } @@ -277,7 +282,7 @@ void Head::setTriggeringAction( bool d ) { void Head::simulate(float deltaTime) { //------------------------------------------------------------- - // if the avatar being simulated is mone, then loop through + // if the avatar being simulated is mine, then loop through // all the other avatars to get information about them... //------------------------------------------------------------- if ( _isMine ) @@ -288,6 +293,7 @@ void Head::simulate(float deltaTime) { _closestOtherAvatar = -1; float closestDistance = 10000.0f; + /* AgentList * agentList = AgentList::getInstance(); for(std::vector::iterator agent = agentList->getAgents().begin(); @@ -297,10 +303,12 @@ void Head::simulate(float deltaTime) { Head *otherAvatar = (Head *)agent->getLinkedData(); // when this is working, I will grab the position here... - glm::vec3 otherAvatarPosition = otherAvatar->getBodyPosition(); + //glm::vec3 otherAvatarPosition = otherAvatar->getBodyPosition(); } } + */ + ///for testing only (prior to having real avs working) for (int o=0; o 0.0) + { + float amp = 1.0 - (distanceToBigSphereCenter / combinedRadius); + glm::vec3 collisionForce = vectorFromJointToBigSphere * amp; + _bone[b].springyVelocity += collisionForce * 8.0f * deltaTime; + _avatar.velocity += collisionForce * 18.0f * deltaTime; + } + } + } + + if ( jointCollision ) { + //---------------------------------------------------------- + // add gravity to velocity + //---------------------------------------------------------- + _avatar.velocity += glm::dvec3( 0.0, -1.0, 0.0 ) * 0.05; + + //---------------------------------------------------------- + // ground collisions + //---------------------------------------------------------- + if ( _bodyPosition.y < 0.0 ) { + _bodyPosition.y = 0.0; + if ( _avatar.velocity.y < 0.0 ) { + _avatar.velocity.y *= -0.7; + } + } + } + } +} + + + void Head::render(int faceToFace) { //--------------------------------------------------- // show avatar position //--------------------------------------------------- + glColor4f( 0.5f, 0.5f, 0.5f, 0.6 ); glPushMatrix(); glTranslatef(_bodyPosition.x, _bodyPosition.y, _bodyPosition.z); glScalef( 0.03, 0.03, 0.03 ); glutSolidSphere( 1, 10, 10 ); glPopMatrix(); + + if ( usingBigSphereCollisionTest ) { + //--------------------------------------------------- + // show TEST big sphere + //--------------------------------------------------- + glColor4f( 0.5f, 0.6f, 0.8f, 0.7 ); + glPushMatrix(); + glTranslatef(_TEST_bigSpherePosition.x, _TEST_bigSpherePosition.y, _TEST_bigSpherePosition.z); + glScalef( _TEST_bigSphereRadius, _TEST_bigSphereRadius, _TEST_bigSphereRadius ); + glutSolidSphere( 1, 20, 20 ); + glPopMatrix(); + } + //--------------------------------------------------- // show avatar orientation //--------------------------------------------------- @@ -645,19 +726,22 @@ void Head::renderHead(int faceToFace) { glScalef( 0.03, 0.03, 0.03 ); - glRotatef(_bodyYaw, 0, 1, 0);// should this use Yaw? - - glRotatef(Pitch, 1, 0, 0); - glRotatef(Roll, 0, 0, 1); + glRotatef(_headYaw, 0, 1, 0); + glRotatef(_headPitch, 1, 0, 0); + glRotatef(_headRoll, 0, 0, 1); // Overall scale of head if (faceToFace) glScalef(2.0, 2.0, 2.0); else glScalef(0.75, 1.0, 1.0); - glColor3fv(skinColor); // Head - if (!_isMine) glColor3f(0,0,1); // Temp: Other people are BLUE + if (_isMine) { + glColor3fv(skinColor); + } + else { + glColor3f(0,0,1); // Temp: Other people are BLUE + } glutSolidSphere(1, 30, 30); // Ears @@ -805,6 +889,7 @@ void Head::initializeSkeleton() { _bone[b].pitch = 0.0; _bone[b].roll = 0.0; _bone[b].length = 0.0; + _bone[b].radius = 0.02; //default _bone[b].springBodyTightness = 4.0; _bone[b].orientation.setToIdentity(); } @@ -1144,14 +1229,14 @@ void Head::renderBody() { glColor3fv( lightBlue ); glPushMatrix(); glTranslatef( _bone[b].springyPosition.x, _bone[b].springyPosition.y, _bone[b].springyPosition.z ); - glutSolidSphere( 0.02f, 10.0f, 5.0f ); + glutSolidSphere( _bone[b].radius, 10.0f, 5.0f ); glPopMatrix(); } else { glColor3fv( skinColor ); glPushMatrix(); glTranslatef( _bone[b].position.x, _bone[b].position.y, _bone[b].position.z ); - glutSolidSphere( 0.02f, 10.0f, 5.0f ); + glutSolidSphere( _bone[b].radius, 10.0f, 5.0f ); glPopMatrix(); } } diff --git a/interface/src/Head.h b/interface/src/Head.h index 55bb370524..a5c34ab272 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -90,6 +90,7 @@ struct AvatarBone float roll; // the roll Euler angle of the bone rotation off the parent Orientation orientation; // three orthogonal normals determined by yaw, pitch, roll float length; // the length of the bone + float radius; // used for detecting collisions for certain physical effects }; struct Avatar @@ -110,9 +111,9 @@ class Head : public AvatarData { void reset(); void UpdateGyros(float frametime, SerialInterface * serialInterface, int head_mirror, glm::vec3 * gravity); void setNoise (float mag) { noise = mag; } - void setPitch(float p) {Pitch = p; } - void setYaw(float y) {Yaw = y; } - void setRoll(float r) {Roll = r; }; + void setPitch(float p) {_headPitch = p; } + void setYaw(float y) {_headYaw = y; } + void setRoll(float r) {_headRoll = r; }; void setScale(float s) {scale = s; }; void setRenderYaw(float y) {renderYaw = y;} void setRenderPitch(float p) {renderPitch = p;} @@ -120,14 +121,14 @@ class Head : public AvatarData { float getRenderPitch() {return renderPitch;} void setLeanForward(float dist); void setLeanSideways(float dist); - void addPitch(float p) {Pitch -= p; } - void addYaw(float y){Yaw -= y; } - void addRoll(float r){Roll += r; } + void addPitch(float p) {_headPitch -= p; } + void addYaw(float y){_headYaw -= y; } + void addRoll(float r){_headRoll += r; } void addLean(float x, float z); - float getPitch() {return Pitch;} - float getRoll() {return Roll;} - float getYaw() {return Yaw;} - float getLastMeasuredYaw() {return YawRate;} + float getPitch() {return _headPitch;} + float getRoll() {return _headRoll;} + float getYaw() {return _headYaw;} + float getLastMeasuredYaw() {return _headYawRate;} float getBodyYaw() {return _bodyYaw;}; void addBodyYaw(float y) {_bodyYaw += y;}; @@ -179,12 +180,12 @@ class Head : public AvatarData { private: bool _isMine; float noise; - float Pitch; - float Yaw; - float Roll; - float PitchRate; - float YawRate; - float RollRate; + float _headPitch; + float _headYaw; + float _headRoll; + float _headPitchRate; + float _headYawRate; + float _headRollRate; float EyeballPitch[2]; float EyeballYaw[2]; float EyebrowPitch[2]; @@ -211,7 +212,9 @@ class Head : public AvatarData { float averageLoudness; float audioAttack; float browAudioLift; - + + glm::vec3 _TEST_bigSpherePosition; + float _TEST_bigSphereRadius; //temporary - placeholder for real other avs glm::vec3 DEBUG_otherAvatarListPosition [ NUM_OTHER_AVATARS ]; @@ -257,6 +260,7 @@ class Head : public AvatarData { void initializeBodySprings(); void updateBodySprings( float deltaTime ); void calculateBoneLengths(); + void updateBigSphereCollisionTest( float deltaTime ); void readSensors(); }; diff --git a/interface/src/SerialInterface.h b/interface/src/SerialInterface.h index 50fde4a13d..457c4b5efa 100644 --- a/interface/src/SerialInterface.h +++ b/interface/src/SerialInterface.h @@ -28,9 +28,9 @@ #define ACCEL_Z 5 // Gyro sensors, in coodinate system of head/airplane -#define PITCH_RATE 1 -#define YAW_RATE 0 -#define ROLL_RATE 2 +#define HEAD_PITCH_RATE 1 +#define HEAD_YAW_RATE 0 +#define HEAD_ROLL_RATE 2 class SerialInterface { public: diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 09bb296b45..2f75f03297 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -170,8 +170,8 @@ int headMouseX, headMouseY; int mouseX, mouseY; // Where is the mouse // Mouse location at start of last down click -int mouseStartX;// = WIDTH / 2; -int mouseStartY;// = HEIGHT / 2; +int mouseStartX = WIDTH / 2; +int mouseStartY = HEIGHT / 2; int mousePressed = 0; // true if mouse has been pressed (clear when finished) Menu menu; // main menu @@ -382,8 +382,8 @@ void updateAvatarHand(float deltaTime) { // void updateAvatar(float frametime) { - float gyroPitchRate = serialPort.getRelativeValue(PITCH_RATE); - float gyroYawRate = serialPort.getRelativeValue(YAW_RATE); + float gyroPitchRate = serialPort.getRelativeValue(HEAD_PITCH_RATE); + float gyroYawRate = serialPort.getRelativeValue(HEAD_YAW_RATE ); myAvatar.UpdateGyros(frametime, &serialPort, headMirror, &gravity); @@ -1334,22 +1334,21 @@ void idle(void) { // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time if (diffclock(&lastTimeIdle, &check) > IDLE_SIMULATE_MSECS) { - // If mouse is being dragged, update hand movement in the avatar - //if ( mousePressed == 1 ) - if ( myAvatar.getMode() == AVATAR_MODE_COMMUNICATING ) { + //if ( myAvatar.getMode() == AVATAR_MODE_COMMUNICATING ) { float leftRight = ( mouseX - mouseStartX ) / (float)WIDTH; float downUp = ( mouseY - mouseStartY ) / (float)HEIGHT; float backFront = 0.0; glm::vec3 handMovement( leftRight, downUp, backFront ); myAvatar.setHandMovement( handMovement ); - } + /*} else { mouseStartX = mouseX; mouseStartY = mouseY; //mouseStartX = (float)WIDTH / 2.0f; //mouseStartY = (float)HEIGHT / 2.0f; } + */ //-------------------------------------------------------- // when the mouse is being pressed, an 'action' is being