00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _WHEEL_H_
00022 #define _WHEEL_H_
00023
00024 #include <vamos/body/Suspension.h>
00025 #include <vamos/body/Tire.h>
00026 #include <vamos/body/Brake.h>
00027 #include <vamos/body/Contact_Point.h>
00028 #include <vamos/geometry/Constants.h>
00029 #include <vamos/geometry/Material.h>
00030 #include <vamos/geometry/Three_Vector.h>
00031 #include <vamos/geometry/Inertia_Tensor.h>
00032
00033 #include <GL/gl.h>
00034
00035 #include "model.h"
00036
00037 #include <string>
00038
00039 namespace Vamos_Body
00040 {
00041
00042
00043
00044 class Wheel : public Contact_Point
00045 {
00046 private:
00047
00048
00049 Vamos_Geometry::Three_Vector m_original_position;
00050
00051 double m_tire_offset;
00052
00053
00054
00055 double m_roll_height;
00056
00057
00058
00059 Suspension* mp_suspension;
00060
00061
00062 Tire m_tire;
00063
00064
00065 Brake m_brake;
00066
00067
00068 Vamos_Geometry::Three_Vector m_ground_velocity;
00069
00070
00071 Vamos_Geometry::Three_Vector m_normal;
00072
00073
00074 Vamos_Geometry::Three_Vector m_ang_velocity;
00075
00076
00077 Vamos_Geometry::Material_Handle m_material;
00078
00079
00080 double m_tire_torque;
00081
00082 double m_drive_torque;
00083
00084 double m_braking_torque;
00085
00086
00087 bool m_steered;
00088
00089
00090 bool m_driven;
00091
00092
00093 Vamos_Geometry::Side m_side;
00094
00095
00096
00097
00098
00099
00100
00101 double m_transition_speed;
00102
00103
00104 double m_rotation;
00105
00106 JOEMODEL model;
00107
00108
00109
00110
00111
00112
00113
00114 void transform ();
00115
00116 public:
00117
00118 Wheel (double mass,
00119 Vamos_Geometry::Three_Vector position,
00120 double tire_offset,
00121 double roll_height,
00122 double restitution,
00123 Suspension* suspension,
00124 const Tire& tire,
00125 const Brake& brake,
00126 bool steered,
00127 bool driven,
00128 Vamos_Geometry::Side side);
00129
00130
00131
00132 void find_forces ();
00133
00134 Suspension* suspension();
00135 Vamos_Geometry::Three_Vector ang_velocity();
00136 void set_ang_velocity(Vamos_Geometry::Three_Vector newvel) {m_ang_velocity = newvel;}
00137
00138
00139 void propagate (double time);
00140
00141
00142 void rewind ();
00143
00144
00145
00146 double contact (const Vamos_Geometry::Three_Vector& position,
00147 const Vamos_Geometry::Inertia_Tensor& inertia,
00148 const Vamos_Geometry::Three_Vector& vecocity,
00149 double distance,
00150 const Vamos_Geometry::Three_Vector& normal,
00151 const Vamos_Geometry::Three_Vector& ang_velocity,
00152 Vamos_Geometry::Material_Handle material);
00153
00154
00155
00156 void drive_torque (double torque_in);
00157
00158 void brake (double factor);
00159
00160 double get_handbrake_multiplier() {return m_brake.handbrake();}
00161
00162
00163 void steer (double degree_angle) { mp_suspension->steer (degree_angle); }
00164
00165
00166
00167
00168 double slide () const { return m_tire.slide (); }
00169
00170
00171 double rotational_speed () const { return m_tire.rotational_speed (); }
00172
00173 void set_rotational_speed(double newrs) {m_tire.set_rotational_speed(newrs);}
00174
00175
00176
00177 double speed () const { return m_tire.speed (); }
00178
00179 double GetFeedback() {return m_tire.GetFeedback();}
00180
00181
00182
00183 Vamos_Geometry::Three_Vector force_position () const;
00184
00185
00186
00187 Vamos_Geometry::Three_Vector contact_position () const;
00188
00189 Vamos_Geometry::Three_Vector position () const;
00190
00191
00192 double slip () const;
00193
00194
00195 void reset ();
00196
00197 bool single_contact () const { return false; }
00198
00199 bool steered () const { return m_steered; }
00200 bool driven () const { return m_driven; }
00201
00202 Vamos_Geometry::Side side () const { return m_side; }
00203
00204 void set_models (std::string slow_file,
00205 std::string fast_file,
00206 double transition_speed,
00207 std::string stator_file,
00208 double stator_offset,
00209 double scale,
00210 const Vamos_Geometry::Three_Vector& translation,
00211 const Vamos_Geometry::Three_Vector& rotation);
00212 void draw ();
00213
00214 void SetColParams(double f1, double f2, double rr, double rd) {m_tire.SetSurfaceParams(f1, f2, rr, rd);}
00215 };
00216 }
00217
00218 #endif // !_WHEEL_H_