yet ANOTHER way would be to reference the polygons normal the ball is sitting on at the time, and use its direction as the up vector. Move_and_slide uses an up vector in its 2nd argument...
move_and_slide ( Vector3 linear_velocity, Vector3 up_direction=Vector3( 0, 0, 0 ),.....
Not sure exactly how to get this working, but im trying to (need to, rather) do something similar.
I think it would then need to pass in the next polygon it hits as the new normal to reference from a collision detection.
If you figure it out, post your results for us all!