/// <summary> /// Circularize around Moon /// - currently only onRails is implemented /// </summary> private void CircularizeAroundMoon() { // check ship is on segment where it near Moon if (onRails) { KeplerSequence keplerSeq = spaceship.GetComponent <KeplerSequence>(); OrbitUniversal orbitU = keplerSeq.GetCurrentOrbit(); if (orbitU.centerNbody == moonBody) { // in orbit around the moon - do circularization OrbitData orbitData = new OrbitData(orbitU); OrbitTransfer circularizeXfer = new CircularizeXfer(orbitData); keplerSeq.RemoveFutureSegments(); keplerSeq.AddManeuvers(circularizeXfer.GetManeuvers()); } } else { // assume we're in orbit around the moon OrbitData orbitData = new OrbitData(); orbitData.SetOrbitForVelocity(spaceship, moonBody); OrbitTransfer circularizeXfer = new CircularizeXfer(orbitData); ge.AddManeuvers(circularizeXfer.GetManeuvers()); } }
// Update is called once per frame void Update() { if (Input.GetKeyUp(KeyCode.C)) { OrbitData currentOrbit = new OrbitData(); currentOrbit.SetOrbitForVelocity(shipNbody, centerNbody); // circularize the orbit OrbitTransfer t = new CircularizeXfer(currentOrbit); // If this is a ship with a Kepler sequence take the maneuvers and add them as KeplerSequence elements // This allows the transfer to be time-reversible if the whole scene is on rails. if (keplerSeq != null) { keplerSeq.AddManeuvers(t.GetManeuvers()); } else { // Nbody evolution (or plain onRails w/o KeplerSequence) use maneuvers GravityEngine.Instance().AddManeuver(t.GetManeuvers()[0]); } } else if (Input.GetKeyDown(KeyCode.R)) { // return orbit to GravityEngine control (go Off-Rails) if (keplerSeq != null) { keplerSeq.AppendReturnToGE(GravityEngine.Instance().GetPhysicalTime(), shipNbody); } } else if (Input.GetKeyDown(KeyCode.W)) { // return orbit to GravityEngine control (go Off-Rails) GravityEngine.Instance().ApplyImpulse(shipNbody, Vector3.up); } }