Actually i have done it in c++, but in bp it would be the same. For a vector there is a function ‘MirrorByVector’-in “On hit event” just mirror your velocity by impact normal and it will work just fine.
like:
void ABallActor::OnHit(AActor* SelfActor, AActor* OtherActor, FVector >
NormalImpulse, const FHitResult& Hit )
{
Velocity=Velocity.MirrorByVector(Hit.Normal);
}
(dayum, dat formatting but it should be clear anyway)
In general, that function uses a simple formula involving dot product-given the surface normal it ‘bounces’ a vector off the surface(quite as shown in the picture in the first post here)