At long last, I have resolved all the remaining physics problems I was having with Unity 5! As I mentioned in my previous blog post, I had solutions that I was working on for most of these issues, but the one thing I wasn’t sure about was how to fix the joint velocity drives.
Configurable joint drives
One of the things that changed from PhysX 2.X and 3.X, is the way that joint drives are configured. They no longer have a mode flag to specify whether they are position or velocity drives. Instead, if you want a “position drive” you set the drive’s spring value to be non-zero, if you want a “velocity drive” you set its damping to be non-zero (and if you set both to non-zero the drive behaves as a damped spring).
The question is, what non-zero value to actually use? Nothing in the Unity or PhysX documentation seems to help much here. I use both position and velocity drives in the game, and I want them to be constrained only by the maximum force that the drive is set to use (in other words, fully “stiff” as if the spring or damping values were effectively infinite).
So I tried setting them to float.MaxValue, but this caused some odd behaviour. Drives configured to be “velocity drives” would not work if the rigidbody’s mass was below some threshold, and those configured as “position drives” would sometimes cause Unity to crash completely without any warning. In the end, after some experimentation, I simply used a smaller (but still very large) value for the spring / damping settings. This seems to work alright, although I’m somewhat concerned it could still fail in some unforeseen situations!
Simulation update rate
As I mentioned in the last post, swapping joint rigidbody ordering (i.e. owner vs. connected) helped a lot to improve simulation stability at high angular velocities. Unfortunately it was still not quite enough to get back to Unity 4 / PhysX 2.8 levels of stability. The simulation update rate also needed to be increased a bit (by reducing Time.fixedDeltaTime), at the expense of performance. So, as a compromise, I will be exposing a setting in the game to allow the sim update rate to be adjusted. Advanced users can change it based on the construction that they’re building, and how fast their computer is.
Last few bugs
With these issues taken care of, there’s now nothing to prevent the upgrade to Unity 5. I’m still working on migrating away from some deprecated APIs and fixing a few remaining (non physics related) bugs, once this is done I’ll be able to put out another demo release.