00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _SUSPENSION_H_
00022 #define _SUSPENSION_H_
00023
00024 #include <vamos/body/Particle.h>
00025 #include <vamos/geometry/Constants.h>
00026 #include <vamos/geometry/Three_Vector.h>
00027
00028 #include <GL/gl.h>
00029
00030 #include <vector>
00031 #include <string>
00032
00033 namespace Vamos_Body
00034 {
00035 struct Suspension_Model;
00036
00037 class Hinge : public Particle
00038 {
00039 public:
00040 Hinge (const Vamos_Geometry::Three_Vector& position);
00041
00042 void input (const Vamos_Geometry::Three_Vector& torque,
00043 const Vamos_Geometry::Three_Vector& radius);
00044 };
00045
00046
00047 class Suspension : public Particle
00048 {
00049
00050
00051
00052 const static Vamos_Geometry::Three_Vector STEER_AXIS;
00053
00054 Hinge* mp_hinge;
00055 Vamos_Geometry::Three_Vector m_radius;
00056 Vamos_Geometry::Three_Vector m_tangent;
00057 double m_radius_magnitude;
00058 double m_angle;
00059 double m_initial_z;
00060
00061
00062 double m_spring_constant;
00063
00064
00065 double m_bounce;
00066
00067
00068 double m_rebound;
00069
00070
00071 double m_travel;
00072
00073
00074
00075 double m_displacement;
00076
00077
00078
00079 double m_time_step;
00080
00081
00082 double m_compression_velocity;
00083
00084
00085
00086 double m_max_compression_velocity;
00087
00088
00089
00090 bool m_bottomed_out;
00091
00092
00093
00094 double m_anti_roll_k;
00095
00096
00097
00098 Suspension* m_anti_roll_suspension;
00099
00100 Vamos_Geometry::Three_Vector m_wheel_force;
00101
00102
00103 double m_steer_angle;
00104
00105
00106
00107
00108
00109 double m_camber;
00110
00111
00112 double m_caster;
00113
00114
00115 double m_toe;
00116
00117
00118
00119
00120 Vamos_Geometry::Side m_side;
00121
00122
00123
00124 Vamos_Geometry::Three_Matrix m_static_orientation;
00125
00126 Vamos_Geometry::Three_Vector m_normal;
00127
00128
00129
00130 public:
00131 Suspension (const Vamos_Geometry::Three_Vector& position,
00132 const Vamos_Geometry::Three_Vector& center_of_translation,
00133 Vamos_Geometry::Side side_of_car, double spring_constant,
00134 double bounce, double rebound, double travel,
00135 double max_compression_velocity);
00136
00137 ~Suspension ();
00138
00139
00140
00141
00142 void steer (double degree_angle);
00143
00144 double compression_velocity() {return m_compression_velocity;}
00145 void set_compression_velocity(double newcv) { m_compression_velocity = newcv;}
00146 void set_displacement(double newdisp) {m_displacement = newdisp;}
00147
00148
00149 void camber (double degree_angle);
00150
00151
00152 void caster (double degree_angle);
00153
00154
00155 void toe (double degree_angle);
00156
00157 Hinge* hinge () const { return mp_hinge; }
00158
00159 Vamos_Geometry::Three_Vector force () const { return Particle::force (); }
00160 Vamos_Geometry::Three_Vector torque () const
00161 { return Particle::torque (); }
00162
00163 void input (const Vamos_Geometry::Three_Vector& wheel_force,
00164 const Vamos_Geometry::Three_Vector& normal);
00165
00166 void torque (double wheel_torque);
00167
00168
00169 void find_forces ();
00170
00171
00172 void propagate (double time);
00173
00174
00175 void rewind ();
00176
00177
00178
00179
00180 void anti_roll (Suspension* other, double spring_constant);
00181
00182
00183
00184 void displace (double distance);
00185
00186
00187 double displacement () const { return m_displacement; }
00188
00189
00190
00191 bool bottomed_out () const { return m_bottomed_out; }
00192
00193
00194
00195 double camber_function (double displacement) const;
00196
00197 double current_camber (double normal_y) const;
00198
00199
00200 void reset ();
00201
00202 void set_model (std::string file_name,
00203 double scale,
00204 const Vamos_Geometry::Three_Vector& translation,
00205 const Vamos_Geometry::Three_Vector& rotation);
00206
00207 void draw ();
00208 };
00209 }
00210
00211 #endif // !_SUSPENSION_H_