Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Orbital Mechanics URGENT Help Needed

Discussion in 'Physics' started by BlackMoss, Sep 16, 2018.

  1. BlackMoss

    BlackMoss

    Joined:
    Mar 26, 2017
    Posts:
    5
    Hello

    I have been working on this project for a long time and now I am doing this part where it predicts the orbit of a rocket which you can control and apply thrust to in any direction. I am using the trajectory equation to this and it mostly works. Here's my code. If you know about this stuff you should be able to see what I am doing and hopefully what I am doing wrong as well.

    It can predict the orbit if I don-t apply any thrust to the ship and just leave it with it's initial velocity but when I apply thrust it gets really weird and shows orbits which the ship isn't even on. This is really important as I have to give this in along with a dissertation soon, and I just can't figure this out. I don't know who to ask except for you...

    This is the equation I am using, see https://en.wikipedia.org/wiki/Orbital_mechanics for more info.

    This is what it looks like with it's initial velocity, this orbit matches the actual movement of the ship:


    But then this is what it looks like when I have applied thrust in the retrograde direction:


    Another problem is that the in theory constant vector A is not actually constant, it seems to change as time passes.

    I anyone thinks they can help, please ask questions if you need more details.

    Thank you.

    This is the script attached to the ship.
    Code (CSharp):
    1. public class Ship2 : MonoBehaviour {
    2.  
    3.     public Vector3 initialVelocity;
    4.     public float lineQuality;
    5.     public float thrust = 1.0f;
    6.  
    7.     List<Vector3> points = new List<Vector3>();
    8.     Vector3[] pointsArray = null;
    9.  
    10.  
    11.     LineRenderer trajectoryLine;
    12.     Rigidbody rb;
    13.     GameObject planet;
    14.  
    15.     Vector3 vecv;
    16.     Vector3 vecr;
    17.     Vector3 vech;
    18.     Vector3 veca;
    19.     Vector3 vece;
    20.     float r;
    21.  
    22.     [SerializeField]
    23.     float e;
    24.  
    25.     double mu;
    26.     double G;
    27.  
    28.     Vector3 currentPoint;
    29.  
    30.     float angle = 0f;
    31.     float endAngle;
    32.  
    33.     private void Start()
    34.     {
    35.         trajectoryLine = GetComponent<LineRenderer> ();
    36.         trajectoryLine.startWidth = 1.0f;
    37.         trajectoryLine.endWidth = 1.0f;
    38.  
    39.         rb = GetComponent<Rigidbody>();
    40.         planet = GameObject.FindGameObjectWithTag("Attractor");
    41.  
    42.         rb.velocity = initialVelocity / 100000;
    43.  
    44.         G = planet.GetComponent<Planet>().gconst;
    45.         mu = planet.GetComponent<Planet>().mass * G;
    46.  
    47.         //CalculateR();
    48.  
    49.         angle = 0f;
    50.  
    51.     }
    52.  
    53.     private void Update()
    54.     {
    55.         vecv = transform.position + rb.velocity * 100000;
    56.         vecr = (transform.position - planet.transform.position) * 100000;
    57.         vech = transform.position +  Vector3.Cross(vecr, vecv);
    58.         veca = /*transform.position + */ Vector3.Cross(vecv, vech) - (float)mu * vecr.normalized; ///THE PROBOLEM IS HERE, THE A VECTOR SUDDENLY SHIFTs
    59.  
    60.         Debug.DrawLine(Vector3.zero, vecr, Color.white);
    61.         Debug.DrawLine(transform.position, vech, Color.blue);
    62.         Debug.DrawLine(transform.position, vecv, Color.red);
    63.         Debug.DrawLine(Vector3.zero /*transform.position*/, veca, Color.yellow);
    64.  
    65.         e = veca.magnitude / (float)mu;
    66.  
    67.         //Force Recalculate trajectory
    68.         if (Input.GetKeyDown(KeyCode.Return))
    69.             CalculateR();
    70.  
    71.         //Aplicar força a la nau
    72.         if (Input.GetKey(KeyCode.Space))
    73.             ApplyThrust();
    74.  
    75.         if (Input.GetKeyDown(KeyCode.W))
    76.             rb.velocity *= 1.1f;
    77.         if (Input.GetKeyDown(KeyCode.S))
    78.             rb.velocity *= 0.9f;
    79.     }
    80.  
    81.     void CalculateR ()
    82.     {
    83.         angle = Mathf.Atan2(veca.x, veca.z) * Mathf.Rad2Deg;
    84.         endAngle = angle + 360f;
    85.         Debug.Log("Calculating...");
    86.         while (angle <= endAngle)
    87.         {
    88.             r = (vech.sqrMagnitude) / (veca.magnitude * Mathf.Cos(angle * Mathf.Deg2Rad) + (float)mu) / 100000;
    89.  
    90.             //Debug.Log(currentPoint.magnitude);
    91.             currentPoint.x = Mathf.Cos(angle * Mathf.Deg2Rad);
    92.             currentPoint.z = Mathf.Sin(angle * Mathf.Deg2Rad);
    93.             currentPoint.y = 0f;
    94.  
    95.             currentPoint = currentPoint.normalized * r;
    96.             Debug.DrawLine(Vector3.zero,currentPoint, Color.cyan);
    97.  
    98.             //Debug.Log(r);
    99.             points.Add(currentPoint);
    100.             angle += 1.0f;      
    101.         }
    102.         DrawLine();
    103.         points.Clear();
    104.     }
    105.  
    106.     public void DrawLine()
    107.     {
    108.         trajectoryLine.positionCount = 361 /*/ (int)lineQuality*/;
    109.         foreach (Vector3 point in points)
    110.         {
    111.             trajectoryLine.SetPosition(points.IndexOf(point), point);
    112.         }
    113.         Debug.Log("Done");
    114.     }
    115.  
    116.     void ApplyThrust ()
    117.     {
    118.         rb.AddForce(transform.up * thrust, ForceMode.Impulse);
    119.         Debug.Log("Thrust applied");
    120.  
    121.         // Un cop s-ha aplicat la força, s'haurà de recalcular la trajectòria.
    122.         CalculateR();
    123.     }
    124. }

    And this is attached to the planet:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. public class Planet : MonoBehaviour
    6. {
    7.     public double gconst = 0.000000000067408; // Gravitational constant adapted proportionally to distances and scale (normal value = 6.674*10^-11 = 0.0000000000674)
    8.     public double mass;
    9.  
    10.     GameObject ship;
    11.     Vector3 force;
    12.     Vector3 direction;
    13.     float sqrDistance;
    14.     [SerializeField]
    15.     float time;
    16.     Vector3 earthRotation;
    17.     LineRenderer trajectoryLine;
    18.  
    19.     private void Start()
    20.     {
    21.         ship = GameObject.FindGameObjectWithTag("Ship");
    22.  
    23.         earthRotation = new Vector3(0f, -0.004178f, 0f);
    24.  
    25.         trajectoryLine = GetComponent<LineRenderer>();
    26.     }
    27.  
    28.     void FixedUpdate()
    29.     {
    30.         if(ship != null)
    31.             Attract(ship);
    32.         Rotate();
    33.         time += Time.deltaTime;
    34.         //Debug.Log(time);
    35.     }
    36.  
    37.  
    38.  
    39.     void Attract(GameObject bodyToAttract)
    40.     {
    41.         Rigidbody rbToAttract = bodyToAttract.GetComponent<Rigidbody>();
    42.  
    43.         direction = (transform.position - rbToAttract.position) * 100000;
    44.         sqrDistance = direction.sqrMagnitude;
    45.  
    46.         //Debug.Log(distance);
    47.  
    48.         if (sqrDistance == 0)
    49.             return;
    50.  
    51.         double forceMagnitude = gconst * (mass / sqrDistance);
    52.  
    53.         //Debug.Log(forceMagnitude);
    54.  
    55.         force = direction.normalized * (float)forceMagnitude / 100000;
    56.         rbToAttract.AddForce(force, ForceMode.Force);
    57.     }
    58.  
    59.     void Rotate()
    60.     {
    61.         transform.Rotate(earthRotation * Time.deltaTime);
    62.     }
    63. }
    64.  
     
    Last edited: Sep 17, 2018
  2. Antypodish

    Antypodish

    Joined:
    Apr 29, 2014
    Posts:
    10,753
    Anything urgent affecting your personal life, should be really thought before hand.
    If you doing academic stuff, that I would really consider 3D space, for best results.

    Possibly you taking into calculations wrong axis, or direction.
    Check also time steps, when calculating predicted path.
     
  3. florinel2102

    florinel2102

    Joined:
    May 21, 2019
    Posts:
    76
    Did you find the issue ?
     
  4. BlackMoss

    BlackMoss

    Joined:
    Mar 26, 2017
    Posts:
    5
    Hi there, it feel like forever ago that I was working on this. I did fix the issue, and iirc it was something simpler than I thought, I think I had to flip the orbit somehow. If you look at the images I originally sent, when the apogee of the orbit flips and becomes the perigee due to applying a force on the rocket in the opposite direction to travel, its as if the orbit prediction flips as well and shows the path as if the rocket was now on the other side of the planet. However I'm not exactly sure how I fixed the issue. Are you struggling with a similar problem?
     
  5. florinel2102

    florinel2102

    Joined:
    May 21, 2019
    Posts:
    76
    Yes .