]> git.mxchange.org Git - flightgear.git/blobdiff - src/Systems/submodel.cxx
Boris Koenig:
[flightgear.git] / src / Systems / submodel.cxx
index 3b012e54c4b61152f45fc073d4064ddb0a6bd908..e35d6554e35561541afdbacc0b1a245500cbce25 100644 (file)
@@ -13,6 +13,8 @@
 #include <AIModel/AIManager.hxx>
 
 
+const double SubmodelSystem::lbs_to_slugs = 0.031080950172;
+
 SubmodelSystem::SubmodelSystem ()
 {
     
@@ -23,6 +25,7 @@ SubmodelSystem::SubmodelSystem ()
   
   out[0] = out[1] = out[2] = 0;
   in[3] = out[3] = 1;
+  string contents_node;
 }
 
 SubmodelSystem::~SubmodelSystem ()
@@ -50,6 +53,10 @@ SubmodelSystem::init ()
     _user_wind_from_east_node  = fgGetNode("/environment/wind-from-east-fps",true);
     _user_wind_from_north_node = fgGetNode("/environment/wind-from-north-fps",true);
 
+    _user_speed_down_fps_node   = fgGetNode("/velocities/speed-down-fps",true);
+    _user_speed_east_fps_node   = fgGetNode("/velocities/speed-east-fps",true);
+    _user_speed_north_fps_node  = fgGetNode("/velocities/speed-north-fps",true);
+
     ai = (FGAIManager*)globals->get_subsystem("ai_model");
 
 
@@ -112,6 +119,7 @@ SubmodelSystem::release (submodel* sm, double dt)
   entity.altitude = IC.alt;
   entity.azimuth = IC.azimuth;
   entity.elevation = IC.elevation;
+  entity.roll = IC.roll;
   entity.speed = IC.speed;
   entity.eda = sm->drag_area;
   entity.life = sm->life;
@@ -119,6 +127,8 @@ SubmodelSystem::release (submodel* sm, double dt)
   entity.wind_from_east = IC.wind_from_east;
   entity.wind_from_north = IC.wind_from_north;
   entity.wind = sm->wind;
+  entity.cd = sm->cd;
+  entity.mass = IC.mass;
   ai->createBallistic( &entity );
  
   if (sm->count > 0) (sm->count)--; 
@@ -129,6 +139,7 @@ SubmodelSystem::release (submodel* sm, double dt)
 void
 SubmodelSystem::load ()
 {
+
     int i;
     SGPropertyNode *path = fgGetNode("/sim/systems/submodels/path");
     SGPropertyNode root;
@@ -156,7 +167,7 @@ SubmodelSystem::load ()
      sm->trigger        = fgGetNode(entry_node->getStringValue("trigger", "none"), true);
      sm->name           = entry_node->getStringValue("name", "none_defined");
      sm->model          = entry_node->getStringValue("model", "Models/Geometry/rocket.ac");
-     sm->speed          = entry_node->getDoubleValue("speed", 0.0);
+     sm->speed          = entry_node->getDoubleValue("speed", 2329.4 );
      sm->repeat         = entry_node->getBoolValue  ("repeat", false); 
      sm->delay          = entry_node->getDoubleValue("delay", 0.25); 
      sm->count          = entry_node->getIntValue   ("count", 1); 
@@ -166,18 +177,25 @@ SubmodelSystem::load ()
      sm->z_offset       = entry_node->getDoubleValue("z-offset", 0.0); 
      sm->yaw_offset     = entry_node->getDoubleValue("yaw-offset", 0.0); 
      sm->pitch_offset   = entry_node->getDoubleValue("pitch-offset", 0.0);
-     sm->drag_area      = entry_node->getDoubleValue("eda", 0.007);
+     sm->drag_area      = entry_node->getDoubleValue("eda", 0.034);
      sm->life           = entry_node->getDoubleValue("life", 900.0);
      sm->buoyancy       = entry_node->getDoubleValue("buoyancy", 0);
      sm->wind           = entry_node->getBoolValue  ("wind", false); 
      sm->first_time     = false;
+     sm->cd             = entry_node->getDoubleValue("cd", 0.193);
+     sm->weight         = entry_node->getDoubleValue("weight", 0.25);
+     sm->contents_node  = fgGetNode(entry_node->getStringValue("contents", "none"), true);
 
      sm->trigger->setBoolValue(false);
      sm->timer = sm->delay;
-
+     sm->contents = sm->contents_node->getDoubleValue();
      sm->prop = fgGetNode("/systems/submodels/submodel", i, true);
      sm->prop->tie("count", SGRawValuePointer<int>(&(sm->count)));
 
+//   sm->prop->tie("contents", SGRawValuePointer<double>(&(sm->contents)));
+//   sm->prop->tie("contents path", SGRawValuePointer<const char *>(&(sm->contents_node)));
      submodels.push_back( sm );
    }
 
@@ -190,29 +208,44 @@ void
 SubmodelSystem::transform( submodel* sm) 
 {
 
- // get initial conditions 
+// get initial conditions 
+// get the weight of the contents (lbs) and convert to mass (slugs)
+  sm->contents = sm->contents_node->getDoubleValue();
+  
+  IC.mass = (sm->weight + sm->contents) * lbs_to_slugs;;
+//  cout << IC.mass << endl;
+    
+// set contents to 0 in the parent
+   sm->contents_node->setDoubleValue(0); 
     
   IC.lat =        _user_lat_node->getDoubleValue();    
-  IC.lon =        _user_lon_node->getDoubleValue();       
+  IC.lon =        _user_lon_node->getDoubleValue();   
   IC.alt =        _user_alt_node->getDoubleValue();    
-  IC.roll =     - _user_roll_node->getDoubleValue();    // rotation about x axis
-  IC.elevation =  _user_pitch_node->getDoubleValue();   // rotation about y axis
+  IC.roll =       _user_roll_node->getDoubleValue();    // rotation about x axis 
+  IC.elevation =  _user_pitch_node->getDoubleValue();   // rotation about y axis 
   IC.azimuth =    _user_heading_node->getDoubleValue(); // rotation about z axis
   
   IC.speed =           _user_speed_node->getDoubleValue();
   IC.wind_from_east =  _user_wind_from_east_node->getDoubleValue();
   IC.wind_from_north = _user_wind_from_north_node->getDoubleValue();
   
+  IC.speed_down_fps =   _user_speed_down_fps_node->getDoubleValue();
+  IC.speed_east_fps =   _user_speed_east_fps_node->getDoubleValue();
+  IC.speed_north_fps =  _user_speed_north_fps_node->getDoubleValue();
+
+  
   in[0] = sm->x_offset;
   in[1] = sm->y_offset;
   in[2] = sm->z_offset; 
-
+  
 // pre-process the trig functions
 
-    cosRx = cos(IC.roll * SG_DEGREES_TO_RADIANS);
-    sinRx = sin(IC.roll * SG_DEGREES_TO_RADIANS);
-    cosRy = cos(IC.elevation * SG_DEGREES_TO_RADIANS);
-    sinRy = sin(IC.elevation * SG_DEGREES_TO_RADIANS);
+    cosRx = cos(-IC.roll * SG_DEGREES_TO_RADIANS);
+    sinRx = sin(-IC.roll * SG_DEGREES_TO_RADIANS);
+    cosRy = cos(-IC.elevation * SG_DEGREES_TO_RADIANS);
+    sinRy = sin(-IC.elevation * SG_DEGREES_TO_RADIANS);
     cosRz = cos(IC.azimuth * SG_DEGREES_TO_RADIANS);
     sinRz = sin(IC.azimuth * SG_DEGREES_TO_RADIANS);
 
@@ -255,11 +288,49 @@ SubmodelSystem::transform( submodel* sm)
    
    // Get submodel initial velocity vector angles in XZ and XY planes.
    // This needs to be fixed. This vector should be added to aircraft's vector. 
-   IC.elevation += (sm->pitch_offset * cosRx) + (sm->yaw_offset * sinRx);
+   IC.elevation += (sm->yaw_offset * sinRx) + (sm->pitch_offset * cosRx);
    IC.azimuth   += (sm->yaw_offset * cosRx) - (sm->pitch_offset * sinRx);
  
    // For now assume vector is close to airplane's vector.  This needs to be fixed.
-   IC.speed += sm->speed; 
+   //IC.speed += ; 
+
+   // calcuate the total speed north
+
+   IC.total_speed_north = sm->speed * cos(IC.elevation*SG_DEGREES_TO_RADIANS)*
+                    cos(IC.azimuth*SG_DEGREES_TO_RADIANS) + IC.speed_north_fps;
+
+   // calculate the total speed east
+
+   IC.total_speed_east = sm->speed * cos(IC.elevation*SG_DEGREES_TO_RADIANS)*
+                     sin(IC.azimuth*SG_DEGREES_TO_RADIANS) + IC.speed_east_fps;
+
+   // calculate the total speed down
+  
+   IC.total_speed_down = sm->speed * -sin(IC.elevation*SG_DEGREES_TO_RADIANS) +
+                        IC.speed_down_fps;
+
+  // re-calculate speed, elevation and azimuth
+
+   IC.speed = sqrt( IC.total_speed_north * IC.total_speed_north + 
+                    IC.total_speed_east * IC.total_speed_east +
+                    IC.total_speed_down * IC.total_speed_down);
+
+   IC.azimuth = atan(IC.total_speed_east/IC.total_speed_north) * SG_RADIANS_TO_DEGREES;
+   
+   // rationalise the output
+   
+   if (IC.total_speed_north <= 0){
+    IC.azimuth = 180 + IC.azimuth;
+   }
+   else{
+     if(IC.total_speed_east <= 0){
+     IC.azimuth = 360 + IC.azimuth;
+   }
+  }
+    IC.elevation = -atan(IC.total_speed_down/sqrt(IC.total_speed_north * 
+                       IC.total_speed_north + 
+                       IC.total_speed_east * IC.total_speed_east)) * SG_RADIANS_TO_DEGREES;
 
 }
 
@@ -273,3 +344,6 @@ SubmodelSystem::updatelat(double lat)
 
 // end of submodel.cxx
 
+
+
+