Trading speed for realism is easy if you know exactly what to do, but it's not intuitive:
replace (in ./src/physics/physics.cpp)
m_dynamics_world->stepSimulation(dt, 3);
with:
m_dynamics_world->stepSimulation(dt, 3000000,0.002);
Explanation: The old one will simulate dt with a maximum of 3 sub-steps. It is natural to think that decreasing dt and calling this function many times in a for loop will make a more accurate simulation, but this DOES NOT WORK! Adding the third argument seems to force it to simulate a step every 0.002 seconds over a total time of dt and a maximum of 3000000 steps (the 300000 doesn't matter, any big number will work). Slightly larger numbers than 0.002 also work, which are less likely to slow down fps but are less "safe".
Exactly what does this fix? The tunneling problem. The normal fix of this problem, in cart.cpp described an implemented at line 1275, clamps the y-velocity. This is not elegant at all and makes long falls unrealistic.
This has been tested successfully on canyon with turning off linear damping for a free fall at high speed.