+void Vehicle::turn_axles(float d)
+{
+ for(vector<Axle>::iterator i=axles.begin(); i!=axles.end(); ++i)
+ i->angle += Angle::from_radians(d*2/i->type->wheel_dia);
+ for(vector<Bogie>::iterator i=bogies.begin(); i!=bogies.end(); ++i)
+ for(vector<Axle>::iterator j=i->axles.begin(); j!=i->axles.end(); ++j)
+ j->angle += Angle::from_radians(d*2/j->type->wheel_dia);
+
+ update_rods();
+}
+
+void Vehicle::update_rods()
+{
+ for(vector<Rod>::iterator i=rods.begin(); i!=rods.end(); ++i)
+ {
+ if(i->type->pivot==VehicleType::Rod::BODY)
+ i->position = i->type->pivot_point;
+ else if(i->type->pivot==VehicleType::Rod::AXLE)
+ {
+ const Axle &axle = get_fixed_axle(i->type->pivot_index);
+ const Vector &pp = i->type->pivot_point;
+ Transform trans = Transform::rotation(axle.angle, Vector(0, -1, 0));
+ i->position = Vector(axle.type->position, 0, axle.type->wheel_dia/2)+trans.transform(pp);
+ }
+ else if(i->type->pivot==VehicleType::Rod::ROD)
+ {
+ const Rod &prod = get_rod(i->type->pivot_index);
+ const Vector &pos = prod.position;
+ const Vector &off = i->type->pivot_point;
+ Transform trans = Transform::rotation(prod.angle, Vector(0, 1, 0));
+ i->position = pos+trans.transform(off);
+ }
+
+ if(i->type->connect_index>=0)
+ {
+ Rod &crod = rods[i->type->connect_index];
+ if(i->type->limit==VehicleType::Rod::ROTATE && crod.type->limit==VehicleType::Rod::SLIDE_X)
+ {
+ Vector span = crod.position+i->type->connect_offset-i->position;
+ float cd = i->type->connect_point.norm();
+ Angle ca = Geometry::atan2(i->type->connect_point.z, i->type->connect_point.x);
+ span.x = sqrt(cd*cd-span.z*span.z)*(span.x>0 ? 1 : -1);
+ i->angle = Geometry::atan2(span.z, span.x)-ca;
+ crod.position.x = i->position.x+span.x-i->type->connect_offset.x;
+ }
+ else if(i->type->limit==VehicleType::Rod::ROTATE && crod.type->limit==VehicleType::Rod::ROTATE)
+ {
+ Vector span = crod.position-i->position;
+ float d = span.norm();
+ float cd1 = i->type->connect_point.norm();
+ float cd2 = i->type->connect_offset.norm();
+ float a = (d*d+cd1*cd1-cd2*cd2)/(2*d);
+ float b = sqrt(cd1*cd1-a*a);
+ float sign = (cross(i->type->connect_point, span).y>0 ? 1 : -1);
+ Vector conn = Vector(span.x*a-span.z*b, 0, span.z*a+span.x*b)/(d*sign);
+ Angle ca1 = Geometry::atan2(i->type->connect_point.z, i->type->connect_point.x);
+ Angle ca2 = Geometry::atan2(i->type->connect_offset.z, i->type->connect_offset.x);
+ i->angle = Geometry::atan2(conn.z, conn.x)-ca1;
+ crod.angle = Geometry::atan2(conn.z-span.z, conn.x-span.x)-ca2;
+ }
+ }
+ }
+}
+
+void Vehicle::adjust_for_distance(TrackOffsetIter &front, TrackOffsetIter &back, float tdist, float ratio) const