示例#1
0
        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);
            }
        }