public void HandleOrbitalTransition(OrbitalSystem target, bool enteringOrbit) { if (enteringOrbit) { if (target == null) return; Destination = null; //mOrbitElevation = (target.GetBody().transform.position - SpaceCraft.transform.position).magnitude; OrbitElevation = (target.mSimulationRadius / 2) + Math.Max(target.mSimulationRadius * 0.1f, 1.3f); Orbit = target; Vector3 dirv = Vector3.Normalize(Orbit.Root.transform.position * -1.0f); SpaceCraft.transform.position = Orbit.Root.transform.position + (dirv * OrbitElevation); SpaceCraft.transform.LookAt(Orbit.Root.transform.position + Orbit.LastRelativeMove, Orbit.Root.transform.up); float tp = (float)(2.0f * Math.PI); // compute matching velocity from spin rate float circumference = tp * Orbit.mSimulationRadius; float velRat = Orbit.Spin / tp; Velocity = circumference * velRat; float x = SpaceCraft.transform.position.x - Orbit.Root.transform.position.x; float y = SpaceCraft.transform.position.x - Orbit.Root.transform.position.x; float dp = Vector2.Dot(new Vector2(1, 0), new Vector2(x, y)); mLastOrbitAngle = (float)Math.Acos(dp / (x * y)); SpeechToText.Speak("now orbiting " + Orbit.GetName()); SolarSystem.PoseController.transform.LookAt(Orbit.Body.transform.position + Orbit.LastRelativeMove, Orbit.Root.transform.up); mObject = target; } else { if (Orbit == null) return; Vector3 crv = OrbitalSystem.OrbitRotationVector(ref mLastOrbitAngle, Orbit.mSimulationRadius, 0, OrbitElevation); Vector3 dvPc = Vector3.Normalize(crv); Vector3 up = Orbit.Body.transform.up; Vector3 vv = Vector3.Cross(up, dvPc); SpaceCraft.transform.forward = vv; //SpaceCraft.transform.LookAt(mOrbit.GetBody().transform.position + mOrbit.LastAbsoluteDisplacement); // convert velocity to orbited bodies rotation //SolarSystem.PoseController.Transform.position = SpaceCraft.transform.position; //SolarSystem.PoseController.Transform.rotation = SpaceCraft.transform.rotation; float scaler = (Orbit.Radius / 160) * (Orbit.SimulationRadius / 64); Velocity = Orbit.SumOfAbsoluteDisplacementDistance * scaler; string theName = Orbit.GetName(); Orbit = null; SpeechToText.Speak("leaving orbit of " + theName); } }