just did a fairly major re-ordering of avatar interaction logic in Head.cpp

This commit is contained in:
Jeffrey Ventrella 2013-04-24 14:52:04 -07:00
parent 7ae91c4b7b
commit 86086ef20c
2 changed files with 153 additions and 172 deletions

View file

@ -67,54 +67,51 @@ Head::Head(bool isMine) {
for (int i = 0; i < MAX_DRIVE_KEYS; i++) _driveKeys[i] = false; for (int i = 0; i < MAX_DRIVE_KEYS; i++) _driveKeys[i] = false;
_head.pupilSize = 0.10; _head.pupilSize = 0.10;
_head.interPupilDistance = 0.6; _head.interPupilDistance = 0.6;
_head.interBrowDistance = 0.75; _head.interBrowDistance = 0.75;
_head.nominalPupilSize = 0.10; _head.nominalPupilSize = 0.10;
//_head.yaw = 0.0; _head.pitchRate = 0.0;
//_head.pitch = 0.0; _head.yawRate = 0.0;
//_head.roll = 0.0; _head.rollRate = 0.0;
_head.pitchRate = 0.0; _head.eyebrowPitch[0] = -30;
_head.yawRate = 0.0; _head.eyebrowPitch[1] = -30;
_head.rollRate = 0.0; _head.eyebrowRoll [0] = 20;
_head.eyebrowPitch[0] = -30; _head.eyebrowRoll [1] = -20;
_head.eyebrowPitch[1] = -30; _head.mouthPitch = 0;
_head.eyebrowRoll [0] = 20; _head.mouthYaw = 0;
_head.eyebrowRoll [1] = -20; _head.mouthWidth = 1.0;
_head.mouthPitch = 0; _head.mouthHeight = 0.2;
_head.mouthYaw = 0; _head.eyeballPitch[0] = 0;
_head.mouthWidth = 1.0; _head.eyeballPitch[1] = 0;
_head.mouthHeight = 0.2; _head.eyeballScaleX = 1.2;
_head.eyeballPitch[0] = 0; _head.eyeballScaleY = 1.5;
_head.eyeballPitch[1] = 0; _head.eyeballScaleZ = 1.0;
_head.eyeballScaleX = 1.2; _head.eyeballYaw[0] = 0;
_head.eyeballScaleY = 1.5; _head.eyeballYaw[1] = 0;
_head.eyeballScaleZ = 1.0; _head.pitchTarget = 0;
_head.eyeballYaw[0] = 0; _head.yawTarget = 0;
_head.eyeballYaw[1] = 0; _head.noiseEnvelope = 1.0;
_head.pitchTarget = 0; _head.pupilConverge = 10.0;
_head.yawTarget = 0; _head.leanForward = 0.0;
_head.noiseEnvelope = 1.0; _head.leanSideways = 0.0;
_head.pupilConverge = 10.0; _head.eyeContact = 1;
_head.leanForward = 0.0; _head.eyeContactTarget = LEFT_EYE;
_head.leanSideways = 0.0; _head.scale = 1.0;
_head.eyeContact = 1; _head.audioAttack = 0.0;
_head.eyeContactTarget = LEFT_EYE; _head.averageLoudness = 0.0;
_head.scale = 1.0; _head.lastLoudness = 0.0;
_head.audioAttack = 0.0; _head.browAudioLift = 0.0;
_head.averageLoudness = 0.0; _head.noise = 0;
_head.lastLoudness = 0.0; _movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 );
_head.browAudioLift = 0.0; _usingBodySprings = true;
_head.noise = 0; _springForce = 6.0f;
_springVelocityDecay = 16.0f;
_movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 ); _renderYaw = 0.0;
_usingBodySprings = true; _renderPitch = 0.0;
_springForce = 6.0f; _sphere = NULL;
_springVelocityDecay = 16.0f; _interactingOther = NULL;
_renderYaw = 0.0; _interactingOtherIsNearby = false;
_renderPitch = 0.0;
_sphere = NULL;
_handHolding.position = glm::vec3( 0.0, 0.0, 0.0 ); _handHolding.position = glm::vec3( 0.0, 0.0, 0.0 );
_handHolding.velocity = glm::vec3( 0.0, 0.0, 0.0 ); _handHolding.velocity = glm::vec3( 0.0, 0.0, 0.0 );
@ -127,39 +124,35 @@ Head::Head(bool isMine) {
printLog("error %u: %s\n", error, lodepng_error_text(error)); printLog("error %u: %s\n", error, lodepng_error_text(error));
} }
} }
_otherAvatar.nearby = false;
_otherAvatar.handPosition = glm::vec3( 0.0f, 0.0f, 0.0f );
_otherAvatar.handState = 0;
} }
Head::Head(const Head &otherAvatar) { Head::Head(const Head &otherAvatar) {
_velocity = otherAvatar._velocity; _velocity = otherAvatar._velocity;
_thrust = otherAvatar._thrust; _thrust = otherAvatar._thrust;
_rotation = otherAvatar._rotation; _rotation = otherAvatar._rotation;
_otherAvatar.nearby = otherAvatar._otherAvatar.nearby; _interactingOtherIsNearby = otherAvatar._interactingOtherIsNearby;
_bodyYaw = otherAvatar._bodyYaw; _bodyYaw = otherAvatar._bodyYaw;
_bodyPitch = otherAvatar._bodyPitch; _bodyPitch = otherAvatar._bodyPitch;
_bodyRoll = otherAvatar._bodyRoll; _bodyRoll = otherAvatar._bodyRoll;
_bodyYawDelta = otherAvatar._bodyYawDelta; _bodyYawDelta = otherAvatar._bodyYawDelta;
_mousePressed = otherAvatar._mousePressed; _mousePressed = otherAvatar._mousePressed;
_mode = otherAvatar._mode; _mode = otherAvatar._mode;
_isMine = otherAvatar._isMine; _isMine = otherAvatar._isMine;
_renderYaw = otherAvatar._renderYaw; _renderYaw = otherAvatar._renderYaw;
_renderPitch = otherAvatar._renderPitch; _renderPitch = otherAvatar._renderPitch;
_maxArmLength = otherAvatar._maxArmLength; _maxArmLength = otherAvatar._maxArmLength;
_transmitterTimer = otherAvatar._transmitterTimer; _transmitterTimer = otherAvatar._transmitterTimer;
_transmitterHz = otherAvatar._transmitterHz; _transmitterHz = otherAvatar._transmitterHz;
_transmitterPackets = otherAvatar._transmitterPackets; _transmitterPackets = otherAvatar._transmitterPackets;
_TEST_bigSphereRadius = otherAvatar._TEST_bigSphereRadius; _TEST_bigSphereRadius = otherAvatar._TEST_bigSphereRadius;
_TEST_bigSpherePosition = otherAvatar._TEST_bigSpherePosition; _TEST_bigSpherePosition = otherAvatar._TEST_bigSpherePosition;
_movedHandOffset = otherAvatar._movedHandOffset; _movedHandOffset = otherAvatar._movedHandOffset;
_usingBodySprings = otherAvatar._usingBodySprings; _usingBodySprings = otherAvatar._usingBodySprings;
_springForce = otherAvatar._springForce; _springForce = otherAvatar._springForce;
_springVelocityDecay = otherAvatar._springVelocityDecay; _springVelocityDecay = otherAvatar._springVelocityDecay;
_orientation.set( otherAvatar._orientation ); _orientation.set( otherAvatar._orientation );
_sphere = NULL; _sphere = NULL;
@ -172,9 +165,6 @@ Head::Head(const Head &otherAvatar) {
_head.interPupilDistance = otherAvatar._head.interPupilDistance; _head.interPupilDistance = otherAvatar._head.interPupilDistance;
_head.interBrowDistance = otherAvatar._head.interBrowDistance; _head.interBrowDistance = otherAvatar._head.interBrowDistance;
_head.nominalPupilSize = otherAvatar._head.nominalPupilSize; _head.nominalPupilSize = otherAvatar._head.nominalPupilSize;
//_head.yaw = otherAvatar._head.yaw;
//_head.pitch = otherAvatar._head.pitch;
//_head.roll = otherAvatar._head.roll;
_head.yawRate = otherAvatar._head.yawRate; _head.yawRate = otherAvatar._head.yawRate;
_head.pitchRate = otherAvatar._head.pitchRate; _head.pitchRate = otherAvatar._head.pitchRate;
_head.rollRate = otherAvatar._head.rollRate; _head.rollRate = otherAvatar._head.rollRate;
@ -208,7 +198,6 @@ Head::Head(const Head &otherAvatar) {
_head.browAudioLift = otherAvatar._head.browAudioLift; _head.browAudioLift = otherAvatar._head.browAudioLift;
_head.noise = otherAvatar._head.noise; _head.noise = otherAvatar._head.noise;
if (iris_texture.size() == 0) { if (iris_texture.size() == 0) {
switchToResourcesParentIfRequired(); switchToResourcesParentIfRequired();
unsigned error = lodepng::decode(iris_texture, iris_texture_width, iris_texture_height, iris_texture_file); unsigned error = lodepng::decode(iris_texture, iris_texture_width, iris_texture_height, iris_texture_file);
@ -295,16 +284,33 @@ void Head::setMousePressed( bool d ) {
} }
void Head::simulate(float deltaTime) { void Head::simulate(float deltaTime) {
//------------------------
// update avatar skeleton
//------------------------
updateSkeleton();
//------------------------------------------------------------
// reset hand and arm positions according to hand movement
//------------------------------------------------------------
updateHandMovement( deltaTime );
if ( !_interactingOtherIsNearby ) {
//initialize _handHolding
_handHolding.position = _bone[ AVATAR_BONE_RIGHT_HAND ].position;
_handHolding.velocity = glm::vec3( 0.0, 0.0, 0.0 );
}
_interactingOtherIsNearby = false;
//------------------------------------------------------------- //-------------------------------------------------------------
// if the avatar being simulated is mine, then loop through // if the avatar being simulated is mine, then loop through
// all the other avatars to get information about them... // all the other avatars for potential interactions...
//------------------------------------------------------------- //-------------------------------------------------------------
if ( _isMine ) if ( _isMine )
{ {
_otherAvatar.nearby = false;
float closestDistance = 10000.0f; float closestDistance = 10000.0f;
AgentList * agentList = AgentList::getInstance(); AgentList * agentList = AgentList::getInstance();
for(std::vector<Agent>::iterator agent = agentList->getAgents().begin(); for(std::vector<Agent>::iterator agent = agentList->getAgents().begin();
@ -333,18 +339,44 @@ void Head::simulate(float deltaTime) {
float distance = glm::length( v ); float distance = glm::length( v );
if ( distance < _maxArmLength ) { if ( distance < _maxArmLength ) {
if ( distance < closestDistance ) {
//if ( distance < closestDistance ) { // perhaps I don't need this if we want to allow multi-avatar interactions
{
closestDistance = distance; closestDistance = distance;
_otherAvatar.nearby = true; _interactingOther = otherAvatar;
_otherAvatar.handPosition = otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND ); _interactingOtherIsNearby = true;
_otherAvatar.handState = (int)otherAvatar->getHandState();
//---------------------------------------------------------------------
// if I am holding hands with another avatar, a force is applied
//---------------------------------------------------------------------
if (( getHandState() == 1 )
|| ( _interactingOther->_handState == 1 )) {
glm::vec3 vectorToOtherHand = _interactingOther->_handPosition - _handHolding.position;
glm::vec3 vectorToMyHand = _bone[ AVATAR_BONE_RIGHT_HAND ].position - _handHolding.position;
_handHolding.velocity *= 0.7;
_handHolding.velocity += ( vectorToOtherHand + vectorToMyHand ) * _handHolding.force * deltaTime;
_handHolding.position += _handHolding.velocity;
_bone[ AVATAR_BONE_RIGHT_HAND ].position = _handHolding.position;
}
} }
} }
} }
} }
}//if ( _isMine ) // Set the vector we send for hand position to other people to be our right hand
setHandPosition(_bone[ AVATAR_BONE_RIGHT_HAND ].position);
}//if ( _isMine )
updateArmIKAndConstraints( deltaTime );
if ( ! _interactingOtherIsNearby ) {
_interactingOther = NULL;
}
if ( usingBigSphereCollisionTest ) { if ( usingBigSphereCollisionTest ) {
//-------------------------------------------------------------- //--------------------------------------------------------------
// test for avatar collision response (using a big sphere :) // test for avatar collision response (using a big sphere :)
@ -371,19 +403,10 @@ void Head::simulate(float deltaTime) {
} }
} }
//------------------------ // update body springs
// update avatar skeleton updateBodySprings( deltaTime );
//------------------------
updateSkeleton();
//------------------------------------------------------------
// reset hand and arm positions according to hand movement
//------------------------------------------------------------
if (_usingBodySprings) {
updateHandMovement( deltaTime );
updateBodySprings( deltaTime );
}
if ( _isMine ) { // driving the avatar around should only apply if this is my avatar (as opposed to an avatar being driven remotely) if ( _isMine ) { // driving the avatar around should only apply if this is my avatar (as opposed to an avatar being driven remotely)
//------------------------------------------------- //-------------------------------------------------
// this handles the avatar being driven around... // this handles the avatar being driven around...
@ -442,7 +465,6 @@ void Head::simulate(float deltaTime) {
_bodyYaw += _bodyYawDelta * deltaTime; _bodyYaw += _bodyYawDelta * deltaTime;
} }
//---------------------------------------------------------- //----------------------------------------------------------
// decay body yaw delta // decay body yaw delta
//---------------------------------------------------------- //----------------------------------------------------------
@ -620,8 +642,6 @@ void Head::updateAvatarCollisionDetectionAndResponse
} }
void Head::render(bool lookingInMirror) { void Head::render(bool lookingInMirror) {
//--------------------------------------------------- //---------------------------------------------------
@ -646,9 +666,9 @@ void Head::render(bool lookingInMirror) {
glPopMatrix(); glPopMatrix();
} }
//--------------------------------------------------- //---------------
// render body // render body
//--------------------------------------------------- //---------------
renderBody(); renderBody();
//--------------------------------------------------- //---------------------------------------------------
@ -657,28 +677,25 @@ void Head::render(bool lookingInMirror) {
renderHead(lookingInMirror); renderHead(lookingInMirror);
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// if this is my avatar, then render my interactions with the other avatars // if this is my avatar, then render my interactions with the other avatar
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
if ( _isMine ) if ( _isMine )
{ {
if (_usingBodySprings) { if ( _interactingOtherIsNearby ) {
if ( _otherAvatar.nearby ) {
glm::vec3 v1( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); glm::vec3 v1( _bone[ AVATAR_BONE_RIGHT_HAND ].position );
glm::vec3 v2( _otherAvatar.handPosition ); glm::vec3 v2( _interactingOther->_handPosition );
glLineWidth( 8.0 ); glLineWidth( 8.0 );
glColor4f( 0.7f, 0.4f, 0.1f, 0.6 ); glColor4f( 0.7f, 0.4f, 0.1f, 0.6 );
glBegin( GL_LINE_STRIP ); glBegin( GL_LINE_STRIP );
glVertex3f( v1.x, v1.y, v1.z ); glVertex3f( v1.x, v1.y, v1.z );
glVertex3f( v2.x, v2.y, v2.z ); glVertex3f( v2.x, v2.y, v2.z );
glEnd(); glEnd();
}
} }
} }
} }
void Head::renderHead(bool lookingInMirror) { void Head::renderHead(bool lookingInMirror) {
int side = 0; int side = 0;
@ -962,9 +979,9 @@ void Head::initializeSkeleton() {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
calculateBoneLengths(); calculateBoneLengths();
//---------------------------------------------------------------------------- //---------------------------
// generate world positions // generate world positions
//---------------------------------------------------------------------------- //---------------------------
updateSkeleton(); updateSkeleton();
} }
@ -1121,51 +1138,14 @@ void Head::updateHandMovement( float deltaTime ) {
_bone[ AVATAR_BONE_RIGHT_HAND ].position += transformedHandMovement; _bone[ AVATAR_BONE_RIGHT_HAND ].position += transformedHandMovement;
setHandState(_mousePressed); if (_isMine) {
setHandState(_mousePressed);
/* }
if ( _otherAvatar.nearby ) { }
if ( _otherAvatar.handState == 1 ) {
printf( "(1)" );
} void Head::updateArmIKAndConstraints( float deltaTime ) {
else {
printf( "(0)" );
}
if ( _handState == 1 ) {
printf( "1" );
}
else {
printf( "0" );
}
}
*/
//---------------------------------------------------------------------
// if I am holding hands with another avatar, a force is added
// to my hand, causing it to move closer to the other avatar's hand...
//---------------------------------------------------------------------
if ( _isMine )
{
if ( _otherAvatar.nearby ) {
if (( getHandState() == 1 )
|| ( _otherAvatar.handState == 1 )) {
glm::vec3 vectorToOtherHand = _otherAvatar.handPosition - _handHolding.position;
glm::vec3 vectorToMyHand = _bone[ AVATAR_BONE_RIGHT_HAND ].position - _handHolding.position;
_handHolding.velocity *= 0.7;
_handHolding.velocity += ( vectorToOtherHand + vectorToMyHand ) * _handHolding.force * deltaTime;
_handHolding.position += _handHolding.velocity;
_bone[ AVATAR_BONE_RIGHT_HAND ].position = _handHolding.position;
}
}
else {
_handHolding.position = _bone[ AVATAR_BONE_RIGHT_HAND ].position;
_handHolding.velocity = glm::vec3( 0.0, 0.0, 0.0 );
}
}
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// determine the arm vector // determine the arm vector
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
@ -1210,14 +1190,11 @@ void Head::updateHandMovement( float deltaTime ) {
glm::vec3 newWristPosition = _bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; glm::vec3 newWristPosition = _bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position;
newWristPosition += vv * 0.7f; newWristPosition += vv * 0.7f;
_bone[ AVATAR_BONE_RIGHT_FOREARM ].position = newWristPosition; _bone[ AVATAR_BONE_RIGHT_FOREARM ].position = newWristPosition;
// Set the vector we send for hand position to other people to be our right hand
setHandPosition(_bone[ AVATAR_BONE_RIGHT_HAND ].position);
} }
void Head::renderBody() { void Head::renderBody() {
//----------------------------------------- //-----------------------------------------
// Render bone positions as spheres // Render bone positions as spheres

View file

@ -100,12 +100,14 @@ struct AvatarHandHolding
float force; float force;
}; };
/*
struct OtherAvatar struct OtherAvatar
{ {
bool nearby; bool nearby;
glm::vec3 handPosition; //glm::vec3 handPosition;
int handState; //int handState;
}; };
*/
struct AvatarBone struct AvatarBone
{ {
@ -205,6 +207,7 @@ class Head : public AvatarData {
void stopHandMovement(); void stopHandMovement();
void setHandMovementValues( glm::vec3 movement ); void setHandMovementValues( glm::vec3 movement );
void updateHandMovement( float deltaTime ); void updateHandMovement( float deltaTime );
void updateArmIKAndConstraints( float deltaTime );
float getAverageLoudness() {return _head.averageLoudness;}; float getAverageLoudness() {return _head.averageLoudness;};
void setAverageLoudness(float al) {_head.averageLoudness = al;}; void setAverageLoudness(float al) {_head.averageLoudness = al;};
@ -229,7 +232,6 @@ class Head : public AvatarData {
bool _isMine; bool _isMine;
glm::vec3 _TEST_bigSpherePosition; glm::vec3 _TEST_bigSpherePosition;
float _TEST_bigSphereRadius; float _TEST_bigSphereRadius;
OtherAvatar _otherAvatar;
bool _mousePressed; bool _mousePressed;
float _bodyYawDelta; float _bodyYawDelta;
bool _usingBodySprings; bool _usingBodySprings;
@ -251,6 +253,8 @@ class Head : public AvatarData {
timeval _transmitterTimer; timeval _transmitterTimer;
float _transmitterHz; float _transmitterHz;
int _transmitterPackets; int _transmitterPackets;
Head* _interactingOther;
bool _interactingOtherIsNearby;
//----------------------------- //-----------------------------
// private methods... // private methods...