コード例 #1
0
ファイル: AutoPilot.cs プロジェクト: BlackBreezeCastle/krpc
        Vector3d SASTargetDirection()
        {
            var vessel  = InternalVessel;
            var sasMode = SASMode;

            // Stability assist
            if (sasMode == SASMode.StabilityAssist)
            {
                throw new InvalidOperationException("No target direction in stability assist mode");
            }

            // Maneuver node
            if (sasMode == SASMode.Maneuver)
            {
                if (vessel.patchedConicSolver.maneuverNodes.Count == 0)
                {
                    throw new InvalidOperationException("No maneuver node");
                }
                var nextNode = vessel.patchedConicSolver.maneuverNodes [0];
                foreach (var node in vessel.patchedConicSolver.maneuverNodes)
                {
                    if (node.UT < nextNode.UT)
                    {
                        nextNode = node;
                    }
                }
                return(new Node(vessel, nextNode).WorldBurnVector);
            }

            // Orbital directions, in different speed modes
            if (sasMode == SASMode.Prograde || sasMode == SASMode.Retrograde ||
                sasMode == SASMode.Normal || sasMode == SASMode.AntiNormal ||
                sasMode == SASMode.Radial || sasMode == SASMode.AntiRadial)
            {
                if (Control.GlobalSpeedMode == SpeedMode.Orbit)
                {
                    switch (sasMode)
                    {
                    case SASMode.Prograde:
                        return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.up));

                    case SASMode.Retrograde:
                        return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.down));

                    case SASMode.Normal:
                        return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.forward));

                    case SASMode.AntiNormal:
                        return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.back));

                    case SASMode.Radial:
                        return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.left));

                    case SASMode.AntiRadial:
                        return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.right));
                    }
                }
                else if (Control.GlobalSpeedMode == SpeedMode.Surface)
                {
                    switch (sasMode)
                    {
                    case SASMode.Prograde:
                        return(ReferenceFrame.SurfaceVelocity(vessel).DirectionToWorldSpace(Vector3d.up));

                    case SASMode.Retrograde:
                        return(ReferenceFrame.SurfaceVelocity(vessel).DirectionToWorldSpace(Vector3d.down));

                    case SASMode.Normal:
                        return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.up));

                    case SASMode.AntiNormal:
                        return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.down));

                    case SASMode.Radial:
                        return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.right));

                    case SASMode.AntiRadial:
                        return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.left));
                    }
                }
                else if (Control.GlobalSpeedMode == SpeedMode.Target)
                {
                    switch (sasMode)
                    {
                    case SASMode.Prograde:
                        return(vessel.GetWorldVelocity() - FlightGlobals.fetch.VesselTarget.GetWorldVelocity());

                    case SASMode.Retrograde:
                        return(FlightGlobals.fetch.VesselTarget.GetWorldVelocity() - vessel.GetWorldVelocity());

                    case SASMode.Normal:
                        return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.up));

                    case SASMode.AntiNormal:
                        return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.down));

                    case SASMode.Radial:
                        return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.right));

                    case SASMode.AntiRadial:
                        return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.left));
                    }
                }
                throw new InvalidOperationException("Unknown speed mode for orbital direction");
            }

            // Target and anti-target
            if (sasMode == SASMode.Target || sasMode == SASMode.AntiTarget)
            {
                var target = FlightGlobals.fetch.VesselTarget;
                if (target == null)
                {
                    throw new InvalidOperationException("No target");
                }
                var direction = target.GetWorldPosition() - vessel.GetWorldPos3D();
                if (sasMode == SASMode.AntiTarget)
                {
                    direction *= -1;
                }
                return(direction);
            }

            throw new InvalidOperationException("Unknown SAS mode");
        }