public Tuple3 RemainingBurnVector(ReferenceFrame referenceFrame = null) { if (ReferenceEquals(referenceFrame, null)) { referenceFrame = ReferenceFrame.Orbital(InternalVessel); } return(referenceFrame.DirectionFromWorldSpace(InternalNode.GetBurnVector(InternalNode.patch)).ToTuple()); }
public Tuple3 BurnVector(ReferenceFrame referenceFrame = null) { if (ReferenceEquals(referenceFrame, null)) { referenceFrame = ReferenceFrame.Orbital(InternalVessel); } return(referenceFrame.DirectionFromWorldSpace(WorldBurnVector).ToTuple()); }
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"); }