Hey all. This is a maths, physics and 2D question, probably a very basic one for those who know. I'm creating a top down golf game, in the vain of Mario Golf Advance Tour: I have a Vector2 called ballDirection which determines the direction the ball is going in. Thanks to a mathematician friend of a friend, who wrote the code for a bouncing ball in Matlab, I've got the trajectory code, not that I understand it. Now I need to apply this to a top down world. The direction works fine, but the speed of the ball travelling is not working as I thought it might. I thought that I would take it's 'UH' var and multiply that by the direction vector to get the distance and position each update, and then use the height of the arc to change the size of the sprite to simulate an arc. From my research online, I think I found out something about squaring some numbers, multiplying them and then finding the square root of that sum, but I'm not sure if I'm even looking at the right branch of mathematics. Could anyone take a look at this, or point me in the right direction for the Maths I need to learn? It'd be much appreciated. Code (CSharp): public class Golfball : ButtonActivated { public Transform golfingPosition; public GameObject arrow; [Header("Ball Physics")] [SerializeField] bool ballMoving; [SerializeField] float initialSpeed; [SerializeField] float theta; //initial angle [SerializeField] float groundCoefficient; //the amount of force carried through onto subsequent bounces [SerializeField] float friction; //the friction of the surface the ball is colliding with float gravity = -9.8f; //initial angle [SerializeField] float sh = 0; //initial distance [SerializeField] float sv = 0; //initial height [SerializeField] float uh = 0; //amount of speed going forward float uv = 0; //amount of speed going upwards Vector2 ballDirection; public void HitBall() { sh = 0; sv = 0; uh = Mathf.Pow(Mathf.Cos(theta), 2) * initialSpeed; uv = Mathf.Pow(Mathf.Sin(theta), 2) * initialSpeed; //the vector we're sending the ball on is the arrow.transform.rotation vector! ballDirection = arrow.transform.rotation * Vector2.right; ballMoving = true; } protected virtual void Update() { if (ballMoving) { VelocityCalculations(); } } private void VelocityCalculations() { sh = sh + (uh * (Time.deltaTime * travellingSpeed)); sv = sv + (uv * (Time.deltaTime * travellingSpeed)); uv = uv + (gravity * (Time.deltaTime * travellingSpeed)); //handle bouncing! if (sv <= 0) { ballMoving = false; /* commented out for now print("the ball travelled " + sh + "before bouncing"); sv = 0; uv = Mathf.Abs(uv) * groundCoefficient; uh = uh * friction; */ } MoveBall(); } private void MoveBall() { //my attempt to calculate the distance by direction of the ball... transform.position = new Vector2(transform.position.x + (sh * ballDirection.x), transform.position.y + (sh * ballDirection.y)); //will do calculations to change size of sprite here } }