added rendering lines between avatar bones

This commit is contained in:
Philip Rosedale 2013-04-08 22:42:45 -07:00
parent 87fd0f7a91
commit 60dc43041f
3 changed files with 53 additions and 15 deletions

View file

@ -961,13 +961,13 @@ void Head::updateHandMovement()
// adjust right hand and elbow according to hand offset // adjust right hand and elbow according to hand offset
//---------------------------------------------------------------- //----------------------------------------------------------------
avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition += handOffset; avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition += handOffset;
glm::dvec3 armVector = avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition; glm::vec3 armVector = avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition;
armVector -= avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; armVector -= avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// test to see if right hand is being dragged beyond maximum arm length // test to see if right hand is being dragged beyond maximum arm length
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
double distance = glm::length( armVector ); float distance = glm::length( armVector );
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
@ -979,10 +979,10 @@ void Head::updateHandMovement()
// reset right hand to be constrained to maximum arm length // reset right hand to be constrained to maximum arm length
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
glm::dvec3 armNormal = armVector / distance; glm::vec3 armNormal = armVector / distance;
armVector = armNormal * avatar.maxArmLength; armVector = armNormal * (float)avatar.maxArmLength;
distance = avatar.maxArmLength; distance = avatar.maxArmLength;
glm::dvec3 constrainedPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; glm::vec3 constrainedPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
constrainedPosition += armVector; constrainedPosition += armVector;
avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = constrainedPosition; avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = constrainedPosition;
} }
@ -990,8 +990,8 @@ void Head::updateHandMovement()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// set elbow position // set elbow position
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
glm::dvec3 newElbowPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; glm::vec3 newElbowPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
newElbowPosition += armVector * ONE_HALF; newElbowPosition += armVector * (float)ONE_HALF;
glm::dvec3 perpendicular = glm::dvec3( -armVector.y, armVector.x, armVector.z ); glm::dvec3 perpendicular = glm::dvec3( -armVector.y, armVector.x, armVector.z );
newElbowPosition += perpendicular * ( 1.0 - ( avatar.maxArmLength / distance ) ) * ONE_HALF; newElbowPosition += perpendicular * ( 1.0 - ( avatar.maxArmLength / distance ) ) * ONE_HALF;
avatar.bone[ AVATAR_BONE_RIGHT_FOREARM ].worldPosition = newElbowPosition; avatar.bone[ AVATAR_BONE_RIGHT_FOREARM ].worldPosition = newElbowPosition;
@ -1005,21 +1005,57 @@ void Head::renderBody()
{ {
glColor3fv(skinColor); glColor3fv(skinColor);
// Render bones as spheres
for (int b=0; b<NUM_AVATAR_BONES; b++) for (int b=0; b<NUM_AVATAR_BONES; b++)
{ {
glPushMatrix(); glPushMatrix();
glTranslatef( avatar.bone[b].worldPosition.x, avatar.bone[b].worldPosition.y, avatar.bone[b].worldPosition.z ); glTranslatef( avatar.bone[b].worldPosition.x, avatar.bone[b].worldPosition.y, avatar.bone[b].worldPosition.z );
glScalef( 0.02, 0.02, 0.02 ); glutSolidSphere( .02, 10, 5 );
glutSolidSphere( 1, 10, 5 );
glPopMatrix(); glPopMatrix();
} }
// Render lines connecting the bones
glColor3f(1,1,1);
glLineWidth(3.0);
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_NECK].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_SHOULDER].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_UPPER_ARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_FOREARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_HAND].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_SHOULDER].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_UPPER_ARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_FOREARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_HAND].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_MID_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_PELVIS_SPINE].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_PELVIS_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_PELVIS].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_THIGH].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_SHIN].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_FOOT].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_PELVIS_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_PELVIS].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_THIGH].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_SHIN].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_FOOT].worldPosition.x);
glEnd();
} }
// Transmit data to agents requesting it
// Transmit data to agents requesting it
//called on me just prior to sending data to others (continuasly called) //called on me just prior to sending data to others (continuasly called)

View file

@ -104,7 +104,7 @@ enum AvatarBones
struct AvatarBone struct AvatarBone
{ {
AvatarBones parent; AvatarBones parent;
glm::dvec3 worldPosition; glm::vec3 worldPosition;
glm::dvec3 defaultPosePosition; glm::dvec3 defaultPosePosition;
glm::dvec3 velocity; glm::dvec3 velocity;
double yaw; double yaw;

View file

@ -1078,10 +1078,12 @@ void reshape(int width, int height)
WIDTH = width; WIDTH = width;
HEIGHT = height; HEIGHT = height;
glMatrixMode(GL_PROJECTION); //hello glMatrixMode(GL_PROJECTION); //hello
fov.setResolution(width, height) fov.setResolution(width, height)
.setBounds(glm::vec3(-0.5f,-0.5f,-500.0f), glm::vec3(0.5f, 0.5f, 0.1f) ) .setBounds(glm::vec3(-0.5f,-0.5f,-500.0f), glm::vec3(0.5f, 0.5f, 0.1f) )
.setPerspective(0.7854f); .setPerspective(0.7854f);
glLoadMatrixf(glm::value_ptr(fov.getViewerScreenXform())); glLoadMatrixf(glm::value_ptr(fov.getViewerScreenXform()));
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);