Well, there are mutliple ways you could do this, one would be using properties which have already been implemented by Roblox such as AssemblyLinearVelocity (mentioned above), this method doesn’t really require much knowledge of maths/physics but, it can be a bit buggy/glitchy if not implemented correctly (I’ve played games which use properties which have already been implemented by Roblox and, they’re surprisingly smooth).
Another way would be to use TweenService, this will allow you to have really smooth animations but, you’re limited to the ball moving in one direction (as far as I know);
alternatively, you could manually interpolate the ball along a predetermined path by using kinematic equations (and possibly bezier curves but, you could still do this without the use of bezier curves), this in my opinion, will require the most knowledge and some problem solving skills but, the outcome will most likely be much better than all the methods stated above.
Since the ball can be stopped by a player, you could raycast to check if someone is in the way of the ball, if someone is in the way, you can have to bounce off the player or, the player could yield the ball, since bezier curves aren’t needed, you could use a module known as Fast Cast; while you won’t be making weapons, the concept is pretty similar.
Note: These probably aren’t all the possible ways to achieve your goal, these are just some possible solutions.