void update_friction(int n) { // kill lateral velocity const cpFloat max_lateral_impulse = 300; cpVect impulse = cpvmult(cpvneg(lateral_velocity(n)), cpBodyGetMass(tire[n])); //printf("%f\n", cpvlength(impulse)); if(cpvlength(impulse) > max_lateral_impulse) impulse = cpvmult(impulse, max_lateral_impulse / cpvlength(impulse)); cpBodyApplyImpulse(tire[n], impulse, cpvzero); // TODO - kill angular velocity? cpFloat inertia = cpBodyGetMoment(tire[n]); cpFloat av = cpBodyGetAngVel(tire[n]); if(av != 0) cpBodySetAngVel(tire[n], av / 1.2); // apply drag cpVect forward_normal = forward_velocity(n); cpFloat forward_speed = cpvlength(forward_normal); if(forward_speed < 1) { cpBodySetVel(tire[n], cpvzero); } else { forward_normal = cpvnormalize(forward_normal); cpFloat drag = -1 * forward_speed; cpBodyApplyImpulse(tire[n], cpvmult(forward_normal, drag), cpvzero); } }
void update_drive() { const cpFloat max_forward_speed = 150; const cpFloat max_backward_speed = -20; const cpFloat max_drive_force = 100; int i; for(i=0; i<1; i++) { cpFloat desired_speed = 0; // find desired speed if(controls.forward) desired_speed = max_forward_speed; else if(controls.back) desired_speed = max_backward_speed; // find speed cpVect forward_normal = cpvperp(cpvforangle(cpBodyGetAngle(tire[i]))); cpFloat speed = cpvdot(forward_velocity(i), forward_normal); // apply force cpFloat force = 0; if(desired_speed > speed) force = max_drive_force; else if(desired_speed < speed) force = -max_drive_force; else return; cpBodyApplyImpulse(tire[i], cpvmult(forward_normal, force), cpvzero); } }
void camera_t::calc_velocity(float dt) { glm::vec3 forward_velocity(dir * dt * speed), strafing_velocity(right * dt * speed); static bool prev_move_foward = false, prev_move_right = false; if (user[FORWARD] || user[BACK] || user[LEFT] || user[RIGHT]) { speed += dt * 75.0f; // TODO: fix scaling issue speed = glm::clamp(speed, 0.0f, 64.0f); } else { // apply momentum... speed *= 0.97f; if (strafing == false) { pos += (forward_velocity * ((prev_move_foward) ? 1.0f : -1.0f)); } if (moving_back_or_forth == false) { pos += (strafing_velocity * ((prev_move_right) ? 1.0f : -1.0f)); } } if (user[FORWARD]) { pos += forward_velocity; prev_move_foward = true; } else if (user[BACK]) { pos -= forward_velocity; prev_move_foward = false; } if (user[RIGHT]) { pos += strafing_velocity; prev_move_right = true; } else if (user[LEFT]) { pos -= strafing_velocity; prev_move_right = false; } }