

Field Dynamics
Initial Birkeland Current Implementation 2017
Argos GPU VR Field Explorer – Interactive
Dynamic Symmetry
Planet Orbit Solver – Runge-Kutta
using UnityEngine;
using System.Collections;
public class PlanetaryOrbit : MonoBehaviour
{
public float[] Par { get; set; } //eccentricity , r_pericenter, orbital period, radius, axial tilt, rot pediod longtitude of ascending node
private float[] CosSinOmega = new float[2];
public float OP { get; private set; } //orbital period
public float RP { get; private set; } // rotation period
public float GetVelMagnitude ()
{
return ParametricVelocity ().magnitude * Scales.velmu2kms;
}
private const int N = 300;
private float[] angleArray = new float[N];
private float surface;
private float k;
private float orbitDt;
private HMD_Ctrl_Tracking hmd_Ctrl_Tracking;
public GameObject myNavSphere;
public int myIdx = 0;
public string planet_Name;
public bool bThis_is_The_Sun = false;
public float Theta
{
get { return Theta_Time(time); }
}
public float time;
Solar_System_Base solar_System_Base;
void Start ()
{
solar_System_Base = Solar_System_Base.instance;
hmd_Ctrl_Tracking = HMD_Ctrl_Tracking.Instance;
}
public void Set_MyNav_Sphere(GameObject navSphere)
{
myNavSphere = navSphere;
}
public void Init(int idx)
{
if (!bThis_is_The_Sun)
{
myIdx = idx;
OP = Par[2] * Scales.y2tmu;
RP = Par[5] * Scales.y2tmu;
//float rSemiMajor = transform.localPosition.x;
//Par[1] = rSemiMajor - Par[0] * rSemiMajor;
surface = Mathf.Sqrt(-(1 + Par[0]) / Mathf.Pow(-1 + Par[0], 3)) * Mathf.PI * Par[1] * Par[1];
k = 2 * surface / (Mathf.Pow(1 + Par[0], 2) * OP * Par[1] * Par[1]);
orbitDt = OP / (2 * (N - 1));
ThetaRunge();
time = 0;// Random.Range(0, OP);
CosSinOmega[0] = Mathf.Cos(Par[6]);
CosSinOmega[1] = Mathf.Sin(Par[6]);
GetComponent<PlanetRotation>().Init(this);
GetComponentInParent<Plane_of_Inclination>().Set_Plane_of_Inclination(Par[7], Par[6]);
}
}
public void Reset_Time()
{
if (!bThis_is_The_Sun)
{
time = 0;
transform.localPosition = ParametricOrbit(Theta_Time(time)) * solar_System_Base.scale_Solar_System_0_to_5;
myNavSphere.transform.position = transform.position;
}
}
void FixedUpdate ()
{
if (!bThis_is_The_Sun)
{
if (solar_System_Base.bRunning)
{
time += Time.deltaTime * solar_System_Base.years_Per_Second_SS;
transform.localPosition = ParametricOrbit(Theta_Time(time)) * solar_System_Base.scale_Solar_System_0_to_5;
myNavSphere.transform.position = transform.position;
}
}
}
public Vector3 Planetary_Parametric(float arg)
{
return ParametricOrbit(Theta_Time(arg));
}
public void Update_Planet_Position()
{
solar_System_Base = Solar_System_Base.instance;
if (!bThis_is_The_Sun)
{
transform.localPosition = ParametricOrbit(Theta_Time(time)) * solar_System_Base.scale_Solar_System_0_to_5;
myNavSphere.transform.position = transform.position;
}
}
public Vector3 GetPositionAfterTime (float t)
{
return ParametricOrbit (Theta_Time(time + t));
}
public Vector3 ParametricOrbit (float th)
{
float Cost = Mathf.Cos (th);
float Sint = Mathf.Sin (th);
float x = (Par [1] * (1 + Par [0])) / (1 + Par [0] * Cost) * Cost;
float z = (Par [1] * (1 + Par [0])) / (1 + Par [0] * Cost) * Sint;
float xp = CosSinOmega [0] * x - CosSinOmega [1] * z;
float yp = CosSinOmega [1] * x + CosSinOmega [0] * z;
return new Vector3 (xp, 0f, yp);
}
private float dthdt (float th)
{
return k * Mathf.Pow ((1 + Par [0] * Mathf.Cos (th)), 2);
}
private void ThetaRecurrence ()
{
angleArray [0] = 0; //Initial conditionL theta(0) = 0
for (int i = 0; i < N - 2; i++)
angleArray [i + 1] = orbitDt * dthdt (angleArray [i]) + angleArray [i];
angleArray [N - 1] = Mathf.PI;
}
private void ThetaRunge ()
{
float w = 0, k1, k2, k3, k4;
for (int i = 0; i < N - 2; i++)
{
k1 = orbitDt * dthdt (w);
k2 = orbitDt * dthdt (w + k1 / 2);
k3 = orbitDt * dthdt (w + k2 / 2);
k4 = orbitDt * dthdt (w + k3);
w = w + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
angleArray [i + 1] = w;
}
angleArray [N - 1] = Mathf.PI;
}
public float Theta_Time (float t)
{
float theta0 = 0;
t = t % OP;//Orbital Period
if (t <= OP / 2)
{
float d = t / orbitDt;
float d0 = Mathf.Clamp (Mathf.Floor (d), 0, N - 1);
float d1 = Mathf.Clamp (Mathf.Ceil (d), 0, N - 1);
if (d0 == d1)
theta0 = angleArray [(int)d0];
else
{
theta0 = (angleArray [(int)d0] - angleArray [(int)d1]) / (d0 - d1) * d + (d0 * angleArray [(int)d1] - angleArray [(int)d0] * d1) / (d0 - d1);
}
return theta0;
}
else
{
t = -t + OP;
float d = t / orbitDt;
float d0 = Mathf.Clamp (Mathf.Floor (d), 0, N - 1);
float d1 = Mathf.Clamp (Mathf.Ceil (d), 0, N - 1);
if (d0 == d1)
theta0 = -angleArray [(int)d0] + 2 * Mathf.PI;
else
{
theta0 = -((angleArray [(int)d0] - angleArray [(int)d1]) / (d0 - d1) * d + (d0 * angleArray [(int)d1] - angleArray [(int)d0] * d1) / (d0 - d1)) + 2 * Mathf.PI;
}
return theta0;
}
}
public Vector3 ParametricVelocity ()
{
float myfixedDt = 2 * orbitDt;
Vector3 pos2 = ParametricOrbit (Theta_Time(time + myfixedDt));
Vector3 pos1 = ParametricOrbit (Theta_Time(time - myfixedDt));
return new Vector3 ((pos2.x - pos1.x) / (2 * myfixedDt), 0.0f, (pos2.z - pos1.z) / (2 * myfixedDt));
}
}
Helical Path Calculation
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ProceduralToolkit;
public class Helical_Plot : MonoBehaviour
{
//[SerializeField]
// Material _material;
public enum PLANET
{
hp_Mercury,
hp_Venus,
hp_Earth,
hp_Mars,
hp_Jupiter,
hp_Saturn,
hp_Uranus,
hp_Neptune,
hp_Pluto,
}
public int[] hp_AUX_cnt = new int[] { 700, 500, 500, 400, 88, 70, 5, 3, 2,1};
Mesh myMesh;
public float tweek_Rota = 0.0f;
//MaterialPropertyBlock _block;
private Solar_System_Base solar_System_Base;
private ArgosMeshDraft amd;
private ArgosMeshDraft amd_Aux;
public GameObject myPlane;
private PlanetaryOrbit myOrbit;
public float width = 1f;
private Color orbitColor;
public int myIdx = 0;
public GameObject aux_Helical_PREFAB;
private GameObject[] aux_Helical_Extensions;
private Extension_AMD_Handler ext_AMD_Handler;
void Start()
{
amd = new ArgosMeshDraft();
amd_Aux = new ArgosMeshDraft();
myOrbit = myPlane.GetComponentInChildren<PlanetaryOrbit>();
solar_System_Base = Solar_System_Base.instance;
orbitColor = myPlane.GetComponent<Orbit_VU>().orbitColor;
setColor(orbitColor);
GetComponent<Plane_of_Inclination>().Set_Plane_of_Inclination(myOrbit.Par[7], myOrbit.Par[6]);
myMesh = GetComponent<MeshFilter>().mesh;
}
public void Set_My_Idx_Add_Extensions(int idx)
{
myIdx = idx;
if (aux_Helical_Extensions == null)
{
aux_Helical_Extensions = new GameObject[hp_AUX_cnt[myIdx]];
for (int i = 0; i < hp_AUX_cnt[myIdx]; i++)
{
aux_Helical_Extensions[i] = Instantiate(aux_Helical_PREFAB, transform);
ext_AMD_Handler = aux_Helical_Extensions[i].GetComponent<Extension_AMD_Handler>();
ext_AMD_Handler.Init_Aux();
ext_AMD_Handler.Set_Color(orbitColor);
aux_Helical_Extensions[i].GetComponent<MeshRenderer>().enabled = false;
}
}
}
public void Generate_Helix(int divisions, float time_Frame, float linear_velocity, float helical_Period, float helix_Radius, float line_width, bool bPluto_Exclusive)
{
if (amd != null)
{
amd.Clear();
}
if (amd_Aux != null)
{
amd_Aux.Clear();
}
//if(myIdx == 8)//Pluto - better angular resolution
//{
// divisions *= 3;
//}
if (!bPluto_Exclusive)
{
GetComponent<MeshRenderer>().enabled = true;
MeshRenderer[] mr = GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer MR in mr)
{
MR.enabled = true;
}
}
else
{
if (myIdx != 8) return;
}
Vector3 vUP_trans = transform.InverseTransformDirection(Vector3.up);
Vector3 vHelix_Origin_Trans = transform.InverseTransformDirection(Vector3.right) * helix_Radius;
List<Vector3> vInner = new List<Vector3>();
List<Vector3> vOuter = new List<Vector3>();
List<Vector3> vInner_Aux = new List<Vector3>();
List<Vector3> vOuter_Aux = new List<Vector3>();
float cycles = time_Frame / myOrbit.OP;
float quadDivs = divisions * cycles;//180 * cycles;
int totalQuads = (int)quadDivs;
float totDistance = time_Frame * linear_velocity;
float deltaDIST = totDistance / totalQuads;
float accDIST = 0;
int useQuads = totalQuads;
bool bFlipper = false;
int ext_COUNT = 0;
if (totalQuads > 70 * divisions)
{
useQuads = 70 * divisions;
ext_COUNT = (int)Mathf.Floor(((float)totalQuads / (float)useQuads))-1;
if (ext_COUNT > hp_AUX_cnt[myIdx]) ext_COUNT = hp_AUX_cnt[myIdx];
if(myIdx == 0)
{
ARGOS_TRACE.Instance.Mark("MERCURY ext_Count = " + ext_COUNT.ToString());
print("MERCURY ext_Count = " + ext_COUNT.ToString());
}
for (int i = 0; i < ext_COUNT; i++)
{
aux_Helical_Extensions[i].GetComponent<MeshRenderer>().enabled = true;
aux_Helical_Extensions[i].GetComponent<Extension_AMD_Handler>().Set_Color(orbitColor);
}
for(int j = ext_COUNT; j<hp_AUX_cnt[myIdx]; j++)
{
aux_Helical_Extensions[j].GetComponent<MeshRenderer>().enabled = false;
}
}
else
{
for (int i = 0; i < hp_AUX_cnt[myIdx]; i++)
{
aux_Helical_Extensions[i].GetComponent<MeshRenderer>().enabled = false;
}
}
float delt_OP_ANGLE = 360 / divisions;
float acc_OP_ANGLE = 0;
float delt_Time_OP = myOrbit.OP / divisions;
float acc_Time_OP = 0;
float hp = helical_Period;
float delt_HP_ANGLE = delt_OP_ANGLE * myOrbit.OP / helical_Period;
float acc_HP_ANGLE = 0;
float delta_Theta_Helical = delt_HP_ANGLE * (useQuads-1);
float delta_Dist_Helical = deltaDIST * (useQuads-1);
Vector3 vNorm;
float w_by_2 = line_width / 2;
Vector3 vPathWay;
Vector3 vAxis = Vector3.zero;
//print("Total Slices" + totalSlices.ToString("F2"));
float deg_to_rad = Mathf.PI / 180;
int total_AUX_Quads = 0;
Vector3 vRight_H_Start;
Vector3 vRight_H_Trans_Start;
Vector3 vOrbit_Center_Start;
float vAccDist_Start = 0;
float acc_HP_Ang_Start = 0;
Vector3 vRight_H_End;
Vector3 vRight_H_Trans_End;
Vector3 vOrbit_Center_End;
float vAccDist_End = 0;
float acc_HP_Ang_End = 0;
for (int i = 0; i < useQuads; i++)
{
Vector3 vRight_H = new Vector3(Mathf.Cos(acc_HP_ANGLE * deg_to_rad), 0, Mathf.Sin(acc_HP_ANGLE * deg_to_rad));
Vector3 vRight_H_Trans = transform.InverseTransformDirection(vRight_H);
//Vector3 vForward_O = new Vector3(-Mathf.Sin(acc_OP_ANGLE * deg_to_rad), 0, Mathf.Cos(acc_OP_ANGLE * deg_to_rad));
Vector3 vOrbit_Center = vHelix_Origin_Trans - vRight_H_Trans * helix_Radius;//CHECK THIS
//Vector3 vOrbit = myOrbit.ParametricOrbit(acc_OP_ANGLE * deg_to_rad) * solar_System_Base.scale_Solar_System_0_to_5;
Vector3 vOrbit = myOrbit.ParametricOrbit(myOrbit.Theta_Time(acc_Time_OP)) * solar_System_Base.scale_Solar_System_0_to_5;
float theta_0 = Mathf.Atan2(vOrbit.z, vOrbit.x);
float theta_full = theta_0 + acc_HP_ANGLE * deg_to_rad;
float vOrbitMag = vOrbit.magnitude;
Vector3 vOrbitTrans = new Vector3(Mathf.Cos(theta_full), 0, Mathf.Sin(theta_full));
Vector3 orbit_v = vOrbitMag * vOrbitTrans + vOrbit_Center;
vPathWay = orbit_v + accDIST * vUP_trans;
vOrbit_Center += accDIST * vUP_trans;
vNorm = (vPathWay - vOrbit_Center).normalized;
if(i==0)
{
vRight_H_Start = vRight_H;
vRight_H_Trans_Start = vRight_H_Trans;
vOrbit_Center_Start = vOrbit_Center;
vAccDist_Start = accDIST;
acc_HP_Ang_Start = acc_HP_ANGLE;
}
if (i == (useQuads-1))
{
vRight_H_End = vRight_H;
vRight_H_Trans_End = vRight_H_Trans;
vOrbit_Center_End = vOrbit_Center;
vAccDist_End = accDIST;
acc_HP_Ang_End = acc_HP_ANGLE;
}
vInner.Add(vPathWay - w_by_2 * vNorm);
vOuter.Add(vPathWay + w_by_2 * vNorm);
bFlipper = !bFlipper;
if (bFlipper)
{
vInner_Aux.Add(vPathWay - w_by_2 * vNorm);
vOuter_Aux.Add(vPathWay + w_by_2 * vNorm);
total_AUX_Quads++;
}
acc_OP_ANGLE += delt_OP_ANGLE;
acc_HP_ANGLE += delt_HP_ANGLE;
acc_Time_OP += delt_Time_OP;
//float delt_Time_OP = myOrbit.OP / divisions;
//float acc_Time_OP = 0;
accDIST += deltaDIST;
}
if (totalQuads > 2)
{
amd.Add(MeshDraft.Band_Arc(vInner, vOuter));
GetComponent<MeshFilter>().mesh = amd.ToMeshInternal();
if (total_AUX_Quads > 2)
{
amd_Aux.Add(MeshDraft.Band_Arc(vInner_Aux, vOuter_Aux));
}
}
//EXTENSIONS
Vector3 v = new Vector3(10, 0, 0);
delta_Theta_Helical = acc_HP_Ang_End - acc_HP_Ang_Start;
delta_Dist_Helical = vAccDist_End - vAccDist_Start;
acc_HP_ANGLE = delta_Theta_Helical;
accDIST = delta_Dist_Helical;
GameObject go;
for (int i = 0; i < ext_COUNT; i++)
{
Vector3 vRight_H = new Vector3(Mathf.Cos(acc_HP_ANGLE * deg_to_rad), 0, Mathf.Sin(acc_HP_ANGLE * deg_to_rad));
Vector3 vRight_H_Trans = transform.InverseTransformDirection(vRight_H);
//Vector3 v_Helix_Origin = vHelix_Origin_Trans - vRight_H_Trans * helix_Radius;
float dTrans_Right = Vector3.Dot(vRight_H, vRight_H_Trans);
Vector3 vCross = Vector3.Cross(vRight_H, vRight_H_Trans).normalized;
Vector3 vCross_Trans = transform.TransformDirection(vCross);
Vector3 vOrbit_Center = vHelix_Origin_Trans - vRight_H_Trans * helix_Radius;
go = aux_Helical_Extensions[i];
Quaternion q = transform.parent.localRotation;
if (!float.IsNaN(q.x) && !float.IsNaN(q.y) && !float.IsNaN(q.z) && !float.IsNaN(q.w))
{
go.transform.localRotation = transform.parent.localRotation;
go.transform.localRotation *= Quaternion.AngleAxis(dTrans_Right, vCross);
go.transform.localRotation *= Quaternion.AngleAxis(-acc_HP_ANGLE + tweek_Rota, vUP_trans);
//go.transform.localRotation *= Quaternion.AngleAxis(-acc_HP_ANGLE + tweek_Rota, vUP_trans);
Vector3 vlp = vUP_trans * accDIST + vOrbit_Center;
if (!float.IsNaN(vlp.x) && !float.IsNaN(vlp.y) && !float.IsNaN(vlp.z))
{
go.transform.localPosition = vUP_trans * accDIST + vOrbit_Center;
ext_AMD_Handler = aux_Helical_Extensions[i].GetComponent<Extension_AMD_Handler>();
ext_AMD_Handler.Clear_AMD();
ext_AMD_Handler.Add(amd_Aux);
ext_AMD_Handler.To_Mesh_Internal();
}
}
acc_HP_ANGLE += delta_Theta_Helical;
accDIST += delta_Dist_Helical;
}
}
//if (bDraw_Aux)
//{
// List<Vector3> vLower_Out = new List<Vector3>();
// List<Vector3> vUpper_Out = new List<Vector3>();
// //List<Vector3> vUpper_In = new List<Vector3>();
// //List<Vector3> vLower_In = new List<Vector3>();
// Vector3 vBottom = accDIST * Vector3.up;
// Vector3 vTop = vBottom + remaining_dist * Vector3.up;
// Vector3 vRide = vBottom;
// float remaining_helical_Cycles = remaining_time / helical_Period;
// float oc_to_hc = helical_Period / myOrbit.OP;
// float helical_slices = remaining_helical_Cycles * 36; // 36 cylinders around one circle of Helix
// float oc_per_slice = oc_to_hc / 36;
// float uv_Adjust;
// if (oc_per_slice > 256) uv_Adjust = 1;
// else uv_Adjust = oc_per_slice / 256;
// print("orbital rings per slice = " + oc_per_slice.ToString());
// float sliceDistance = (remaining_dist / helical_slices);
// float delt_AUX_HP_ANGLE = 10f;
// Vector3 vDeltaRide = sliceDistance * Vector3.up;
// print("Helical Slices = " + helical_slices.ToString());
// if (helical_slices > 360) helical_slices = 360;//10 cycles
// for (int i = 0; i < helical_slices; i++)
// {
// vLower_Out.Clear();
// vUpper_Out.Clear();
// Vector3 vRight_H0 = new Vector3(Mathf.Cos(acc_HP_ANGLE * deg_to_rad), 0, Mathf.Sin(acc_HP_ANGLE * deg_to_rad));
// Vector3 vRight_H1 = new Vector3(Mathf.Cos((acc_HP_ANGLE + delt_AUX_HP_ANGLE) * deg_to_rad),
// 0, Mathf.Sin((acc_HP_ANGLE + delt_AUX_HP_ANGLE) * deg_to_rad));
// //Vector3 vForward_O = new Vector3(-Mathf.Sin(acc_OP_ANGLE * deg_to_rad), 0, Mathf.Cos(acc_OP_ANGLE * deg_to_rad));
// Vector3 vOrbit_Org = helical_Radius * vRight_H0;
// Vector3 vLowerRing_Center = vRide + vOrbit_Org;
// Vector3 vOrbit_Org_Next = helical_Radius * vRight_H1;
// Vector3 vUpperRing_Center = vRide + vDeltaRide + vOrbit_Org_Next;
// Vector3 vForward_O;
// Vector3 vPointPos_Low;
// Vector3 vPointPos_High;
// for (int k = 0; k < 36; k++)
// {
// float arg = k * 10 * deg_to_rad;
// vForward_O = new Vector3(-Mathf.Sin(arg), 0, Mathf.Cos(arg));
// vPointPos_Low = vLowerRing_Center + vForward_O * (myOrbit.transform.localPosition.x
// + w_by_2);
// vLower_Out.Add(vPointPos_Low);
// vPointPos_High = vUpperRing_Center + vForward_O * (myOrbit.transform.localPosition.x + w_by_2);
// vUpper_Out.Add(vPointPos_High);
// }
// if (helical_slices > 0)
// {
// ext_AMD_Handler.Add(MeshDraft.Band_V_adj(vLower_Out, vUpper_Out, uv_Adjust));
// ext_AMD_Handler.Add(MeshDraft.Band_V_adj(vUpper_Out, vLower_Out, uv_Adjust));
// }
// //vPos = myOrbit.ParametricOrbit(myOrbit.ThetaInt(accANGLE)) * solar_System_Base.scale_Solar_System_0_to_5;
// vRide += vDeltaRide;
// acc_HP_ANGLE += delt_AUX_HP_ANGLE;
// }
// ext_AMD_Handler.To_Mesh_Internal();
//}
public void Hide_Helix()
{
GetComponent<MeshRenderer>().enabled = false;
MeshRenderer[] mr = GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer MR in mr)
{
MR.enabled = false;
}
}
public void setColor(Color c)
{
GetComponent<Renderer>().material.SetColor("_TintColor", c);
}
void Update()
{
}
}
Planet Data / Manager
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlanetManager : MonoBehaviour
{
private static PlanetManager _instance; //much better with singletons
public static PlanetManager instance {
get {
if (_instance == null) //This will only happen the first time this reference is used.
_instance = GameObject.FindObjectOfType<PlanetManager> ();
return _instance;
}
}
public PlanetaryOrbit mercury;
public PlanetaryOrbit venus;
public PlanetaryOrbit earth;
public PlanetaryOrbit mars;
public PlanetaryOrbit jupiter;
public PlanetaryOrbit saturn;
public PlanetaryOrbit uranus;
public PlanetaryOrbit neptune;
public PlanetaryOrbit pluto;
public Orbit_VU[] orbit_VUs;
public GameObject[] teleporters = new GameObject[10];
private HMD_Ctrl_Tracking hmd_Ctrl_tracking;
private const string meshChildPrefix = "Mesh";
private static string[] planetNames = {
"Mercury",
"Venus",
"Earth",
"Mars",
"Jupiter",
"Saturn",
"Uranus",
"Neptune",
"Pluto"
};
private static string[] planetMaterials = {
"Materials/MercuryMaterial",
"Materials/VenusMaterial",
"Materials/EarthMaterial",
"Materials/MarsMaterial",
"Materials/JupiterMaterial",
"Materials/SaturnMaterial",
"Materials/UranusMaterial",
"NeptuneMaterial"
};
private static string[] moonNames = { "Moon" };
private static string[] moonParentNames = { "Earth" };
private static string[] moonMaterials = { "Materials/MoonMaterial" };
private GameObject rings;
private float[][] planetParameters = new float[planetNames.Length][];
private float[][] moonParameters = new float[moonNames.Length][];
public enum USER_EXPLORE_ZONE
{
INNER,
MID,
OUTER,
}
public class Planet_EXPLORE_Params
{
public USER_EXPLORE_ZONE zoom_Zone;
public float rMin;
public float rMax;
public float rTeleEnd;
public Vector3 vTeleRel_Pos; //Relative to Planet Transform
}
public Planet_EXPLORE_Params[] teleport_Params = new Planet_EXPLORE_Params[10];
void Awake ()
{
_instance = this;
float scale_VU = Scales.au_2_VU;
//eccentricity, r_pericenter, orbital period, radius, axial tilt, rot period, longitude of ascending node, INCLINATION
const int numOfPlanetParams = 8;
//Mercury
planetParameters [0] = new float[numOfPlanetParams] {
0.2056f, //eccentricity
0.3075f * scale_VU, //r_pericenter
0.241f, //orbital period
0.38f, //radius
0.01f, //axial tilt
-0.16f, //rot period
48.3f, //longitude of ascending node
7.005f //INCLINATION
};
teleport_Params[0] = new Planet_EXPLORE_Params();
teleport_Params[0].rMin = 0.321f;
teleport_Params[0].rMax = 12.575f;
teleport_Params[0].rTeleEnd = 1.661f;
teleport_Params[0].vTeleRel_Pos = new Vector3(1.039f, -0.580f, -1.087f);
teleport_Params[0].zoom_Zone = USER_EXPLORE_ZONE.INNER;
//Venus
planetParameters [1] = new float[numOfPlanetParams] {
0.0067f, //eccentricity
0.718f * scale_VU, //r_pericenter
0.615f, //orbital period
0.95f, //radius
177.4f, //axial tilt
-0.67f , //rot period
76.7f, //longitude of ascending node
3.3947f //INCLINATION
};
teleport_Params[1] = new Planet_EXPLORE_Params();
teleport_Params[1].rMin = 0.611f;
teleport_Params[1].rMax = 19.343f;
teleport_Params[1].rTeleEnd = 1.290f;
teleport_Params[1].vTeleRel_Pos = new Vector3(1.002f, -0.542f, -0.635f);
teleport_Params[1].zoom_Zone = USER_EXPLORE_ZONE.INNER;
//Earth
planetParameters [2] = new float[numOfPlanetParams] {
0.0167f, //eccentricity
0.9833f * scale_VU, //r_pericenter
1f, //orbital period
1f, //radius
23.45f, //axial tilt
-0.0027f, //rot period
349f, //longitude of ascending node
0 //INCLINATION
};
teleport_Params[2] = new Planet_EXPLORE_Params();
teleport_Params[2].rMin = 0.631f;
teleport_Params[2].rMax = 23.326f;
teleport_Params[2].rTeleEnd = 1.641f;
teleport_Params[2].vTeleRel_Pos = new Vector3(0.890f, -1.281f, -0.509f);
teleport_Params[2].zoom_Zone = USER_EXPLORE_ZONE.INNER;
//Mars
planetParameters [3] = new float[numOfPlanetParams] {
0.0934f, //eccentricity
1.3814f * scale_VU, //r_pericenter
1.882f, //orbital period
0.53f, //radius
25.19f, //axial tilt
-0.0029f, //rot period
49.6f, //longitude of ascending node
1.851f //INCLINATION
};
teleport_Params[3] = new Planet_EXPLORE_Params();
teleport_Params[3].rMin = 0.424f;
teleport_Params[3].rMax = 16.071f;
teleport_Params[3].rTeleEnd = 1.026f;
teleport_Params[3].vTeleRel_Pos = new Vector3(0.406f, -0.858f, -0.371f);
teleport_Params[3].zoom_Zone = USER_EXPLORE_ZONE.INNER;
//Jupiter
planetParameters [4] = new float[numOfPlanetParams] {
0.0488f, //eccentricity
4.950f * scale_VU, //r_pericenter
11.86f , //orbital period
11f, //radius
3.13f, //axial tilt
-0.0011f , //rot period
101f, //longitude of ascending node
1.305f //INCLINATION
};
teleport_Params[4] = new Planet_EXPLORE_Params();
teleport_Params[4].rMin = 3.878f;
teleport_Params[4].rMax = 43.822f;
teleport_Params[4].rTeleEnd = 7.290f;
teleport_Params[4].vTeleRel_Pos = new Vector3(0.708f, 2.126f, -6.915f);
teleport_Params[4].zoom_Zone = USER_EXPLORE_ZONE.MID;
//Saturn
planetParameters [5] = new float[numOfPlanetParams] {
0.0542f, //eccentricity
9.021f * scale_VU, //r_pericenter
29.457f , //orbital period
9.14f, //radius
26.73f, //axial tilt
-0.0012f, //rot period
114f, //longitude of ascending node
2.484f //INCLINATION
};
teleport_Params[5] = new Planet_EXPLORE_Params();
teleport_Params[5].rMin = 3.411f;
teleport_Params[5].rMax = 47.274f;
teleport_Params[5].rTeleEnd = 9.222f;
teleport_Params[5].vTeleRel_Pos = new Vector3(3.980f, 0.852f, -8.241f);
teleport_Params[5].zoom_Zone = USER_EXPLORE_ZONE.MID;
//Uranus
planetParameters [6] = new float[numOfPlanetParams] {
0.0472f, //eccentricity
18.286f * scale_VU, //r_pericenter
84.016f , //orbital period
4f, //radius
97.77f, //axial tilt
0.0019f, //rot period
74.2f, //longitude of ascending node
0.770f //INCLINATION
};
teleport_Params[6] = new Planet_EXPLORE_Params();
teleport_Params[6].rMin = 0.699f;
teleport_Params[6].rMax = 19.871f;
teleport_Params[6].rTeleEnd = 1.203f;
teleport_Params[6].vTeleRel_Pos = new Vector3(0.106f, -0.875f, -0.807f);
teleport_Params[6].zoom_Zone = USER_EXPLORE_ZONE.OUTER;
//Neptune
planetParameters [7] = new float[numOfPlanetParams] {
0.0086f, //eccentricity
29.81f * scale_VU, //r_pericenter
164.791f, //orbital period
3.9f, //radius
28.32f, //axial tilt
-0.0018f, //rot period
131f, //longitude of ascending node
1.679f //INCLINATION
};
teleport_Params[7] = new Planet_EXPLORE_Params();
teleport_Params[7].rMin = 0.582f;
teleport_Params[7].rMax = 19.772f;
teleport_Params[7].rTeleEnd = 1.930f;
teleport_Params[7].vTeleRel_Pos = new Vector3(-0.185f, -0.445f, -1.858f);
teleport_Params[7].zoom_Zone = USER_EXPLORE_ZONE.OUTER;
//Pluto
planetParameters[8] = new float[numOfPlanetParams] {
0.2488f, //eccentricity
29.659f * scale_VU, //r_pericenter
247.68f, //orbital period
3.9f, //radius
122.53f, //axial tilt
-0.0018f, //rot period
110.303f, //longitude of ascending node
17.142f //INCLINATION
};
teleport_Params[8] = new Planet_EXPLORE_Params();
teleport_Params[8].rMin = 0.135f;
teleport_Params[8].rMax = 4.334f;
teleport_Params[8].rTeleEnd = 1.140f;
teleport_Params[8].vTeleRel_Pos = new Vector3(-0.745f, -0.858f, -0.012f);
teleport_Params[8].zoom_Zone = USER_EXPLORE_ZONE.OUTER;
//THE MOON !
const int numOfMoonParams = 8;
moonParameters [0] = new float[numOfMoonParams] {
0.055f,
2.44f,
0.074f,
0.273f,
6.69f,
-29 / 365f,
0.0f,
0.012f
};
orbit_VUs[0].Set_Orbit(mercury);
mercury.Par = planetParameters[0];
mercury.planet_Name = planetNames[0];
orbit_VUs[1].Set_Orbit(venus);
venus.Par = planetParameters[1];
venus.planet_Name = planetNames[1];
orbit_VUs[2].Set_Orbit(earth);
earth.Par = planetParameters[2];
earth.planet_Name = planetNames[2];
orbit_VUs[3].Set_Orbit(mars);
mars.Par = planetParameters[3];
mars.planet_Name = planetNames[3];
orbit_VUs[4].Set_Orbit(jupiter);
jupiter.Par = planetParameters[4];
jupiter.planet_Name = planetNames[4];
orbit_VUs[5].Set_Orbit(saturn);
saturn.Par = planetParameters[5];
saturn.planet_Name = planetNames[5];
orbit_VUs[6].Set_Orbit(uranus);
uranus.Par = planetParameters[6];
uranus.planet_Name = planetNames[6];
orbit_VUs[7].Set_Orbit(neptune);
neptune.Par = planetParameters[7];
neptune.planet_Name = planetNames[7];
orbit_VUs[8].Set_Orbit(pluto);
pluto.Par = planetParameters[8];
pluto.planet_Name = planetNames[8];
}
public void Init_PlanetManager()
{
mercury.Init(1);
venus.Init(2);
earth.Init(3);
mars.Init(4);
jupiter.Init(5);
saturn.Init(6);
uranus.Init(7);
neptune.Init(8);
pluto.Init(9);
hmd_Ctrl_tracking = HMD_Ctrl_Tracking.Instance;
for(int i = 0; i<9; i++)
{
teleporters[i] = hmd_Ctrl_tracking.ptp_GOs[i+1];
}
}
}