From f7b20a7c9c03b42147e16e50ebecc62316dc14b4 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 25 Feb 2013 15:06:28 -0800 Subject: [PATCH] Added ability to drag hand by clicking and dragging on the screen. --- interface/src/Hand.cpp | 12 +++++++++--- interface/src/Head.h | 4 +++- interface/src/main.cpp | 13 +++++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/interface/src/Hand.cpp b/interface/src/Hand.cpp index 16698a74d1..dc6f73e456 100644 --- a/interface/src/Hand.cpp +++ b/interface/src/Hand.cpp @@ -57,9 +57,11 @@ void Hand::reset() void Hand::simulate(float deltaTime) { - const float VNOISE = 0.1; + const float VNOISE = 0.01; const float RSPRING = 0.01; + const float PSPRING = 0.4; const float RNOISE = 0.1; + const float VDECAY = 5.0; // If noise, add a bit of random velocity if (noise) { @@ -77,11 +79,15 @@ void Hand::simulate(float deltaTime) yaw += yawRate; roll += rollRate; + // Spring effect to return hand to target; + glm::vec3 sVel = target - position; + sVel *= PSPRING; + addVelocity(sVel); // Decay position of hand toward target - position -= deltaTime*(position - target); + //position -= deltaTime*(position - target); // Decay velocity - velocity *= 1.0 - deltaTime; + velocity *= 1.0 - deltaTime*VDECAY; // Decay Angular Velocity pitchRate *= 1.0 - deltaTime; diff --git a/interface/src/Head.h b/interface/src/Head.h index 038f37bfc5..8fc73c7e8c 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -60,6 +60,9 @@ class Head : public AgentData { void SetNewHeadTarget(float, float); glm::vec3 getPos() { return position; }; void setPos(glm::vec3 newpos) { position = newpos; }; + + Hand * hand; + private: float noise; float Pitch; @@ -99,7 +102,6 @@ class Head : public AgentData { void readSensors(); float renderYaw, renderPitch; // Pitch from view frustum when this is own head. - Hand * hand; }; #endif \ No newline at end of file diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 6d19004bfe..3ae6e4e411 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -144,14 +144,15 @@ int display_head_mouse = 1; // Display sample mouse pointer controlled int head_mouse_x, head_mouse_y; int head_lean_x, head_lean_y; -int mouse_x, mouse_y; // Where is the mouse +int mouse_x, mouse_y; // Where is the mouse +int mouse_start_x, mouse_start_y; // Mouse location at start of last down click int mouse_pressed = 0; // true if mouse has been pressed (clear when finished) int nearbyAgents = 0; // How many other people near you is the domain server reporting? int speed; -// +// // Serial USB Variables // @@ -813,6 +814,8 @@ void mouseFunc( int button, int state, int x, int y ) mouse_y = y; mouse_pressed = 1; lattice.mouseClick((float)x/(float)WIDTH,(float)y/(float)HEIGHT); + mouse_start_x = x; + mouse_start_y = y; } if( button == GLUT_LEFT_BUTTON && state == GLUT_UP ) { @@ -833,6 +836,12 @@ void motionFunc( int x, int y) char mouse_string[20]; sprintf(mouse_string, "M %d %d\n", mouse_x, mouse_y); //network_send(UDP_socket, mouse_string, strlen(mouse_string)); + + // Send dragged mouse vector to the hand; + float dx = mouse_x - mouse_start_x; + float dy = mouse_y - mouse_start_y; + glm::vec3 vel(dx*0.003, -dy*0.003, 0); + myHead.hand->addVelocity(vel); } lattice.mouseClick((float)x/(float)WIDTH,(float)y/(float)HEIGHT);