From 044b813dd355b659e1a1b8da06f3c006d9ed36e4 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 29 Nov 2012 23:28:14 -0800 Subject: [PATCH] More stuff for head roll, improved head, stable dt in all field calcs --- SerialInterface.cpp | 11 ++-- SerialInterface.h | 11 ++-- cloud.cpp | 16 ++--- field.cpp | 11 ++-- field.h | 2 +- head.cpp | 57 ++++++++++++------ head.h | 1 + .../UserInterfaceState.xcuserstate | Bin 104737 -> 104561 bytes main.cpp | 51 +++++++++------- 9 files changed, 99 insertions(+), 61 deletions(-) diff --git a/SerialInterface.cpp b/SerialInterface.cpp index 1ac8225951..a7be21761a 100644 --- a/SerialInterface.cpp +++ b/SerialInterface.cpp @@ -56,14 +56,14 @@ int init_port(int baud) return 0; // Success! } -int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_channels) +int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_channels, int * samples_averaged, int * LED_state) { // Channels: // 0, 1 = Head Pitch and Yaw // 2,3,4 = Head X,Y,Z Acceleration // int samples_read = 0; - const float AVG_RATE[] = {0.001, 0.001, 0.001, 0.001, 0.001}; + const float AVG_RATE[] = {0.001, 0.001, 0.001, 0.001, 0.001, 0.001}; char bufchar[1]; while (read(serial_fd, bufchar, 1) > 0) { @@ -76,12 +76,15 @@ int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_chan // At end - Extract value from string to variables if (serial_buffer[0] != 'p') { - sscanf(serial_buffer, "%d %d %d %d %d", /* Needs to match Num Channels */ + sscanf(serial_buffer, "%d %d %d %d %d %d %d %d", /* Needs to match Num Channels */ &adc_channels[0], &adc_channels[1], &adc_channels[2], &adc_channels[3], - &adc_channels[4] + &adc_channels[4], + &adc_channels[5], + samples_averaged, + LED_state ); for (int i = 0; i < NUM_CHANNELS; i++) { diff --git a/SerialInterface.h b/SerialInterface.h index cc2d76600e..fc1abf180d 100644 --- a/SerialInterface.h +++ b/SerialInterface.h @@ -7,18 +7,19 @@ #define interface_SerialInterface_h int init_port (int baud); -int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_channels); +int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_channels, int * samples_averaged, int * LED_state); -#define NUM_CHANNELS 5 +#define NUM_CHANNELS 6 #define SERIAL_PORT_NAME "/dev/tty.usbmodem641" // Acceleration sensors, in screen/world coord system (X = left/right, Y = Up/Down, Z = fwd/back) -#define ACCEL_X 3 -#define ACCEL_Y 4 -#define ACCEL_Z 2 +#define ACCEL_X 4 +#define ACCEL_Y 5 +#define ACCEL_Z 3 // Gyro sensors, in coodinate system of head/airplane #define PITCH_RATE 0 #define YAW_RATE 1 +#define ROLL_RATE 2 #endif diff --git a/cloud.cpp b/cloud.cpp index 329b840ab5..155540bc01 100644 --- a/cloud.cpp +++ b/cloud.cpp @@ -30,9 +30,9 @@ Cloud::Cloud(int num, particles[i].position.y = y; particles[i].position.z = z; - particles[i].velocity.x = 0; //randFloat() - 0.5; - particles[i].velocity.y = 0; //randFloat() - 0.5; - particles[i].velocity.z = 0; //randFloat() - 0.5; + particles[i].velocity.x = randFloat() - 0.5; + particles[i].velocity.y = randFloat() - 0.5; + particles[i].velocity.z = randFloat() - 0.5; float color_mult = 1 - COLOR_MIN; particles[i].color = glm::vec3(x*color_mult/WORLD_SIZE + COLOR_MIN, @@ -78,16 +78,16 @@ void Cloud::simulate (float deltaTime) { for (i = 0; i < count; ++i) { // Update position - //particles[i].position += particles[i].velocity*deltaTime; - particles[i].position += particles[i].velocity; + particles[i].position += particles[i].velocity*deltaTime; + //particles[i].position += particles[i].velocity; // Decay Velocity (Drag) - const float CONSTANT_DAMPING = 1.0; + const float CONSTANT_DAMPING = 0.5; particles[i].velocity *= (1.f - CONSTANT_DAMPING*deltaTime); // Interact with Field - const float FIELD_COUPLE = 0.0000001; - field_interact(&particles[i].position, &particles[i].velocity, &particles[i].color, FIELD_COUPLE); + const float FIELD_COUPLE = 0.005; //0.0000001; + field_interact(deltaTime, &particles[i].position, &particles[i].velocity, &particles[i].color, FIELD_COUPLE); // Bounce or Wrap if (wrapBounds) { diff --git a/field.cpp b/field.cpp index 011fb6515f..f450c38525 100644 --- a/field.cpp +++ b/field.cpp @@ -62,16 +62,16 @@ void field_add(float* add, float *pos) } } -void field_interact(glm::vec3 * pos, glm::vec3 * vel, glm::vec3 * color, float coupling) { +void field_interact(float dt, glm::vec3 * pos, glm::vec3 * vel, glm::vec3 * color, float coupling) { int index = (int)(pos->x/WORLD_SIZE*10.0) + (int)(pos->y/WORLD_SIZE*10.0)*10 + (int)(pos->z/WORLD_SIZE*10.0)*100; if ((index >= 0) && (index < FIELD_ELEMENTS)) { // Add velocity to particle from field - *vel += field[index].val; + *vel += field[index].val*dt; // Add back to field from particle velocity - glm::vec3 temp = *vel; + glm::vec3 temp = *vel*dt; temp *= coupling; field[index].val += temp; @@ -127,7 +127,8 @@ void field_simulate(float dt) { field[i].val += add; } else { - field[i].val *= 0.999; + const float CONSTANT_DAMPING = 0.5; + field[i].val *= (1.f - CONSTANT_DAMPING*dt); //field[i].val.x += (randFloat() - 0.5)*0.01*FIELD_SCALE; //field[i].val.y += (randFloat() - 0.5)*0.01*FIELD_SCALE; //field[i].val.z += (randFloat() - 0.5)*0.01*FIELD_SCALE; @@ -141,7 +142,7 @@ void field_render() { int i; float fx, fy, fz; - float scale_view = 1000.0; + float scale_view = 0.1; glDisable(GL_LIGHTING); glColor3f(0, 1, 0); diff --git a/field.h b/field.h index 33004554d2..354a4a8149 100644 --- a/field.h +++ b/field.h @@ -35,7 +35,7 @@ void field_init(); int field_value(float *ret, float *pos); void field_render(); void field_add(float* add, float *loc); -void field_interact(glm::vec3 * pos, glm::vec3 * vel, glm::vec3 * color, float coupling); +void field_interact(float dt, glm::vec3 * pos, glm::vec3 * vel, glm::vec3 * color, float coupling); void field_simulate(float dt); glm::vec3 hsv2rgb(glm::vec3 in); #endif diff --git a/head.cpp b/head.cpp index d2b2a0ed02..46dd25028b 100644 --- a/head.cpp +++ b/head.cpp @@ -29,7 +29,7 @@ const float DECAY = 0.1; Head::Head() { PupilSize = 0.10; - interPupilDistance = 0.5; + interPupilDistance = 0.6; interBrowDistance = 0.75; NominalPupilSize = 0.10; EyebrowPitch[0] = EyebrowPitch[1] = BrowPitchAngle[0]; @@ -40,10 +40,11 @@ Head::Head() MouthWidth = 1.0; MouthHeight = 0.2; EyeballPitch[0] = EyeballPitch[1] = 0; + EyeballScaleX = 1.2; EyeballScaleY = 1.5; EyeballScaleZ = 1.0; EyeballYaw[0] = EyeballYaw[1] = 0; PitchTarget = YawTarget = 0; NoiseEnvelope = 1.0; - PupilConverge = 2.1; + PupilConverge = 5.0; leanForward = 0.0; leanSideways = 0.0; setNoise(0); @@ -52,32 +53,36 @@ Head::Head() void Head::reset() { position = glm::vec3(0,0,0); - Pitch = 0; - Yaw = 0; + Pitch = Yaw = Roll = 0; leanForward = leanSideways = 0; } void Head::UpdatePos(float frametime, int * adc_channels, float * avg_adc_channels, int head_mirror, glm::vec3 * gravity) // Using serial data, update avatar/render position and angles { - float measured_pitch_rate = adc_channels[0] - avg_adc_channels[0]; - float measured_yaw_rate = adc_channels[1] - avg_adc_channels[1]; - float measured_lateral_accel = adc_channels[3] - avg_adc_channels[3]; - float measured_fwd_accel = avg_adc_channels[2] - adc_channels[2]; + float measured_pitch_rate = adc_channels[PITCH_RATE] - avg_adc_channels[PITCH_RATE]; + float measured_yaw_rate = adc_channels[YAW_RATE] - avg_adc_channels[YAW_RATE]; + float measured_lateral_accel = adc_channels[ACCEL_X] - avg_adc_channels[ACCEL_X]; + float measured_fwd_accel = avg_adc_channels[ACCEL_Z] - adc_channels[ACCEL_Z]; + float measured_roll_rate = adc_channels[ROLL_RATE] - avg_adc_channels[ROLL_RATE]; // Update avatar head position based on measured gyro rates const float HEAD_ROTATION_SCALE = 0.20; + const float HEAD_ROLL_SCALE = 0.50; const float HEAD_LEAN_SCALE = 0.02; if (head_mirror) { addYaw(measured_yaw_rate * HEAD_ROTATION_SCALE * frametime); addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime); + addRoll(measured_roll_rate * HEAD_ROLL_SCALE * frametime); addLean(measured_lateral_accel * frametime * HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE); } else { addYaw(measured_yaw_rate * -HEAD_ROTATION_SCALE * frametime); addPitch(measured_pitch_rate * -HEAD_ROTATION_SCALE * frametime); + addRoll(measured_roll_rate * HEAD_ROLL_SCALE * frametime); addLean(measured_lateral_accel * frametime * -HEAD_LEAN_SCALE, measured_fwd_accel*frametime * HEAD_LEAN_SCALE); } + // Try to measure absolute roll from sensors const float MIN_ROLL = 3.0; glm::vec3 v1(gravity->x, gravity->y, 0); @@ -112,7 +117,7 @@ void Head::simulate(float deltaTime) // Move toward new target Pitch += (PitchTarget - Pitch)*22*deltaTime; // (1.f - DECAY*deltaTime)*Pitch + ; Yaw += (YawTarget - Yaw)*22*deltaTime; // (1.f - DECAY*deltaTime); - //Roll *= (1.f - DECAY*deltaTime); + Roll *= (1.f - DECAY*deltaTime); } leanForward *= (1.f - DECAY*30.f*deltaTime); @@ -166,16 +171,18 @@ void Head::render() glLoadIdentity(); glTranslatef(0.f, 0.f, -7.f); glTranslatef(leanSideways, 0.f, leanForward); + glRotatef(Yaw/2.0, 0, 1, 0); glRotatef(Pitch/2.0, 1, 0, 0); glRotatef(Roll/2.0, 0, 0, 1); + // Overall scale of head - glScalef(2.0, 2.0, 2.0); + glScalef(1.5, 2.0, 2.0); glColor3fv(skinColor); // Head - glutSolidSphere(1, 15, 15); + glutSolidSphere(1, 30, 30); // Ears glPushMatrix(); @@ -184,7 +191,7 @@ void Head::render() { glPushMatrix(); glScalef(0.5, 0.75, 1.0); - glutSolidSphere(0.5, 15, 15); + glutSolidSphere(0.5, 30, 30); glPopMatrix(); glTranslatef(-2, 0, 0); } @@ -221,29 +228,45 @@ void Head::render() glTranslatef(0, 1.0, 0); + + glTranslatef(-interPupilDistance/2.0,-0.68,0.7); // Right Eye - glTranslatef(-0.25,-0.5,0.7); + glRotatef(-10, 1, 0, 0); glColor3fv(eyeColor); - glutSolidSphere(0.25, 15, 15); + 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 glPushMatrix(); glRotatef(EyeballPitch[1], 1, 0, 0); glRotatef(EyeballYaw[1] + PupilConverge, 0, 1, 0); glTranslatef(0,0,.25); glColor3f(0,0,0); - glutSolidSphere(PupilSize, 10, 10); + glutSolidSphere(PupilSize, 15, 15); glPopMatrix(); // Left Eye glColor3fv(eyeColor); glTranslatef(interPupilDistance, 0, 0); - glutSolidSphere(0.25f, 15, 15); + 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,.25); glColor3f(0,0,0); - glutSolidSphere(PupilSize, 10, 10); + glutSolidSphere(PupilSize, 15, 15); glPopMatrix(); diff --git a/head.h b/head.h index 5875114e77..b0182cd498 100644 --- a/head.h +++ b/head.h @@ -27,6 +27,7 @@ class Head { float EyeballYaw[2]; float EyebrowPitch[2]; float EyebrowRoll[2]; + float EyeballScaleX, EyeballScaleY, EyeballScaleZ; float interPupilDistance; float interBrowDistance; float NominalPupilSize; diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index e02456d7171ff4467da391dddf0a8a01ec236aa8..5069cead6418bad2f51d22121b689a2636dda6fb 100644 GIT binary patch delta 33081 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 delta 33034 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 WyVXL=7XMFoTmJv_|CboK`u_mHGVvb( diff --git a/main.cpp b/main.cpp index c03f08025e..f366efad3a 100644 --- a/main.cpp +++ b/main.cpp @@ -51,8 +51,6 @@ using namespace std; -// Junk for talking to the Serial Port -int serial_on = 0; // Is serial connection on/off? System will try int audio_on = 0; // Whether to turn on the audio support int simulate_on = 1; @@ -93,7 +91,7 @@ ParticleSystem balls(0, ); -Cloud cloud(200000, // Particles +Cloud cloud(100000, // Particles box, // Bounding Box false // Wrap ); @@ -103,7 +101,7 @@ float cubes_scale[MAX_CUBES]; float cubes_color[MAX_CUBES*3]; int cube_count = 0; -#define RENDER_FRAME_MSECS 10 +#define RENDER_FRAME_MSECS 5 #define SLEEP 0 float yaw =0.f; // The yaw, pitch for the avatar head @@ -146,19 +144,15 @@ int mouse_pressed = 0; // true if mouse has been pressed (clear when finishe int speed; // -// Serial I/O channel mapping: -// -// 0 Head Gyro Pitch -// 1 Head Gyro Yaw -// 2 Head Accelerometer X -// 3 Head Accelerometer Z -// 4 Hand Accelerometer X -// 5 Hand Accelerometer Y -// 6 Hand Accelerometer Z +// Serial USB Variables // +int serial_on = 0; +int latency_display = 1; int adc_channels[NUM_CHANNELS]; float avg_adc_channels[NUM_CHANNELS]; +int sensor_samples = 0; +int sensor_LED = 0; glm::vec3 gravity; int first_measurement = 1; int samplecount = 0; @@ -214,9 +208,14 @@ void display_stats(void) drawtext(10, 15, 0.10, 0, 1.0, 0, legend); char stats[200]; - sprintf(stats, "FPS = %3.0f, Ping = %4.1f Packets/Sec = %d, Bytes/sec = %d", + sprintf(stats, "FPS = %3.0f, Ping = %4.1f Pkts/s = %d, Bytes/s = %d", FPS, ping_msecs, packets_per_second, bytes_per_second); drawtext(10, 30, 0.10, 0, 1.0, 0, stats); + if (serial_on) { + sprintf(stats, "ADC samples = %d, LED = %d", + sensor_samples, sensor_LED); + drawtext(500, 30, 0.10, 0, 1.0, 0, stats); + } /* char adc[200]; @@ -296,7 +295,7 @@ void init(void) cube_count = index; // Recursive build - /* + float location[] = {0,0,0}; float scale = 10.0; int j = 0; @@ -316,11 +315,11 @@ void init(void) // Call readsensors for a while to get stable initial values on sensors printf( "Stabilizing sensors... " ); gettimeofday(&timer_start, NULL); - read_sensors(1, &avg_adc_channels[0], &adc_channels[0]); + read_sensors(1, &avg_adc_channels[0], &adc_channels[0], &sensor_samples, &sensor_LED); int done = 0; while (!done) { - read_sensors(0, &avg_adc_channels[0], &adc_channels[0]); + read_sensors(0, &avg_adc_channels[0], &adc_channels[0], &sensor_samples, &sensor_LED); gettimeofday(&timer_end, NULL); if (diffclock(timer_start,timer_end) > 1000) done = 1; } @@ -367,7 +366,7 @@ void reset_sensors() myHead.reset(); myHand.reset(); - if (serial_on) read_sensors(1, &avg_adc_channels[0], &adc_channels[0]); + if (serial_on) read_sensors(1, &avg_adc_channels[0], &adc_channels[0], &sensor_samples, &sensor_LED); } void update_pos(float frametime) @@ -493,8 +492,6 @@ void update_pos(float frametime) void display(void) { - - glEnable (GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LINE_SMOOTH); @@ -627,6 +624,17 @@ void display(void) disp_x += GAP; } + // Display Serial latency block + if (latency_display && sensor_LED) { + glColor3f(1,0,0); + glBegin(GL_QUADS); { + glVertex2f(WIDTH - 100, HEIGHT - 100); + glVertex2f(WIDTH, HEIGHT - 100); + glVertex2f(WIDTH, HEIGHT); + glVertex2f(WIDTH - 100, HEIGHT); + } + glEnd(); + } } if (stats_on) display_stats(); @@ -774,7 +782,8 @@ void idle(void) // Read network packets read_network(); // Read serial data - if (serial_on) samplecount += read_sensors(0, &avg_adc_channels[0], &adc_channels[0]); + if (serial_on) samplecount += read_sensors(0, &avg_adc_channels[0], &adc_channels[0], + &sensor_samples, &sensor_LED); if (SLEEP) {