Exemple #1
0
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);
	}
}
Exemple #2
0
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);
	}
}
Exemple #3
0
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;
  }
}