Home > Software design >  Simulate Gravity & Orbit in Unity
Simulate Gravity & Orbit in Unity

Time:01-20

Hey and thanks for your help in advanced.

I've watched a few youtube videos on how to add Solar System and orbiting Gravity in Unity and ended up using the this for help for the solar system gravity part.

https://www.youtube.com/watch?v=Ouu3D_VHx9o&t=114s&ab_channel=Brackeys

But right after i decided to trying to make my planet orbit the sun i used this Wikipage for the math equation

But for some reason either my planets flies away of the sun start flying towards the planet. I've been looking around for 2 days and can't seem to make it work and tried diffrent type of possiblies.

Here is my code

public class Planets : MonoBehaviour
{
    const float G = 100F;

    public Rigidbody rb;

    public float CurrentV;

    private void FixedUpdate()
    {

        Planets[] attractors = FindObjectsOfType<Planets>();

        foreach (Planets AllPlanets in attractors)
        {
            if (AllPlanets != this)
            {
                Orbiting(AllPlanets, CurrentV);
                Attract(AllPlanets);
            }
        }

    }
    void Attract(Planets objToAttract)
    {
        Rigidbody RbTpAttract = objToAttract.rb;
        Vector3 direction = rb.position - RbTpAttract.position;
        float distance = direction.magnitude;
        float ForceMagnitude = G * (rb.mass * RbTpAttract.mass) / Mathf.Pow(distance, 2);
        Vector3 Force = direction.normalized * ForceMagnitude;
        RbTpAttract.AddForce(Force);

    }


    void Orbiting(Planets objToAttract, float CV)
    {
        Rigidbody RbTpAttract = objToAttract.rb;
        Vector3 direction = rb.position - RbTpAttract.position;
        float distance = direction.magnitude;
        float ForceMagnitude = Mathf.Sqrt((G * rb.mass) / (2 / distance - 1 / RbTpAttract.mass));
        Vector3 Force = direction.normalized * ForceMagnitude;
        RbTpAttract.velocity  = Force;
    }

 }

CodePudding user response:

The problem is that the formula for orbital speed is used to derive the speed of an object in orbit, but you're using it as a form of constant thrust applied to each body towards each other. That's a bit like calculating the speed of a moving car, and then applying the same speed back to it as an impulse!

The only force experienced by objects in orbit is the one you get from Newton's law G * m * m / r*r. In order to actually orbit though, the planets will need an initial velocity - this can be calculated from the orbital speed formula. Calculate it at the given distance, and apply it on Start() in a direction perpendicular to the orbital plane and the direction to the sun (or whatever you want to orbit), you can get this from dir = Vector3.Cross(sunDir, Vector3.up).normalized

Note that gravitational systems are not numerically stable in physics engines relying on euler integration (such as PhysX). You need things like Runge-Kutta integration for that, or the planets will eventually lose their orbit if you leave the simulation running for long enough.

  •  Tags:  
  • Related