/// <summary> /// Calculates the total forces on the airframe. /// </summary> /// <param name="elapsedTime"></param> private void CalculateForces(float elapsedTime, Vector3 wind) { if (ApiModel.CalculateForces(elapsedTime, wind)) { return; } Lift = GetLiftForce(wind); Drag = GetDragForce(wind); double sideLift = GetSideLiftForce(wind); double sideDrag = GetSideDragForce(wind); double sideGroundResistance = 0; double groundResistance = 0; // verified : gravity, liftX, throttle, liftZ if (TouchedDown) { if ((ApiModel.Vx < 10f) && (ApiModel.Vx > 0.01)) { double realBeta = -Math.Atan2(ApiModel.Vy, ApiModel.Vx); sideGroundResistance = Math.Sin(realBeta) * gravityMass; } groundResistance = ApiModel.Vx / 10.0; } ApiModel.Fx = (float)(+sideLift * Math.Sin(ApiModel.Beta) - sideDrag * Math.Cos(ApiModel.Beta) - Lift * Math.Sin(ApiModel.Alpha) - Drag * Math.Cos(ApiModel.Alpha) + AircraftParameters.MaximumThrust * Throttle * AircraftParameters.GetThrustCoefficient((double)ApiModel.Vx) - gravityMass * Math.Sin(ApiModel.Pitch) - groundResistance); ApiModel.Fy = (float)(+sideLift * Math.Cos(ApiModel.Beta) + sideDrag * Math.Sin(ApiModel.Beta) + gravityMass * Math.Sin(ApiModel.Roll) * Math.Cos(ApiModel.Pitch) + sideGroundResistance); ApiModel.Fz = (float)(-Lift * Math.Cos(ApiModel.Alpha) - Drag * Math.Sin(ApiModel.Alpha) + gravityMass * Math.Cos(ApiModel.Roll) * Math.Cos(ApiModel.Pitch)); }