Frequently Asked Question

How do I get the position and/or velocity of a ship/body?

The current state of a body in a GECore is retreived by GECore.StateById() with signature:

ge.StateById(bodyId, ref shipState);

Here shipState is an instance of a struct that holds the position, velocity and current time (all in world units). bodyId is the id assigned to the body when added to the GECore. If the body is a GSBody added by a GSController this can be retrived using GSBody.Id().

If only the position is required use:

    public double3 RWorldById(int id)

    public struct GEBodyState {
        public double3 r;
        public double3 v;
        public double t;
        ...
    }

Note that StateById has some additional arguments to allow retreival of internal GE units and to manage co-rotating frames, but these are not commonly used.

The state retrieved by StateById is a global state. If a ship is orbiting a moon that is moving this velocity will be included in the state that is returned. It is often useful to get a state of a body relative to the body it is orbiting. In this case the API to use is:

    public bool RelativeState(int bodyId, int centerId, ref GEBodyState bodyState, bool geUnits = false)

in which the state relative the body indicated by centerId is returned.

How do I change the position and/or velocity of a ship body.

The state of a body can be set by creating a GEBodyState (see above) and then using GECore.StateSetById.

How do I change the size/shape of an orbit?

The GSBody component has mode in the Initial Data section named Input Mode. Select COE (Classical Orbital Elements). These describe the size, shape and orientation of the orbit as well as the initial location on the body of the orbit. See Orbits.

Changing the orbit in real-time is usually done by a maneuver (changing the velocity at the current position). This is described further in Changing Orbits.

“Live” orbit changes without maneuvering are demonstrated in the scene InteractiveOrbit.

How do I get the orbital elements of a body?

The classical orbital elements of a body with respect to a the body it is orbiting can be retreived by GECore.COE()

        /// <summary>
        /// Get the classical orbital elements (COE) for the indicated body with respect to the center body.
        ///
        /// The most common way to do this is to take the R, V state of the body and use an algorithm (RVtoCOE)
        /// to determine the COE elements. This algorithm imposes a choice of when an orbit is to be considered
        /// flat or circular.
        ///
        /// A flat orbit (i=0) has it's OmegaU/RAAN set to 0.
        /// A circular orbit has it's argp set to zero (this is the reference point for the phase, nu).
        ///
        /// Of course the zero detect is not exactly zero, so there will be some threshold (usually E-6) where e.g.
        /// an orbit can transition from flat to non-flat. When this happens the argp and phase may have a discontinuity
        /// (athough their sum will remain constant). 
        ///
        /// </summary>
        /// <param name="bodyId"></param>
        /// <param name="centerId"></param>
        /// <param name="usePropCOE">If propagator has internal COE, use that instead of recomputing from R, V</param>
        /// <returns></returns>
        public Orbital.COE COE(int bodyId, int centerId, bool usePropCOE = true)

This returns a class Orbital.COE. See Orbits.