Merge pull request #138 from Ventrella/master

major changes to hand holding logic (ordering mostly)
This commit is contained in:
birarda 2013-04-24 16:45:33 -07:00
commit b8054790b0
4 changed files with 187 additions and 183 deletions

View file

@ -27,6 +27,7 @@ const float MAX_ITERATIONS_BETWEEN_AUDIO_SENDS = (MAX_AUDIO_SEND_INTERVAL_SECS *
bool stopReceiveAgentDataThread;
bool injectAudioThreadRunning = false;
int handStateTimer = 0;
int TEMP_AUDIO_LISTEN_PORT = 55439;
// UDPSocket audioSocket(TEMP_AUDIO_LISTEN_PORT);
@ -125,6 +126,18 @@ int main(int argc, const char* argv[]) {
0.25,
eve.getPosition()[2] + 0.1));
// simulate the effect of pressing and un-pressing the mouse button/pad
handStateTimer ++;
if ( handStateTimer == 100 ) {
eve.setHandState(1);
}
if ( handStateTimer == 150 ) {
eve.setHandState(0);
}
if ( handStateTimer >= 200 ) {
handStateTimer = 0;
}
// read eve's audio data
AudioInjector eveAudioInjector("eve.raw");

View file

@ -91,7 +91,7 @@ bool processParameters(int parameterCount, char* parameterData[])
}
}
return true;
};_Position
};
int main(int argc, const char* argv[]) {

View file

@ -48,7 +48,6 @@ Head::Head(bool isMine) {
_velocity = glm::vec3( 0.0, 0.0, 0.0 );
_thrust = glm::vec3( 0.0, 0.0, 0.0 );
_rotation = glm::quat( 0.0f, 0.0f, 0.0f, 0.0f );
_nearOtherAvatar = false;
_bodyYaw = -90.0;
_bodyPitch = 0.0;
_bodyRoll = 0.0;
@ -60,7 +59,6 @@ Head::Head(bool isMine) {
//_transmitterTimer = 0;
_transmitterHz = 0.0;
_transmitterPackets = 0;
//_numOtherAvatars = 0;
initializeSkeleton();
@ -73,9 +71,6 @@ Head::Head(bool isMine) {
_head.interPupilDistance = 0.6;
_head.interBrowDistance = 0.75;
_head.nominalPupilSize = 0.10;
//_head.yaw = 0.0;
//_head.pitch = 0.0;
//_head.roll = 0.0;
_head.pitchRate = 0.0;
_head.yawRate = 0.0;
_head.rollRate = 0.0;
@ -108,15 +103,15 @@ Head::Head(bool isMine) {
_head.lastLoudness = 0.0;
_head.browAudioLift = 0.0;
_head.noise = 0;
_movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 );
_usingBodySprings = true;
_springForce = 6.0f;
_springVelocityDecay = 16.0f;
_renderYaw = 0.0;
_renderPitch = 0.0;
_sphere = NULL;
_interactingOther = NULL;
_interactingOtherIsNearby = false;
_handHolding.position = glm::vec3( 0.0, 0.0, 0.0 );
_handHolding.velocity = glm::vec3( 0.0, 0.0, 0.0 );
@ -129,9 +124,6 @@ Head::Head(bool isMine) {
printLog("error %u: %s\n", error, lodepng_error_text(error));
}
}
_otherAvatar.handPosition = glm::vec3( 0.0f, 0.0f, 0.0f );
_otherAvatar.handState = 0;
}
@ -141,7 +133,7 @@ Head::Head(const Head &otherAvatar) {
_velocity = otherAvatar._velocity;
_thrust = otherAvatar._thrust;
_rotation = otherAvatar._rotation;
_nearOtherAvatar = otherAvatar._nearOtherAvatar;
_interactingOtherIsNearby = otherAvatar._interactingOtherIsNearby;
_bodyYaw = otherAvatar._bodyYaw;
_bodyPitch = otherAvatar._bodyPitch;
_bodyRoll = otherAvatar._bodyRoll;
@ -173,9 +165,6 @@ Head::Head(const Head &otherAvatar) {
_head.interPupilDistance = otherAvatar._head.interPupilDistance;
_head.interBrowDistance = otherAvatar._head.interBrowDistance;
_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.pitchRate = otherAvatar._head.pitchRate;
_head.rollRate = otherAvatar._head.rollRate;
@ -209,7 +198,6 @@ Head::Head(const Head &otherAvatar) {
_head.browAudioLift = otherAvatar._head.browAudioLift;
_head.noise = otherAvatar._head.noise;
if (iris_texture.size() == 0) {
switchToResourcesParentIfRequired();
unsigned error = lodepng::decode(iris_texture, iris_texture_width, iris_texture_height, iris_texture_file);
@ -297,28 +285,40 @@ void Head::setMousePressed( bool d ) {
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
// all the other avatars to get information about them...
// all the other avatars for potential interactions...
//-------------------------------------------------------------
if ( _isMine )
{
_nearOtherAvatar = false;
float closestDistance = 10000.0f;
AgentList * agentList = AgentList::getInstance();
//_numOtherAvatars = 0;
for(std::vector<Agent>::iterator agent = agentList->getAgents().begin();
agent != agentList->getAgents().end();
agent++) {
if (( agent->getLinkedData() != NULL && ( agent->getType() == AGENT_TYPE_AVATAR ) )) {
Head *otherAvatar = (Head *)agent->getLinkedData();
// if ( _numOtherAvatars < MAX_OTHER_AVATARS )
{
//------------------------------------------------------
// check for collisions with other avatars and respond
//------------------------------------------------------
@ -339,19 +339,44 @@ void Head::simulate(float deltaTime) {
float distance = glm::length( v );
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;
_nearOtherAvatar = true;
_otherAvatar.handPosition = otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND );
_otherAvatar.handState = (int)otherAvatar->getHandState();
_interactingOther = otherAvatar;
_interactingOtherIsNearby = true;
//---------------------------------------------------------------------
// if I am holding hands with another avatar, a force is applied
//---------------------------------------------------------------------
if (( _handState == 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;
}
}
}
}
}
// 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 ) {
//--------------------------------------------------------------
// test for avatar collision response (using a big sphere :)
@ -378,18 +403,9 @@ void Head::simulate(float deltaTime) {
}
}
//------------------------
// update avatar skeleton
//------------------------
updateSkeleton();
//------------------------------------------------------------
// reset hand and arm positions according to hand movement
//------------------------------------------------------------
if (_usingBodySprings) {
updateHandMovement( deltaTime );
// update body springs
updateBodySprings( deltaTime );
}
if ( _isMine ) { // driving the avatar around should only apply if this is my avatar (as opposed to an avatar being driven remotely)
//-------------------------------------------------
@ -449,7 +465,6 @@ void Head::simulate(float deltaTime) {
_bodyYaw += _bodyYawDelta * deltaTime;
}
//----------------------------------------------------------
// decay body yaw delta
//----------------------------------------------------------
@ -632,8 +647,6 @@ void Head::updateAvatarCollisionDetectionAndResponse
}
void Head::render(bool lookingInMirror) {
//---------------------------------------------------
@ -658,9 +671,9 @@ void Head::render(bool lookingInMirror) {
glPopMatrix();
}
//---------------------------------------------------
//---------------
// render body
//---------------------------------------------------
//---------------
renderBody();
//---------------------------------------------------
@ -669,15 +682,14 @@ void Head::render(bool 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 (_usingBodySprings) {
if ( _nearOtherAvatar ) {
if ( _interactingOtherIsNearby ) {
glm::vec3 v1( _bone[ AVATAR_BONE_RIGHT_HAND ].position );
glm::vec3 v2( _otherAvatar.handPosition );
glm::vec3 v2( _interactingOther->_handPosition );
glLineWidth( 8.0 );
glColor4f( 0.7f, 0.4f, 0.1f, 0.6 );
@ -688,8 +700,6 @@ void Head::render(bool lookingInMirror) {
}
}
}
}
void Head::renderHead(bool lookingInMirror) {
@ -978,9 +988,9 @@ void Head::initializeSkeleton() {
//----------------------------------------------------------------------------
calculateBoneLengths();
//----------------------------------------------------------------------------
//---------------------------
// generate world positions
//----------------------------------------------------------------------------
//---------------------------
updateSkeleton();
}
@ -1140,29 +1150,11 @@ void Head::updateHandMovement( float deltaTime ) {
if (_isMine) {
_handState = _mousePressed;
}
//---------------------------------------------------------------------
// if holding hands with another avatar, add a force to the hand...
//---------------------------------------------------------------------
if (( getHandState() == 1 )
|| ( _otherAvatar.handState == 1 )) {
if ( _nearOtherAvatar ) {
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 );
}
void Head::updateArmIKAndConstraints( float deltaTime ) {
//-------------------------------------------------------------------------------
// determine the arm vector
//-------------------------------------------------------------------------------
@ -1207,14 +1199,11 @@ void Head::updateHandMovement( float deltaTime ) {
glm::vec3 newWristPosition = _bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position;
newWristPosition += vv * 0.7f;
_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() {
//-----------------------------------------
// Render bone positions as spheres

View file

@ -100,12 +100,14 @@ struct AvatarHandHolding
float force;
};
/*
struct OtherAvatar
{
glm::vec3 handPosition;
int handState;
bool nearby;
//glm::vec3 handPosition;
//int handState;
};
*/
struct AvatarBone
{
@ -191,7 +193,6 @@ class Head : public AvatarData {
glm::vec3 getHeadPosition();
glm::vec3 getBonePosition( AvatarBoneID b );
glm::vec3 getBodyUpDirection();
//int getHandState();
float getGirth();
float getHeight();
@ -206,6 +207,7 @@ class Head : public AvatarData {
void stopHandMovement();
void setHandMovementValues( glm::vec3 movement );
void updateHandMovement( float deltaTime );
void updateArmIKAndConstraints( float deltaTime );
float getAverageLoudness() {return _head.averageLoudness;};
void setAverageLoudness(float al) {_head.averageLoudness = al;};
@ -230,10 +232,8 @@ class Head : public AvatarData {
bool _isMine;
glm::vec3 _TEST_bigSpherePosition;
float _TEST_bigSphereRadius;
OtherAvatar _otherAvatar;
bool _mousePressed;
float _bodyYawDelta;
bool _nearOtherAvatar;
bool _usingBodySprings;
glm::vec3 _movedHandOffset;
float _springVelocityDecay;
@ -253,6 +253,8 @@ class Head : public AvatarData {
timeval _transmitterTimer;
float _transmitterHz;
int _transmitterPackets;
Head* _interactingOther;
bool _interactingOtherIsNearby;
//-----------------------------
// private methods...