コード例 #1
0
        public double getAltitude()
        {
            var    box      = Vessel.BoundingBox(refFrame);
            double x        = Math.Abs(box.Item1.Item1 - box.Item2.Item1);
            double y        = Math.Abs(box.Item1.Item2 - box.Item2.Item2);
            double z        = Math.Abs(box.Item1.Item3 - box.Item2.Item3);
            double maxbound = Math.Max(Math.Max(x, y), z) * 0.5;

            return(Flight.SurfaceAltitude - maxbound);
        }
コード例 #2
0
        public static void Land(this Vessel vessel)
        {
            var srfFlight = vessel.Flight(vessel.Orbit.Body.ReferenceFrame);

            while (srfFlight.VerticalSpeed > -2)
            {
                System.Threading.Thread.Sleep(100);
            }

            vessel.Control.SAS    = true;
            vessel.Control.Gear   = true;
            vessel.Control.Brakes = vessel.Orbit.Body.HasAtmosphere;

            while (!(vessel.Control.SASMode == SASMode.Retrograde && vessel.Control.RCS))
            {
                vessel.Control.SASMode = SASMode.Retrograde;
                vessel.Control.RCS     = true;
            }

            bool shouldThrust = false;

            double comOffset        = Math.Abs(vessel.BoundingBox(vessel.ReferenceFrame).Item1.Item2);
            double distanceToGround = vessel.Flight().SurfaceAltitude - comOffset;
            double srfGrav          = vessel.Orbit.Body.SurfaceGravity;

            while (distanceToGround > 0.5)
            {
                double initialSpeedSquared = Math.Pow(srfFlight.Speed, 2);
                float  acc = (float)(((3 + initialSpeedSquared) / (2 * distanceToGround)) + srfGrav);

                float thrustRequired = vessel.Mass * acc;
                float throttle       = thrustRequired / (vessel.AvailableThrust);

                if (throttle > 0.98)
                {
                    shouldThrust = true;
                }
                if (throttle < 0.1)
                {
                    shouldThrust = false;
                }

                if (shouldThrust)
                {
                    vessel.Accelerate(acc);
                }
                vessel.Control.SASMode =
                    srfFlight.Speed < 20 ?
                    SASMode.StabilityAssist : SASMode.Retrograde;

                comOffset        = Math.Abs(vessel.BoundingBox(vessel.ReferenceFrame).Item1.Item2);
                distanceToGround = vessel.Flight().SurfaceAltitude - comOffset;
            }

            while (!(vessel.Situation == VesselSituation.Landed ||
                     vessel.Situation == VesselSituation.Splashed))
            {
                vessel.Accelerate(1);
            }
            vessel.Accelerate(0);
        }