Football throwing system (CFrame)

Okay so i have this american football system but the problem is the ball is supposed to be facing its velocity and i tried doing it by getting the middle point between the player and the ball’s starting point and using CFrame.lookAt, but its every clunky and sometimes it just doesnt even rotate.

(I am using a bezier tween to move the ball)

game:GetService("RunService").Stepped:Connect(function()
	if inAir == false then return end
	local cf = CFrame.lookAt(workspace.Court2:FindFirstChild("Football").CFrame.Position,middlePoint.Position).XVector
	currentBall.CFrame = cf
end)

Is the football being moved by a CFrame or physics?

it is being moved by CFrame

local bezier = require(game.ReplicatedStorage.BezierTweens)
local ball = game.ServerStorage.Football
local Waypoints = bezier.Waypoints
local currentBall = nil
local inAir = false
local middlePoint = nil

game.ReplicatedStorage.Throw.OnServerEvent:Connect(function(player,timevar,style)
    if workspace.Court2:FindFirstChild("Football") then workspace.Court2:FindFirstChild("Football"):Destroy() end
    inAir = true
    local newball = ball:Clone()
    newball.Parent = workspace.Court2
    currentBall = newball
    
    local middlepoint = newball.CFrame:Lerp(player.Character:WaitForChild("HumanoidRootPart").CFrame,0.5)
    middlePoint = middlepoint
    
    local P0, P1, P2 = newball.CFrame.Position,middlepoint.Position+Vector3.new(0,40,0),player.Character:WaitForChild("HumanoidRootPart").Position  + player.Character:WaitForChild("HumanoidRootPart").AssemblyLinearVelocity * (timevar/1.5 + 1.5)
    local waypoints = Waypoints.new(P0,P1,P2)
    
    local tween = bezier.Create(newball,{
    Waypoints = waypoints,
    EasingStyle = style,
    EasingDirection = Enum.EasingDirection.Out,
    Time = timevar
    })
    
    newball.Anchored = true
    tween:Play()
    tween.Completed:Connect(function()newball.Anchored = false end)
    task.wait(timevar - 0.2)
    inAir = false 
end)

game:GetService("RunService").Stepped:Connect(function()
    if inAir == false then return end
    --local angle = math.atan2()
    
    currentBall.CFrame = CFrame.Angles(CFrame.lookAt(currentBall.CFrame.Position,middlePoint.Position),0,0)
    --print(CFrame.lookAt(currentBall.CFrame.Position,middlePoint.Position).Rotation)
end)