失礼ながら、無駄に複雑にしすぎてるような気がするね。
基本的にボールの状態変数は、(x,y,z)、(vx,vy,vz)だけあればいい。
それと便宜的に(接地 or浮いている)フラグをつけてもいい。

初期値はそれぞれ、ボールの初期位置、速度は0、フラグは'接地'状態。

ボールのループごとの処理はこんな感じ。

  if(浮いている){
   垂直方向の重力加速度を速度に加算
   速度を位置に加算
   if(速度が下向きで垂直座標が地面より下){
     位置を地表に補正
     垂直方向の速度に -0.9とか反発係数を配慮した値を掛ける
     垂直速度が小さくなったら、'接地'状態とする
   }
  }else{
   水平方向の速度に0.99など転がり摩擦係数を意識した値を掛ける
  }
  水平方向の速度を水平位置に加算

蹴った瞬間、(vx,vy,vz)に初速度を与え、'浮いている'状態にするだけ。