Angular velocity not being transferred to velocity.

I have a small sphere collider (which spins ) and a large mesh collider. Both with friction of 1.

The ball moves quite fast so it will tunnel if I use discrete collision.

If I use any of the continuous detection modes, the ball will bounce. However the angular velocity doesn’t reliably transfer to velocity.

If I use discrete collision (with a box collider so tunnelling isn’t a problem) then I see roughly what I would expect. The ball bounces and some of the spin is transferred to the motion of the ball, and the ball will move sideways on the bounce return. (Although this doesn’t seem to be very accurate. Sometimes the ball goes in the opposite direction I would expect)

However, if I use continuous detection, the ball will bounce a few times straight up to its starting position and then on the third bounce it will transfer some spin to velocity.

All of these problems go away if I make the ball bigger, but I can’t really do that for this game.

Does anyone know of any strategy to solve this? (I’m currently blindly changing the physics settings in project settings, but not getting very far)

Reducing the fixed timestep seems to fix these issues.

Although this did fix the issue I’m a bit concerned that this solution might cause other problems down the road.
Does anyone have any idea what’s going on with the problem?
I’m particularly confused by the fact that the collision causes a bounce but doesn’t transfer angular energy to velocity (unless the timestep is very low).
If it detects the collision successfully, (which it seems to because it bounces), then why doesn’t it transfer energy, surely it should be done in the same collision event?

Is this the same issue as discussed here: Angular velocity doesn't affect a bouncing ball. - Unity Engine - Unity Discussions ?

I did not see any further follow up to it, but it may be worth contacting @JeffDUnity3D and seeing if there was any further development on this. It could also be worth checking if you have the same problem using an unscaled mesh collider as collider scaling was significant in that case.

Thanks for your reply.
So I tried the things in that thread.
I imported a ball/mesh from Maya that was build at the correct scale so I wouldn’t have to scale the transform. But that didn’t seem to improve things.
I also tried making the object kinematic, setting the angular velocity then setting the object non kinematic, but that didn’t seem to have any effect either.

The only thing that seems to give accurate results is to set the fixed timestep to 0.006 or lower. Which feels low.

That time step sounds awful :frowning: although it might be the least painful option if you are relatively light on physics elsewhere. Other than spending about 3 times as much time as you would hope on physics, I wouldn’t expect any other problems.

The only other thing I can suggest is that you cheat and code your own additional forces based on the ball angular velocity and add them from the collision event. This won’t be simple as you will need to track what the angular velocity was before the collision and compensate for any incorrect changes that result from that. And internal corner collisions are going to get awkward…

When you did the kinematic switch, did you wait for a complete physics cycle before you turned it off again? I see the last poster in the thread I linked to was doing it all in one cycle, which probably does not do anything. I believe that if the original poster found that to be a solution they probably switched it, set it, switched it in 3 separate cycles.

If you can make a simple reproducer, I suggest you log a bug report and, if you don’t mind, add the reference to this thread and the other one.