Forums

Full Version: Help needed for implementing clutch
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi all,
Im michele from italy and Im developing a racing simulation web oriented, and i would like to ask you help cause im experiencing some problems in implementing the clutch.
First of all i have to thank you all cause your forum is a invaluable source for a developer.
now my help request:
Im having serious difficulties in developing the clutch, i cant make it work like i would.
im modelling the clutch like a viscous coupling, "stealing" the idea from vdrift.

the code is:

Code:
```float averageWheelsAngularVelo = 0; foreach(Wheel w in poweredWheels)   averageWheelsAngularVelo += w.angularVelocity * drivetrainFraction;          ClutchSpeed=averageWheelsAngularVelo* ratio; // wheels average speed *ratio          ClutchTorque = clutch.GetTorque(engineAngularVelo, ClutchSpeed,engineTotalTorqueMax); engineTorque = CalcEngineTorque(rpm) * throttle; engineFrictionTorque=CalcEngineFrictionTorque(rpm); if (clutch.IsLocked())     TransferedTorque=engineTorque; else     TransferedTorque=ClutchTorque; engineTotalTorque = engineTorque - engineFrictionTorque - ClutchTorque; // update engine angular velo engineAngularVelo  += (engineTotalTorque) / engineInertia * Time.deltaTime; if (ratio != 0 && clutch.GetClutchPosition()!=0)   //clutch engaged or engaging {     // Apply torque to wheels     foreach(Wheel w in poweredWheels)     {         lockingTorque = (averageWheelsAngularVelo - w.angularVelocity) * differentialLockCoefficient;         w.drivetrainInertia = inertia * drivetrainFraction;         w.driveFrictionTorque = engineFrictionTorque * Mathf.Abs(ratio) * drivetrainFraction;         w.driveTorque =  TransferedTorque * ratio * drivetrainFraction + lockingTorque;         slipRatio += w.slipRatio * drivetrainFraction;     } }```

the GetTorque function is:

Code:
```// clutch is modeled as limited highly viscous coupling public float GetTorque ( float n_engine_speed, float n_clutch_speed, float engine_max_torque) {     torque_capacity=1.25f*engine_max_torque;          nengine_max_torque=engine_max_torque;     engine_speed = n_engine_speed;     clutch_speed = n_clutch_speed;     new_speed_diff = engine_speed  - clutch_speed;     locked = true;                  if (clutch_position ==0) {         locked = false;         return 0;     }         else{         max_torque = clutch_position * torque_capacity;         friction_torque = max_torque* (new_speed_diff/factor);    // viscous coupling (locked clutch)         if (friction_torque > max_torque) // slipping clutch         {             friction_torque  = max_torque;             locked = false;         }         else if (friction_torque < -max_torque) // slipping clutch         {             friction_torque  = -max_torque;             locked = false;         }         //friction_torque =Mathf.Min(engine_max_torque,friction_torque);         last_torque = friction_torque;         return friction_torque;     } }```

as you can see Im using a "factor" to decrease the speed_diff between engine and the clutch (new_speed_diff/factor), cause without that clutch is always slipping (new_speed_diff is always >1). the problem is that this is a patch, and i have to find the right factor for every car and engine i put in my sim.
Probably i need a function that update the engineangularvelo while engaging, but i really dont know if this is the right way and how to implement it.

PS: if someone is interested this is the link of a demo of my sim:

http://migliortestesso.com/test/test.html

you can play it directly online, you dont have to donwload and install anything, excpet for the unity3d plugin, a plugin like flash but optimized for 3d graphics.Ã¹

thank you all

michele
Yeah, this clutch model hasn't worked that well in vdrift too. You might want to take a look at: http://www.mathworks.com/products/simuli...lutch.html