Skip to content

Commit 78db7ca

Browse files
committed
Further adjustment to airhose movement
1 parent 4d83c00 commit 78db7ca

File tree

3 files changed

+53
-38
lines changed

3 files changed

+53
-38
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/MSTSWagon.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -472,14 +472,9 @@ public virtual void LoadFromWagFile(string wagFilePath)
472472

473473
var couplerlength = ((CarCouplerFaceLengthM - CarBodyLengthM) / 2) + 0.1f; // coupler length at rest, allow 0.1m also for slack
474474

475-
if (CarAirHoseLengthM < couplerlength)
475+
if (CarAirHoseHorizontalLengthM == 0)
476476
{
477-
CarCouplerFaceLengthM = CarBodyLengthM + (0.4f * 2.0f); // Assume a coupler length of 400mm at each end and add to car body length
478-
479-
if (Simulator.Settings.VerboseConfigurationMessages)
480-
{
481-
Trace.TraceInformation("Coupler length exceeded brake air hose length, so ORTSLengthCouplerFace decreased to {0}", CarCouplerFaceLengthM);
482-
}
477+
CarAirHoseHorizontalLengthM = 0.3862f; // 15.2 inches
483478
}
484479

485480
// Ensure Drive Axles is set to a default if no OR value added to WAG file
@@ -1013,6 +1008,7 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
10131008
case "wagon(ortslengthbogiecentre": CarBogieCentreLengthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
10141009
case "wagon(ortslengthcarbody": CarBodyLengthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
10151010
case "wagon(ortslengthairhose": CarAirHoseLengthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
1011+
case "wagon(ortshorizontallengthairhose": CarAirHoseHorizontalLengthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
10161012
case "wagon(ortslengthcouplerface": CarCouplerFaceLengthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
10171013
case "wagon(ortstrackgauge":
10181014
stf.MustMatch("(");
@@ -1442,6 +1438,7 @@ public virtual void Copy(MSTSWagon copy)
14421438
CarBodyLengthM = copy.CarBodyLengthM;
14431439
CarCouplerFaceLengthM = copy.CarCouplerFaceLengthM;
14441440
CarAirHoseLengthM = copy.CarAirHoseLengthM;
1441+
CarAirHoseHorizontalLengthM = copy.CarAirHoseHorizontalLengthM;
14451442
AuxTenderWaterMassKG = copy.AuxTenderWaterMassKG;
14461443
TenderWagonMaxCoalMassKG = copy.TenderWagonMaxCoalMassKG;
14471444
TenderWagonMaxWaterMassKG = copy.TenderWagonMaxWaterMassKG;

Source/Orts.Simulation/Simulation/RollingStocks/TrainCar.cs

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ public static Interpolator SteamHeatBoilerFuelUsageGalukpH()
196196
public float CarBodyLengthM;
197197
public float CarCouplerFaceLengthM;
198198
public float DerailmentCoefficient;
199-
public float CarAirHoseLengthM;
200199

201200
public float MaxHandbrakeForceN;
202201
public float MaxBrakeForceN = 89e3f;
@@ -251,8 +250,13 @@ public static Interpolator SteamHeatBoilerFuelUsageGalukpH()
251250

252251
public float FrontAirHoseHeightAdjustmentM;
253252
public float RearAirHoseHeightAdjustmentM;
254-
public float FrontAirHoseAngleAdjustmentRad;
255-
public float RearAirHoseAngleAdjustmentRad;
253+
public float FrontAirHoseYAngleAdjustmentRad;
254+
public float FrontAirHoseZAngleAdjustmentRad;
255+
public float RearAirHoseYAngleAdjustmentRad;
256+
public float RearAirHoseZAngleAdjustmentRad;
257+
258+
public float CarAirHoseLengthM;
259+
public float CarAirHoseHorizontalLengthM;
256260

257261
// Used to calculate Carriage Steam Heat Loss
258262
public const float BogieHeightM = 1.06f; // Height reduced by 1.06m to allow for bogies, etc
@@ -1277,21 +1281,26 @@ public void UpdateTrainDerailmentRisk()
12771281
}
12781282
}
12791283

1280-
// Calculate airhose angles and height
1281-
var rearairhoseheightadjustmentreferenceM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow(CouplerDistanceThisCarM, 2));
1282-
var frontairhoseheightadjustmentreferenceM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow(CouplerDistanceBehindCarM, 2));
1284+
// Calculate airhose angles and height adjustment values for the air hose. Firstly the "rest point" is calculated, and then the real time point.
1285+
// The height and angle variation are then calculated against "at rest" reference point. The air hose angle is used to rotate the hose in two directions, ie the Y and Z axis.
1286+
1287+
// Calculate height adjustment.
1288+
var rearairhoseheightadjustmentreferenceM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow(CarAirHoseHorizontalLengthM, 2));
1289+
var frontairhoseheightadjustmentreferenceM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow(CarBehind.CarAirHoseHorizontalLengthM, 2));
12831290

1284-
RearAirHoseHeightAdjustmentM = (float)Math.Sqrt( (float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CouplerDistanceThisCarM + CouplerSlackM / 2.0f), 2));
1285-
CarBehind.FrontAirHoseHeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CouplerDistanceBehindCarM + CouplerSlackM / 2.0f), 2));
1291+
// actual airhose height
1292+
RearAirHoseHeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CarAirHoseHorizontalLengthM + CouplerSlackM), 2));
1293+
CarBehind.FrontAirHoseHeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CarBehind.CarAirHoseHorizontalLengthM + CouplerSlackM), 2));
12861294

12871295
// refererence adjustment heights to rest position
1296+
// If higher then rest position, then +ve adjustment
12881297
if (RearAirHoseHeightAdjustmentM >= rearairhoseheightadjustmentreferenceM)
12891298
{
12901299
RearAirHoseHeightAdjustmentM -= rearairhoseheightadjustmentreferenceM;
12911300
}
1292-
else
1301+
else // if lower then the rest position, then -ve adjustment
12931302
{
1294-
RearAirHoseHeightAdjustmentM = rearairhoseheightadjustmentreferenceM - RearAirHoseHeightAdjustmentM;
1303+
RearAirHoseHeightAdjustmentM = (rearairhoseheightadjustmentreferenceM - RearAirHoseHeightAdjustmentM);
12951304
}
12961305

12971306
if (CarBehind.FrontAirHoseHeightAdjustmentM >= frontairhoseheightadjustmentreferenceM)
@@ -1303,31 +1312,38 @@ public void UpdateTrainDerailmentRisk()
13031312
CarBehind.FrontAirHoseHeightAdjustmentM = frontairhoseheightadjustmentreferenceM - CarBehind.FrontAirHoseHeightAdjustmentM;
13041313
}
13051314

1306-
var rearairhoseangleadjustmentreferenceRad = (float)Math.Cos(CouplerDistanceThisCarM / CarAirHoseLengthM);
1307-
var frontairhoseangleadjustmentreferenceRad = (float)Math.Cos(CouplerDistanceBehindCarM / CarAirHoseLengthM);
1315+
// Calculate angle adjustments
1316+
var rearairhoseangleadjustmentreferenceRad = (float)Math.Asin(CarAirHoseHorizontalLengthM / CarAirHoseLengthM);
1317+
var frontairhoseangleadjustmentreferenceRad = (float)Math.Asin(CarBehind.CarAirHoseHorizontalLengthM / CarAirHoseLengthM);
13081318

1309-
RearAirHoseAngleAdjustmentRad = (float)Math.Cos((CouplerDistanceThisCarM + CouplerSlackM / 2.0f)/ CarAirHoseLengthM);
1310-
CarBehind.FrontAirHoseAngleAdjustmentRad = (float)Math.Cos((CouplerDistanceBehindCarM + CouplerSlackM / 2.0f) / CarAirHoseLengthM);
1319+
RearAirHoseZAngleAdjustmentRad = (float)Math.Asin((CarAirHoseHorizontalLengthM + CouplerSlackM) / CarAirHoseLengthM);
1320+
CarBehind.FrontAirHoseZAngleAdjustmentRad = (float)Math.Asin((CarBehind.CarAirHoseHorizontalLengthM + CouplerSlackM) / CarAirHoseLengthM);
13111321

13121322
// refererence adjustment angles to rest position
1313-
if (RearAirHoseAngleAdjustmentRad >= rearairhoseangleadjustmentreferenceRad)
1323+
if (RearAirHoseZAngleAdjustmentRad >= rearairhoseangleadjustmentreferenceRad)
13141324
{
1315-
RearAirHoseAngleAdjustmentRad -= rearairhoseangleadjustmentreferenceRad;
1325+
RearAirHoseZAngleAdjustmentRad -= rearairhoseangleadjustmentreferenceRad;
13161326
}
13171327
else
13181328
{
1319-
RearAirHoseAngleAdjustmentRad = rearairhoseangleadjustmentreferenceRad - RearAirHoseAngleAdjustmentRad;
1329+
RearAirHoseZAngleAdjustmentRad = (rearairhoseangleadjustmentreferenceRad - RearAirHoseZAngleAdjustmentRad);
13201330
}
13211331

1322-
if (CarBehind.FrontAirHoseAngleAdjustmentRad >= frontairhoseangleadjustmentreferenceRad)
1332+
// The Y axis angle adjustment should be the same as the z axis
1333+
RearAirHoseYAngleAdjustmentRad = RearAirHoseZAngleAdjustmentRad;
1334+
1335+
if (CarBehind.FrontAirHoseZAngleAdjustmentRad >= frontairhoseangleadjustmentreferenceRad)
13231336
{
1324-
CarBehind.FrontAirHoseAngleAdjustmentRad -= frontairhoseangleadjustmentreferenceRad;
1337+
CarBehind.FrontAirHoseZAngleAdjustmentRad -= frontairhoseangleadjustmentreferenceRad;
13251338
}
13261339
else
13271340
{
1328-
CarBehind.FrontAirHoseAngleAdjustmentRad = frontairhoseangleadjustmentreferenceRad - CarBehind.FrontAirHoseAngleAdjustmentRad;
1341+
CarBehind.FrontAirHoseZAngleAdjustmentRad = (frontairhoseangleadjustmentreferenceRad - CarBehind.FrontAirHoseZAngleAdjustmentRad);
13291342
}
13301343

1344+
// The Y axis angle adjustment should be the same as the z axis
1345+
CarBehind.FrontAirHoseYAngleAdjustmentRad = CarBehind.FrontAirHoseZAngleAdjustmentRad;
1346+
13311347
}
13321348

13331349
// Train will derail if lateral forces on the train exceed the vertical forces holding the train on the railway track.

Source/RunActivity/Viewer3D/RollingStock/MSTSWagonViewer.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,11 +1049,12 @@ private void UpdateCouplers(RenderFrame frame, ElapsedTime elapsedTime)
10491049

10501050
var quaternionCar = new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
10511051

1052-
var AirHoseAngleRadians = Car.FrontAirHoseAngleAdjustmentRad;
1052+
var AirHoseYAngleRadians = Car.FrontAirHoseYAngleAdjustmentRad;
1053+
var AirHoseZAngleRadians = Car.FrontAirHoseZAngleAdjustmentRad;
10531054

10541055
AlignCouplerWithCar(Car, FrontAirHoseShape);
10551056

1056-
AdjustAirHoseAngle(Car, FrontAirHoseShape, quaternionCar, AirHoseAngleRadians);
1057+
AdjustAirHoseAngle(Car, FrontAirHoseShape, quaternionCar, AirHoseYAngleRadians, AirHoseZAngleRadians);
10571058

10581059
// Display Animation Shape
10591060
FrontAirHoseShape.PrepareFrame(frame, elapsedTime);
@@ -1113,11 +1114,12 @@ private void UpdateCouplers(RenderFrame frame, ElapsedTime elapsedTime)
11131114

11141115
var quaternionCar = new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
11151116

1116-
var AirHoseAngleRadians = -Car.RearAirHoseAngleAdjustmentRad;
1117+
var AirHoseYAngleRadians = Car.RearAirHoseYAngleAdjustmentRad;
1118+
var AirHoseZAngleRadians = -Car.RearAirHoseZAngleAdjustmentRad;
11171119

11181120
AlignCouplerWithCar(Car, RearAirHoseShape);
11191121

1120-
AdjustAirHoseAngle(Car, RearAirHoseShape, quaternionCar, AirHoseAngleRadians);
1122+
AdjustAirHoseAngle(Car, RearAirHoseShape, quaternionCar, AirHoseYAngleRadians, AirHoseZAngleRadians);
11211123

11221124
// Display Animation Shape
11231125
RearAirHoseShape.PrepareFrame(frame, elapsedTime);
@@ -1230,17 +1232,17 @@ private void AdjustCouplerAngle(TrainCar adjacentCar, AnimatedShape couplerShape
12301232
/// <param name="adjacentCar"></param>
12311233
/// <param name="couplerShape"></param>
12321234
/// <param name="quaternionCar"></param>
1233-
private void AdjustAirHoseAngle(TrainCar adjacentCar, AnimatedShape airhoseShape, Quaternion quaternionCar, float angle)
1235+
private void AdjustAirHoseAngle(TrainCar adjacentCar, AnimatedShape airhoseShape, Quaternion quaternionCar, float angley, float anglez)
12341236
{
1235-
var mRotation = Matrix.CreateRotationZ(angle);
1237+
var zRotation = Matrix.CreateRotationZ(anglez);
12361238

1237-
// Rotate the coupler to align with the calculated angle direction
1238-
airhoseShape.Location.XNAMatrix = mRotation * airhoseShape.Location.XNAMatrix;
1239+
// Rotate the airhose to align with the calculated angle direction
1240+
airhoseShape.Location.XNAMatrix = zRotation * airhoseShape.Location.XNAMatrix;
12391241

1240-
// var mextRotation = Matrix.CreateRotationX(-angle);
1242+
var yRotation = Matrix.CreateRotationY(angley);
12411243

1242-
// Rotate the coupler to align with the calculated angle direction
1243-
// airhoseShape.Location.XNAMatrix = mextRotation * airhoseShape.Location.XNAMatrix;
1244+
// Rotate the airhose to align with the calculated angle direction
1245+
airhoseShape.Location.XNAMatrix = yRotation * airhoseShape.Location.XNAMatrix;
12441246

12451247
}
12461248

0 commit comments

Comments
 (0)