public void FixedUpdate() { if (aerodynamicModel_ != null && vessel_ != null) { CelestialBody body = vessel_.orbit.referenceBody; Vector3d bodySpacePosition = vessel_.GetWorldPos3D() - body.position; Vector3d bodySpaceVelocity = vessel_.obt_velocity; double altitudeAboveSea = bodySpacePosition.magnitude - body.Radius; Vector3d airVelocity = bodySpaceVelocity - body.getRFrmVel(body.position + bodySpacePosition); #if DEBUG_COMPARE_FORCES Vector3d FARForce = FARBasicDragModel.debugForceAccumulator + FARWingAerodynamicModel.debugForceAccumulator; FARBasicDragModel.debugForceAccumulator = new Vector3d(0, 0, 0); FARWingAerodynamicModel.debugForceAccumulator = new Vector3d(0, 0, 0); double rho = FARAeroUtil.GetCurrentDensity(body, altitudeAboveSea); //double rho = vessel_.atmDensity; //double pressure = FlightGlobals.getStaticPressure(altitudeAboveSea, body); //double rho = FlightGlobals.getAtmDensity(pressure); double machNumber = FARAeroUtil.GetMachNumber(body, altitudeAboveSea, airVelocity); //double machNumber = airVelocity.magnitude / 300.0; Transform vesselTransform = vessel_.ReferenceTransform; Vector3d vesselBackward = (Vector3d)(-vesselTransform.up.normalized); Vector3d vesselForward = -vesselBackward; Vector3d vesselUp = (Vector3d)(-vesselTransform.forward.normalized); Vector3d vesselRight = Vector3d.Cross(vesselUp, vesselBackward).normalized; double AoA = Math.Acos(Vector3d.Dot(airVelocity.normalized, vesselForward.normalized)); if (Vector3d.Dot(airVelocity, vesselUp) > 0) { AoA = -AoA; } Vector3d predictedForce = aerodynamicModel_.computeForces_FAR(rho, machNumber, airVelocity, vesselUp, AoA, 0.05); aerodynamicModel_.Verbose = true; Vector3d predictedForceWithCache = aerodynamicModel_.computeForces(body, bodySpacePosition, airVelocity, AoA, 0.05); aerodynamicModel_.Verbose = false; Vector3d localFARForce = new Vector3d(Vector3d.Dot(FARForce, vesselRight), Vector3d.Dot(FARForce, vesselUp), Vector3d.Dot(FARForce, vesselBackward)); Vector3d localPredictedForce = new Vector3d(Vector3d.Dot(predictedForce, vesselRight), Vector3d.Dot(predictedForce, vesselUp), Vector3d.Dot(predictedForce, vesselBackward)); Vector3d localPredictedForceWithCache = new Vector3d(Vector3d.Dot(predictedForceWithCache, vesselRight), Vector3d.Dot(predictedForceWithCache, vesselUp), Vector3d.Dot(predictedForceWithCache, vesselBackward)); Util.PostSingleScreenMessage("FAR/predict comparison", "air vel=" + Math.Floor(airVelocity.magnitude) + ", AoA=" + (AoA * 180.0 / Math.PI) + ", FAR force=" + localFARForce + ", predicted force=" + localPredictedForce); Util.PostSingleScreenMessage("predict with cache", "predicted force with cache=" + localPredictedForceWithCache); #endif double approximateRho = StockAeroUtil.GetDensity(altitudeAboveSea, body); double preciseRho = StockAeroUtil.GetDensity(vessel_.GetWorldPos3D(), body); double actualRho = vessel_.atmDensity; Util.PostSingleScreenMessage("rho info", "preciseRho=" + preciseRho.ToString("0.0000") + " ; approximateRho=" + approximateRho.ToString("0.0000") + " ; actualRho=" + actualRho.ToString("0.0000")); } }
public double GetMachNumber(CelestialBody body, double altitude, Vector3d velocity) { if (HighLogic.LoadedSceneIsFlight) { if (FARControl != null) { return(FARControl.MachNumber); } else { return(FARAeroUtil.GetMachNumber(body, altitude, velocity)); } } else { print("GetMachNumber called in editor"); return(0); } }
public double GetMachNumber(CelestialBody body, double altitude, Vector3d velocity) { if (start != StartState.Editor) { if (FARControl != null) { return(FARControl.MachNumber); } else { return(FARAeroUtil.GetMachNumber(body, altitude, velocity)); } } else { print("GetMachNumber called in editor"); return(0); } }