Look for QMATRIX; and I think it was Doctor ShadowBorg had a small mod called 'the red pill' on show at Inside3D ages ago but I'm not sure if anything was released. Also there's Downsider's Cobalt runner that had a few videos but I haven't been to I3D in a while so i don't know its situation.
cobalt runner looks like the best of the three, but is discontinued. Shame really.
it can be done fairly easily by using DotProducts instead of directly reading z values.
assuming gravitydir is normalized, this equation should suffice:
directionz == -dotproduct(gravitydir, direction)
of course you also have to add/subtract multiples of that to cancel out the z directions etc as required.
reorienting the view is actually more tricky, as you'll want the view to rotate around the gravity direction instead of the world-z axis. that can be done easily enough by transforming the current angles by the inverse-surface-matrix, applying the angle changes, then multiplying by the forwards-surface-matrix.
the biggest issue is that you need proper poly-sphere collisions instead of pure-bsp collisions with pre-expanded size.
which has both story ramifications, as well as depending upon something like q2/q3 bsp instead of q1bsp.
Why would the collision need to change? At first blush, it seems like the same "point inside the clipping hull" checks would work. It's just that the point in question is moving in an arbitrary direction instead of always down the Z axis.
The clipping hull design creates a player which is an axis-aligned cuboid. Currently this means that the bottom surface of the player bounding box faces the direction of gravity. Once you take an arbitrary direction losing this might have impact on stability and ease of navigation.
Oh, right, true ... the player isn't a sphere, and it takes that non-spherical shape into account when expanding the clipping hulls, right? Hmm ...