public bool GravityTurn(double ApA_offset, double gturn_curve, double dist2vel, double Dtol) { UpdateTargetPosition(); VSL.Engines.ActivateNextStageOnFlameout(); dApA = TargetR-VesselOrbit.ApR; var vel = Vector3d.zero; var cApV = VesselOrbit.getRelativePositionAtUT(VSL.Physics.UT+VesselOrbit.timeToAp); var hv = Vector3d.Exclude(VesselOrbit.pos, target-VesselOrbit.pos).normalized; var arc = Utils.ProjectionAngle(cApV, target, hv)*Mathf.Deg2Rad*cApV.magnitude; ErrorThreshold.Value = CorrectOnlyAltitude? dApA : dApA+arc; ApoapsisReached |= dApA < Dtol; THR.CorrectThrottle = ApoapsisReached; if(!ErrorThreshold) { var startF = Utils.Clamp((VSL.Altitude.Absolute-GravityTurnStart)/GLB.ORB.GTurnOffset, 0, 1); if(dApA > Dtol) vel += CorrectOnlyAltitude && ApoapsisReached? VesselOrbit.vel.normalized.xzy*dApA : VSL.Physics.Up.xzy*dApA*gturn_curve; if(arc > Dtol && (!ApoapsisReached || !CorrectOnlyAltitude)) { var hvel = Utils.ClampL(arc-dApA*gturn_curve, 0)*startF; if(Body.atmosphere) hvel *= Math.Sqrt(Utils.Clamp(VSL.Altitude.Absolute/Body.atmosphereDepth, 0, 1)); vel += hv*hvel; } vel *= VSL.Physics.StG/Utils.G0*dist2vel; if(!vel.IsZero()) { var norm = VesselOrbit.GetOrbitNormal(); var dFi = (90-Vector3d.Angle(norm, target))*Mathf.Deg2Rad; vel += norm*Math.Sin(dFi)*vel.magnitude*startF *Utils.Clamp(VSL.VerticalSpeed.Absolute/VSL.Physics.G-MinClimbTime, 0, 100) *Utils.ClampL(Vector3d.Dot(hv, VesselOrbit.vel.normalized), 0); } vel = vel.xzy; CircularizationOffset = -1; if(Executor.Execute(vel, Utils.Clamp(1-VSL.Torque.MaxCurrent.AA_rad, 0.1f, 1))) { if(CFG.AT.Not(Attitude.KillRotation)) { CFG.BR.OnIfNot(BearingMode.Auto); BRC.ForwardDirection = hv.xzy; } Status("Gravity turn..."); return true; } } Status("Coasting..."); CFG.BR.OffIfOn(BearingMode.Auto); CFG.AT.OnIfNot(Attitude.KillRotation); THR.Throttle = 0; if(CircularizationOffset < 0) { ApAUT = VSL.Physics.UT+VesselOrbit.timeToAp; CircularizationOffset = VSL.Engines.TTB((float)TrajectoryCalculator.dV4C(VesselOrbit, hV(ApAUT), ApAUT).magnitude)/2; } return VesselOrbit.timeToAp > ApA_offset+CircularizationOffset && Body.atmosphere && VesselOrbit.radius < Body.Radius+Body.atmosphereDepth; }
protected bool coast(Vector3d pg_vel) { Status("Coasting..."); CFG.BR.OffIfOn(BearingMode.Auto); CFG.AT.OnIfNot(Attitude.Custom); ATC.SetThrustDirW(-pg_vel.xzy); THR.Throttle = 0; if (CircularizationOffset < 0) { ApAUT = VSL.Physics.UT + VesselOrbit.timeToAp; CircularizationOffset = VSL.Engines.TTB_Precise((float)TrajectoryCalculator.dV4C(VesselOrbit, hV(ApAUT), ApAUT).magnitude) / 2; } return(VesselOrbit.timeToAp > TimeToApA + CircularizationOffset && Body.atmosphere && VesselOrbit.radius < Body.Radius + Body.atmosphereDepth); }